Найти тему
Электроника и жизнь

Как изменить частоту ШИМ на Arduino UNO?

Оглавление

Здравствуйте, уважаемые читатели! В прошлой статье я рассказывал как с помощью Ардуино измерить частоту ШИМ сигнала. Если не читали, то лучше предварительно с ней ознакомиться, т.к. эта статья является продолжением прошлой. В данной статье я расскажу как можно изменить стандартную частоту ШИМ сигнала на Ардуино. Это может понадобиться, если по каким-то причинам, установленной по умолчанию для Ардуино частоты ШИМ сигнала не достаточно для работы готового устройства. Пример я покажу для Arduino UNO, хотя он будет актуален и для большинства других микроконтроллеров семейства Ардуино ( Arduino Nano , Arduino Mini , Arduino Mega).

Как изменить частоту ШИМ на Arduino UNO
Как изменить частоту ШИМ на Arduino UNO

Изменить частоту ШИМ сигнала можно двумя методами.

Первый вариант - через регистры, меняя режим работы таймера, с которым связан пин.

Частота ШИМ сигнала по умолчанию для Arduino UNO
Частота ШИМ сигнала по умолчанию для Arduino UNO

Менять частоту ШИМ сигнала на 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 нужно установить, чтобы задать нужный делитель.

Таблица 15-6 даташит ATmega328
Таблица 15-6 даташит ATmega328
Регистр TCCR1B
Регистр TCCR1B

А для простоты можно использовать выражения, которые остается только скопировать и в ставить в функцию 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/10 пину 30 Гц
Устанавливаем частоту шим на 9/10 пину 30 Гц

Загружаем скетч в Ардуино, открываем Монитор порта и видим, что частота на 9 пину составляет около 30 Гц .

Измеренное значение в Мониторе порта
Измеренное значение в Мониторе порта

А если скопировать выражение с установкой делителя 1, то частота составит максимально возможную для 9 пина - около 31 КГц.

Устанавливаем частоту шим на 9/10 пину 31 КГц
Устанавливаем частоту шим на 9/10 пину 31 КГц
Измеренное значение в Мониторе порта
Измеренное значение в Мониторе порта

Таким способом можно изменить частоту ШИМ сигнала без подключения библиотек, но только с определенным шагом, соответствующим делителю.

Второй вариант – установка специальной библиотеки.

Открываем библиотеку по ссылке https://github.com/terryjmyers/PWM. Скачиваем ее и добавляем в Arduino IDE .

В примерах библиотеки есть скетч PWM. Из кода скетча видно, что переменной frequency мы задаем нужную нам частоту. И далее, устанавливаем ее для выбранного пина. В данном случае, это пин 9.

Перенесем нужные нам данные из примера библиотеки в наш скетч, измеряющий частоту ШИМ сигнала. Не забываем в начале подключить саму библиотеку. И еще, вместо функции analogWrite () , будем использовать функцию pwmWrite (). Аргументы ровно те же, отличается только имя функции.

Скетч измерения частоты ШИМ с помощью библиотеки PWM.h. Ссылка на его скачивание в конце статьи.
Скетч измерения частоты ШИМ с помощью библиотеки PWM.h. Ссылка на его скачивание в конце статьи.

Протестируем функцию на некоторых значениях.

Вначале пусть будет значение из примера – 35 Гц . В Мониторе порта получаем - 35,21 Гц.

50 Гц – получаем 50,29 Гц .

100 Гц – получаем 100,54Гц .

300 Гц – получаем 301,57 Гц .

1000 Гц – получаем 1005 Гц .

В общем, измеренные значения, весьма близки к задаваемым.

Вот такие существуют достаточно простые способы изменения частоты ШИМ сигнала на Arduino UNO. А в следующей статье, я расскажу как задавать нужную частоту ШИМ сигнала на микроконтроллерах ATtiny . Там есть свои особенности.

Ссылка на скетч из статьи - https://disk.yandex.ru/d/sKX8EiwxTyaFHA

Видео по материалам статьи (прошлой и этой):

_________________________________________________________

Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!

Другие публикации по теме: