Skip to content

GyverLibs/GyverPWM

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

latest PIO Foo Foo Foo

Foo

GyverPWM

Библиотека для расширенной генерации ШИМ на ATmega328 (Arduino UNO/Nano/Pro Mini...)

  • Аппаратная генерация ШИМ настраиваемой частоты и разрядности

Совместимость

Arduino UNO/Nano/Pro Mini

Документация

К библиотеке есть расширенная документация

Содержание

Установка

  • Библиотеку можно найти по названию GyverPWM и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь

Обновление

  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

Инициализация

Нет

Использование

// ============== Функции для расширенной генерации ШИМ сигнала ==============
// Данные функции убирают один ШИМ выход у 8-ми битных таймеров, оставляя нам ШИМ пины D3, D5, D9 и D10 на ATmega328
void PWM_frequency(byte pin, long freq, modes correct);
/*  PWM_freqency(пин, частота, режим) - запустить ШИМ с выбранной частотой
 - Пины: D3 (таймер 2), D5 (таймер 0 - сломает millis/delay), D9 и D10 (таймер 1)
 - Режим: 0 (FAST_PWM), 1 (CORRECT_PWM)
 - Частота: 250-200'000 Гц для всех таймеров
 - Для изменения заполнения используй PWM_set
  - Разрядность в этом режиме приведена к 8 битам, на деле шаги изменения разные!
*/
void PWM_resolution(byte pin, byte res, modes correct);
/*  PWM_resolution(пин, разрядность, режим) - запустить ШИМ с выбранной разрядностью
 - Пины: D3 (таймер 2), D5 (таймер 0 - сломает millis/delay), D9 и D10 (таймер 1)
 - Режим: 0 (FAST_PWM), 1 (CORRECT_PWM)
 - Разрешение: D3 (4-8 бит), D5 (4-8 бит), D9 и D10 (4-16 бит)
 - Частота в этом режиме выбирается автоматически максимальная согласно возможностям таймера (см. таблицу)
 - Для изменения заполнения используй PWM_set
  - Пределы заполнения для разной разрядности указаны в таблице
*/
void PWM_set(byte pin, unsigned int duty);
/*  PWM_set(пин, заполнение) - изменить заполнение на выбранном пине
 - Пин: D3, D5, D6, D9, D10, D11
 - Заполнение: зависит от разрешения и режима (см. таблицу)
  - При использовании PWM_frequency разрядность составляет 8 бит (0-255)
  - При использовании PWM_resolution макс. значение заполнения равно (2^разрядность - 1), также смотри таблицу
*/
void PWM_detach(byte pin);    // отключает ШИМ на выбранном пине (позволяет использовать digital Read/Write)
void PWM_attach(byte pin);    // подключает ШИМ на выбранном пине (с последними настройками)
void PWM_default(byte pin);    // сброс настроек соответствующего пину таймера на "стандартные" для Arduino
void PWM_16KHZ_D3(byte duty);
/*   Запуск ШИМ с частотой 16 кГц на пине D3
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность приведена к 8 битам (заполнение 0-255)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_20KHZ_D3(byte duty);
/*   Запуск ШИМ с частотой 20 кГц на пине D3
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность приведена к 8 битам (заполнение 0-255)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_16KHZ_D5(byte duty);
/*   Запуск ШИМ с частотой 16 кГц на пине D5
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность приведена к 8 битам (заполнение 0-255)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_20KHZ_D5(byte duty);
/*   Запуск ШИМ с частотой 20 кГц на пине D5
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность приведена к 8 битам (заполнение 0-255)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_16KHZ_D9(int duty);
/*   Запуск ШИМ с частотой 16 кГц (15.6 кГц) на пине D9
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность ровно 10 бит (заполнение 0-1023)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_20KHZ_D9(int duty);
/*   Запуск ШИМ с частотой 20 кГц на пине D9
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность приведена к 10 битам (заполнение 0-1023)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_16KHZ_D10(int duty);
/*   Запуск ШИМ с частотой 16 кГц (15.6 кГц) на пине D10
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность ровно 10 бит (заполнение 0-1023)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
void PWM_20KHZ_D10(int duty);
/*   Запуск ШИМ с частотой 20 кГц на пине D10
 - Отменяет настройки PWM_frequency/PWM_resolution
 - Разрядность приведена к 10 битам (заполнение 0-1023)
 - Заполнение меняет сама (не нужно вызывать PWM_set) */
 
float PWM_square_D9(float frequency);
/*  Генератор меандра (квадратная волна) на пине D9
 Частота от 2 Гц до 8 Мгц, шаг частоты зависит от частоты
 (начиная с 0.01 Гц и заканчивая десятками кГц!!!)
 Отключить можно вызвав PWM_detach(9);
 Для сброса таймера в режим по-умолчанию - PWM_default(9);
 Возвращает установленную частоту в герцах!
 
 Частота    Погрешность
 300 Гц    0.01 Гц
 700 Гц    0.05 Гц
 900 ГЦ    0.1 Гц
 2 кГц    0.5 Гц
 3 кГц    1 Гц
 4 кГц    2 Гц
 9 кГц    10 Гц
 20 кГц    50 Гц
 30 кГц    110 Гц
 63 кГц    500 Гц
 90 кГц    1000 Гц
*/
/*
 ============= Таблица №1 частот для расширенной генерации ШИМ (PWM_resolution) =============
 _________________________________________________________________________________________________________________________
|Разрядность, бит   |4      |5      |6      |7      |8     |9       |10      |11     |12     |13     |14    |15    |16    |
|___________________|_______|_______|_______|_______|______|________|________|_______|_______|_______|______|______|______|
|Макс. значение duty|15     |31     |63     |127    |255   |511     |1023    |2047   |4095   |8191   |16383 |32767 |65535 |
|___________________|_______|_______|_______|_______|______|________|________|_______|_______|_______|______|______|______|
|Fast   | Пины 3, 5 |1 МГц  |516 кГц|254 кГц|126 кГц|63 кГц|-       |-       |-      |-      |-      |-     |-     |-     |
|PWM    | 9, 10     |1 МГц  |516 кГц|254 кГц|126 кГц|63 кГц|31.2 кГц|15.6 кГц|7.8 кГц|3.9 кГц|1.9 кГц|980 Гц|488 Гц|244 Гц|
|_______|___________|_______|_______|_______|_______|______|________|________|_______|_______|_______|______|______|______|
|Correct| Пины 3, 5 |571 кГц|266 кГц|129 кГц|63 кГц |32 кГц|-       |-       |-      |-      |-      |-     |-     |-     |
|PWM    | 9, 10     |571 кГц|266 кГц|129 кГц|63 кГц |32 кГц|15.7 кГц|7.8 кГц |3.9 кГц|1.9 кГц|976 Гц |488 Гц|244 Гц|122 Гц|
|_______|___________|_______|_______|_______|_______|______|________|________|_______|_______|_______|______|______|______|
*/
// ============ Функции для настройки стандартной генерации ШИМ сигнала (analogWrite) ============
// Данные функции НЕ убирают один ШИМ выход у 8-ми битных таймеров, можно использовать все 6 ШИМ пинов с настроенной частотой! См. таблицу.
void PWM_prescaler(byte pin, byte mode);
/*  PWM_prescaler(пин, режим) - установить предделитель таймера (меняет частоту ШИМ)
 - Пин: D3, D5, D6, D9, D10, D11
 - Режим: 1-7, см. таблицу частот
*/
void PWM_mode(byte pin, modes mode);
/*  PWM_mode(пин, режим) - установить режим генерации ШИМ
 - Пин: D3, D5, D6, D9, D10, D11
 - Режим: 0 - FastPWM, 1 - Phase-correct, см. таблицу частот
*/
void PWM_TMR1_8BIT();  // Установить таймер 1 (ШИМ на D9 и D10) в режим 8 бит. См. таблицу частот
void PWM_TMR1_10BIT();  // Установить таймер 1 (ШИМ на D9 и D10) в режим 10 бит. См. таблицу частот
/*
 ========== Таблица №2 частот для стандартной генерации ШИМ (PWM_prescaler) ==========
 
 Timer 0 по умолчанию работает в режиме Fast PWM 
 Timer 1 и 2 по умолчанию работают в режиме Phase-correct
 _______________________________________________________________________________________________
|       | Timer0 (пины 5 и 6) 8 bit | Timer 1 (пины 9 и 10) 10 bit  | Timer2 (пины 3 и 11) 8 bit|
|       | Timer1 (пины 9 и 10) 8 bit|                               |                           |
|       |___________________________|_______________________________|___________________________|
|mode   | Phase-correct | Fast PWM  | Phase-correct     | Fast PWM  | Phase-correct | Fast PWM  |
|_______|_______________|___________|___________________|___________|_______________|___________|
|1      | 31.4 kHz      | 62.5 kHz  | 7.8 kHz           | 15.6 kHz  | 31.4 kHz      | 62.5 kHz  |
|2      | 4 kHz         | 7.8 kHz   | 977 Hz            | 2 kHz     | 4 kHz         | 8 kHz     |
|3      | 490 Hz        | 976 Hz    | 122 Hz            | 244 Hz    | 980 Hz        | 2 kHz     |
|4      | 122 Hz        | 244 Hz    | 30 Hz             | 61 Hz     | 490 Hz        | 980 Hz    |
|5      | 30 Hz         | 61 Hz     | 7.6 Hz            | 15 Hz     | 245 Hz        | 490 Hz    |
|6      | -             | -         | -                 | -         | 122 Hz        | 244 Hz    |
|7      | -             | -         | -                 | -         | 30 Hz         | 60 Hz     |
|_______|_______________|___________|___________________|___________|_______________|___________|
*/

Пример

Остальные примеры смотри в examples!

#include <GyverPWM.h>

void setup() {
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);

  // Данные функции убирают один ШИМ выход у 8-ми битных таймеров, оставляя нам ШИМ пины D3, D5, D9 и D10 на ATmega328

  PWM_16KHZ_D3(30);   // ШИМ 16 кГц на пине D3, заполнение 30 из 255
  PWM_20KHZ_D5(50);   // ШИМ 20 кГц на пине D5, заполнение 50 из 255. Сломает millis() и delay()!
  PWM_16KHZ_D9(760);  // ШИМ 16 кГц на пине D9, заполнение 760 из 1023
  PWM_16KHZ_D10(800); // ШИМ 16 кГц на пине D10, заполнение 800 из 1023
  // пины 9 и 10 работают на одной частоте, запустить на разных не получится
}

void loop() {
}

Версии

  • v1.4
  • v1.5 - мелкие исправления и оптимизация
  • v1.6 - поддержка ATmega168

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Библиотека для расширенной генерации ШИМ на ATmega328 (Arduino UNO/Nano/Pro Mini...)

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors