Библиотека для расширенной генерации ШИМ на 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
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код