-
Notifications
You must be signed in to change notification settings - Fork 203
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
1,028 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
#ifndef GyverPWM_h | ||
#define GyverPWM_h | ||
#include <Arduino.h> | ||
|
||
#define CORRECT_PWM 1 | ||
#define FAST_PWM 0 | ||
|
||
/* | ||
Библиотека для расширенной генерации ШИМ на ATmega328 (Arduino UNO/Nano/Pro Mini...) | ||
Разработчики: Egor Zaharov и AlexGyver | ||
*/ | ||
|
||
// ============== Функции для расширенной генерации ШИМ сигнала ============== | ||
|
||
// Данные функции убирают один ШИМ выход у 8-ми битных таймеров, оставляя нам ШИМ пины D3, D5, D9 и D10 на ATmega328 | ||
|
||
void PWM_frequency(byte pin, long freq, boolean 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, boolean 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) */ | ||
/* | ||
============= Таблица №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, byte 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 | | ||
|_______|_______________|___________|___________________|___________|_______________|___________| | ||
*/ | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#include <GyverPWM.h> | ||
|
||
void setup() { | ||
pinMode(3, OUTPUT); | ||
pinMode(5, OUTPUT); | ||
pinMode(9, OUTPUT); | ||
pinMode(10, OUTPUT); | ||
|
||
// Данные функции НЕ УБИРАЮТ один ШИМ выход у 8-ми битных таймеров, оставляя нам ШИМ пины D3, D5, D9 и D10 на ATmega328 | ||
|
||
PWM_prescaler(3, 1); // установить частоту ШИМ на пине D3 равной 31.4 кГц (см. таблицу №2 в GyverPWM.h) | ||
// частота автоматически будет установлена для пина D11! | ||
|
||
PWM_prescaler(6, 2); // установить частоту ШИМ на пине D6 равной 7.8 кГц (см. таблицу №2 в GyverPWM.h) | ||
// частота автоматически будет установлена для пина D5! Также это сломает millis() и delay() | ||
|
||
PWM_prescaler(9, 1); // установить частоту ШИМ на пине D9 равной 7.8 кГц (см. таблицу №2 в GyverPWM.h) | ||
// частота автоматически будет установлена для пина D10! | ||
|
||
PWM_mode(9, 1); // установить режим работы таймера 1 в Fast PWM. Частота будет 15.6 кГц (см. таблицу №2 в GyverPWM.h) | ||
// режим автоматически будет установлен для пина D10! | ||
} | ||
|
||
void loop() { | ||
// можем пользоваться ШИМом на всех 6-ти пинах! | ||
analogWrite(3, 123); | ||
analogWrite(5, 241); | ||
analogWrite(6, 26); | ||
analogWrite(9, 98); | ||
analogWrite(10, 165); | ||
analogWrite(11, 152); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
#include <GyverPWM.h> | ||
|
||
void setup() { | ||
pinMode(3, OUTPUT); | ||
pinMode(5, OUTPUT); | ||
pinMode(9, OUTPUT); | ||
pinMode(10, OUTPUT); | ||
|
||
// Данные функции убирают один ШИМ выход у 8-ми битных таймеров, оставляя нам ШИМ пины D3, D5, D9 и D10 на ATmega328 | ||
|
||
// запустить ШИМ на D3 с частотой 66.666 Гц, режим FAST_PWM | ||
PWM_frequency(3, 66666, FAST_PWM); | ||
|
||
// запустить ШИМ на D5 с частотой 25'000 Гц, режим CORRECT_PWM. Сломает millis()! | ||
PWM_frequency(5, 25000, CORRECT_PWM); | ||
|
||
// запустить ШИМ на D9 с частотой 150'000 Гц, режим FAST_PWM | ||
PWM_frequency(9, 150000, FAST_PWM); | ||
|
||
// запустить ШИМ на D10 с частотой 150'000 Гц, режим FAST_PWM | ||
PWM_frequency(10, 150000, FAST_PWM); | ||
// пины 9 и 10 работают на одной частоте, запустить на разных не получится! | ||
} | ||
|
||
void loop() { | ||
PWM_set(3, analogRead(0) / 4); // заполнение регулируем потенциометром на А0 (8 бит) | ||
PWM_set(5, analogRead(0) / 4); // заполнение регулируем потенциометром на А0 (8 бит) | ||
|
||
PWM_set(9, analogRead(0) / 4); // заполнение регулируем потенциометром на А0 (8 бит) | ||
PWM_set(10, 255 - analogRead(0) / 4); // заполнение регулируем потенциометром на А0 (8 бит) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
#include <GyverPWM.h> | ||
|
||
void setup() { | ||
pinMode(3, OUTPUT); | ||
pinMode(5, OUTPUT); | ||
pinMode(9, OUTPUT); | ||
pinMode(10, OUTPUT); | ||
|
||
// Данные функции убирают один ШИМ выход у 8-ми битных таймеров, оставляя нам ШИМ пины D3, D5, D9 и D10 на ATmega328 | ||
|
||
// запустить ШИМ на D3, разрядность 4 бита (0-15), частота 1 МГц (см. таблицу №1 в GyverPWM.h), режим FAST_PWM | ||
PWM_resolution(3, 4, FAST_PWM); | ||
|
||
// запустить ШИМ на D5, разрядность 6 бит (0-63), частота 254 кГц (см. таблицу №1 в GyverPWM.h), режим FAST_PWM. Сломает millis()! | ||
PWM_resolution(5, 6, FAST_PWM); | ||
|
||
// запустить ШИМ на D9, разрядность 12 бит (0-4095), частота 3.9 кГц (см. таблицу №1 в GyverPWM.h), режим FAST_PWM | ||
PWM_resolution(9, 12, FAST_PWM); | ||
|
||
// запустить ШИМ на D10, разрядность 12 бит (0-4095), частота 3.9 кГц (см. таблицу №1 в GyverPWM.h), режим FAST_PWM | ||
PWM_resolution(10, 12, FAST_PWM); | ||
// пины 9 и 10 работают на одной разрядности, запустить на разных не получится! | ||
} | ||
|
||
void loop() { | ||
PWM_set(3, 3); // установить заполнение ШИМ на D3, равное 3 из 15, частота 1 МГц (см. таблицу №1 в GyverPWM.h) | ||
PWM_set(5, 40); // установить заполнение ШИМ на D5, равное 40 из 63, частота 254 кГц (см. таблицу №1 в GyverPWM.h) | ||
PWM_set(9, 2842); // установить заполнение ШИМ на D9, равное 2842 из 4095, частота 3.9 кГц (см. таблицу №1 в GyverPWM.h) | ||
PWM_set(10, 1248); // установить заполнение ШИМ на D10, равное 1248 из 4095, частота 3.9 кГц (см. таблицу №1 в GyverPWM.h) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#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() { | ||
} |
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
####################################### | ||
# Syntax Coloring Map For GyverPWM | ||
####################################### | ||
|
||
####################################### | ||
# Datatypes (KEYWORD1) | ||
####################################### | ||
|
||
GyverPWM KEYWORD1 | ||
|
||
####################################### | ||
# Methods and Functions (KEYWORD2) | ||
####################################### | ||
|
||
PWM_default KEYWORD2 | ||
PWM_frequency KEYWORD2 | ||
PWM_resolution KEYWORD2 | ||
PWM_set KEYWORD2 | ||
PWM_detach KEYWORD2 | ||
PWM_attach KEYWORD2 | ||
|
||
PWM_16KHZ_D3 KEYWORD2 | ||
PWM_20KHZ_D3 KEYWORD2 | ||
PWM_16KHZ_D5 KEYWORD2 | ||
PWM_20KHZ_D5 KEYWORD2 | ||
PWM_16KHZ_D9 KEYWORD2 | ||
PWM_20KHZ_D9 KEYWORD2 | ||
PWM_16KHZ_D10 KEYWORD2 | ||
PWM_20KHZ_D10 KEYWORD2 | ||
|
||
PWM_prescaler KEYWORD2 | ||
PWM_mode KEYWORD2 | ||
PWM_TMR1_8BIT KEYWORD2 | ||
PWM_TMR1_10BIT KEYWORD2 | ||
|
||
|
||
####################################### | ||
# Constants (LITERAL1) | ||
####################################### | ||
|
||
CORRECT_PWM LITERAL1 | ||
FAST_PWM LITERAL1 |
Oops, something went wrong.