Здравствуйте, уважаемые читатели! В прошлой статье я рассказывал как с помощью Ардуино измерить частоту ШИМ сигнала. Если не читали, то лучше предварительно с ней ознакомиться, т.к. эта статья является продолжением прошлой. В данной статье я расскажу как можно изменить стандартную частоту ШИМ сигнала на Ардуино. Это может понадобиться, если по каким-то причинам, установленной по умолчанию для Ардуино частоты ШИМ сигнала не достаточно для работы готового устройства. Пример я покажу для Arduino UNO, хотя он будет актуален и для большинства других микроконтроллеров семейства Ардуино ( Arduino Nano , Arduino Mini , Arduino Mega).
Изменить частоту ШИМ сигнала можно двумя методами.
Первый вариант - через регистры, меняя режим работы таймера, с которым связан пин.
Менять частоту ШИМ сигнала на 5 и 6 пину не рекомендуется, т.к. вместе с этим, мы меняем режим работы основного таймера Timer 0, с которым связаны функции, работающие со временем, такие как delay () и используемая в нашем скетче функция pulseIn () . Так что менять частоту ШИМ сигнала будем на 9 и 10 пину. Точно таким же образом меняется частота на 3 и 11 пину.
Чтобы понять, каким именно регистрам и какое значение нужно присвоить, нужно изучить даташит на ATmega328 , начиная со 108 страницы (https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf). Именно этот микроконтроллер, является основой для Arduino UNO.
Важнейшая для нас информация находится на 110 странице, в таблице 15-6. Здесь указано какие 3 младших бита для регистра TCCR1B, связанного с работой Timer1 нужно установить, чтобы задать нужный делитель.
А для простоты можно использовать выражения, которые остается только скопировать и в ставить в функцию setup () .
Установка частоты ШИМ сигнала для пинов D9 и D10 (Timer1)
TCCR1B = TCCR1B & B11111000 | B00000001; //делитель 1 для частоты ШИМ 31372.55 Гц
TCCR1B = TCCR1B & B11111000 | B00000010; //делитель 8 для частоты ШИМ 3921.16 Гц
TCCR1B = TCCR1B & B11111000 | B00000011; //делитель 64 для частоты ШИМ 490.20 Гц (по умолчанию)
TCCR1B = TCCR1B & B11111000 | B00000100; //делитель 256 для частоты ШИМ 122.55 Гц
TCCR1B = TCCR1B & B11111000 | B00000101; //делитель 1024 для частоты ШИМ 30.64 Гц
Установка частоты ШИМ сигнала для пинов D3 и D11 (Timer2)
TCCR2B = TCCR2B & B11111000 | B00000001; //делитель 1 для частоты ШИМ 31372.55 Гц
TCCR2B = TCCR2B & B11111000 | B00000010; //делитель 8 для частоты ШИМ 3921.16 Гц
TCCR2B = TCCR2B & B11111000 | B00000011; //делитель 32 для частоты ШИМ 980.39 Гц
TCCR2B = TCCR2B & B11111000 | B00000100; //делитель 64 для частоты ШИМ 490.20 Гц (по умолчанию)
TCCR2B = TCCR2B & B11111000 | B00000101; //делитель 128 для частоты ШИМ 245.10 Гц
TCCR2B = TCCR2B & B11111000 | B00000110; //делитель 256 для частоты ШИМ 122.55 Гц
TCCR2B = TCCR2B & B11111000 | B00000111; //делитель 1024 для частоты ШИМ 30.64 Гц
Источник: https ://forum .arduino.cc/index.php?topic=328714.0
Для примера, в начале функции setup() (код скетча из прошлой статьи) добавим строку, которая для первого таймера устанавливает делитель 1024 , тем самым мы устанавливаем частоту ШИМ сигнала равной примерно 30 Гц .
Загружаем скетч в Ардуино, открываем Монитор порта и видим, что частота на 9 пину составляет около 30 Гц .
А если скопировать выражение с установкой делителя 1, то частота составит максимально возможную для 9 пина - около 31 КГц.
Таким способом можно изменить частоту ШИМ сигнала без подключения библиотек, но только с определенным шагом, соответствующим делителю.
Второй вариант – установка специальной библиотеки.
Открываем библиотеку по ссылке https://github.com/terryjmyers/PWM. Скачиваем ее и добавляем в Arduino IDE .
В примерах библиотеки есть скетч PWM. Из кода скетча видно, что переменной frequency мы задаем нужную нам частоту. И далее, устанавливаем ее для выбранного пина. В данном случае, это пин 9.
Перенесем нужные нам данные из примера библиотеки в наш скетч, измеряющий частоту ШИМ сигнала. Не забываем в начале подключить саму библиотеку. И еще, вместо функции analogWrite () , будем использовать функцию pwmWrite (). Аргументы ровно те же, отличается только имя функции.
Протестируем функцию на некоторых значениях.
Вначале пусть будет значение из примера – 35 Гц . В Мониторе порта получаем - 35,21 Гц.
50 Гц – получаем 50,29 Гц .
100 Гц – получаем 100,54Гц .
300 Гц – получаем 301,57 Гц .
1000 Гц – получаем 1005 Гц .
В общем, измеренные значения, весьма близки к задаваемым.
Вот такие существуют достаточно простые способы изменения частоты ШИМ сигнала на Arduino UNO. А в следующей статье, я расскажу как задавать нужную частоту ШИМ сигнала на микроконтроллерах ATtiny . Там есть свои особенности.
Ссылка на скетч из статьи - https://disk.yandex.ru/d/sKX8EiwxTyaFHA
Видео по материалам статьи (прошлой и этой):
_________________________________________________________
Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!