Arduino изменить частоту шим

Широтно-импульсная модуляция Arduino выполняется с частотой 488,28 Гц с помощью функции analogWrite на аналоговых выводах, но частоту ШИМ можно изменить.

Широтно-импульсная модуляция (ШИМ) Arduino UNO и NANO работает на аналоговых выходах 3, 5, 6, 9, 10, 11 с частотой 488,28 Гц. С помощью функции analogWrite частота ШИМ изменяется в диапазоне 0 до 255 и соответствует коэффициенту заполнения импульса от 0 до 100 %. Для многих устройств частота PWM Arduino NANO слишком мала, поэтому ее требуется увеличить. Рассмотрим, как это правильно сделать.

Широтно-импульсная модуляция Arduino

ШИМ, по-английски Pulse-Width Modulation (PWM) — это управление мощностью на нагрузке с помощью изменения скважности (ширины) импульсов при постоянной частоте и амплитуде сигнала. На следующем графике видно, что при разных значениях в функции analogWrite , амплитуда импульсов остается постоянной, но меняется ширина импульсов. Мощность сигнала определяет коэффициент заполнения импульса.

График. Параметры сигнала, коэффициент заполнения ШИМ

Можно выделить две области применения широтно-импульсной модуляции:

1. PWM используется в источниках питания, регуляторах мощности и т.д. Применение ШИМ на Arduino Nano позволяет значительно упростить управление яркостью источников света (светодиодов, LED-ленты) и скоростью вращения двигателей.

2. PWM используется для получения аналогового сигнала. Цифро-аналоговый преобразователь (ЦАП) на Ардуино прост в реализации, так как требует минимума радиоэлементов — достаточно одной RC цепочки из резистора и конденсатора.

Изменение частоты ШИМ Ардуино (разрядности)

Платы Arduino Uno и Arduino Nano на базе ATmega168/328 имеют 6 аппаратных ШИМ модуляторов на аналоговых портах 3, 5, 6, 9, 10, 11. Управление ШИМ сигналом осуществляется с помощью функции analogWrite , которая генерирует на выходе аналоговый сигнал и задает коэффициент заполнения импульса. Arduino устанавливает на выводах частоту 488,28 Гц и разрешение 8 разрядов (от 0 до 255).

Схема. Широтно-импульсная модуляция для чайников

В Arduino на базе ATmega168/328 для ШИМ используются три таймера:

Таймер 0 — выводы 5 и 6
Таймер 1 — выводы 9 и 10
Таймер 2 — выводы 3 и 11

ШИМ Ардуино определяется интегральными компонентами, называемыми таймерами. Каждый таймер в платах Arduino Uno и Nano на базе микроконтроллера ATmega168/328 имеет по два канала, подключенных к выходам. Для изменения частоты PWM сигнала требуется изменение таймера, к которому он подключается. При этом PWM изменится и на аналоговых выходах, подключенных параллельно к этому же таймеру.

Как увеличить частоту и разрядность ШИМ Ардуино

Не существует способа изменить частоту ШИМ Arduino без прямого управления памятью на низком уровне. Рассмотрим далее, как изменить режим работы таймера, чтобы увеличить частоту (frequency) ШИМ Ардуино. Таймер 0 используется для расчета времени, т.е. функции delay и millis . Увеличение частоты на Таймер 0 приведет к нарушению функций сохранения времени, которые могут использоваться в скетче.

Чтобы увеличить разрядность Ардуино на 9 и 10 аналоговом выходе, изменим частоту Таймера 1 без библиотеки. Максимальная частота PWM может достигать на платах Ардуино Уно и Нано — 62 500 Гц. Для этого в процедуре void setup() необходимо добавить соответствующую команду из таблицы, которая приведена далее.

Разрешение Частота ШИМ Команды установки режима
8 бит 62 500 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
7 812,5 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
976,56 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0d;

Максимальная частота ШИМ Ардуино (Arduino PWM Frequency) — 62 500 Гц.

Читайте также:  Windows 10 домашняя для одного языка ключ

Широтно-импульсная модуляция Arduino выполняется с частотой 488,28 Гц с помощью функции analogWrite на аналоговых выводах, но частоту ШИМ можно изменить.

Широтно-импульсная модуляция (ШИМ) Arduino UNO и NANO работает на аналоговых выходах 3, 5, 6, 9, 10, 11 с частотой 488,28 Гц. С помощью функции analogWrite частота ШИМ изменяется в диапазоне 0 до 255 и соответствует коэффициенту заполнения импульса от 0 до 100 %. Для многих устройств частота PWM Arduino NANO слишком мала, поэтому ее требуется увеличить. Рассмотрим, как это правильно сделать.

Широтно-импульсная модуляция Arduino

ШИМ, по-английски Pulse-Width Modulation (PWM) — это управление мощностью на нагрузке с помощью изменения скважности (ширины) импульсов при постоянной частоте и амплитуде сигнала. На следующем графике видно, что при разных значениях в функции analogWrite , амплитуда импульсов остается постоянной, но меняется ширина импульсов. Мощность сигнала определяет коэффициент заполнения импульса.

График. Параметры сигнала, коэффициент заполнения ШИМ

Можно выделить две области применения широтно-импульсной модуляции:

1. PWM используется в источниках питания, регуляторах мощности и т.д. Применение ШИМ на Arduino Nano позволяет значительно упростить управление яркостью источников света (светодиодов, LED-ленты) и скоростью вращения двигателей.

2. PWM используется для получения аналогового сигнала. Цифро-аналоговый преобразователь (ЦАП) на Ардуино прост в реализации, так как требует минимума радиоэлементов — достаточно одной RC цепочки из резистора и конденсатора.

Изменение частоты ШИМ Ардуино (разрядности)

Платы Arduino Uno и Arduino Nano на базе ATmega168/328 имеют 6 аппаратных ШИМ модуляторов на аналоговых портах 3, 5, 6, 9, 10, 11. Управление ШИМ сигналом осуществляется с помощью функции analogWrite , которая генерирует на выходе аналоговый сигнал и задает коэффициент заполнения импульса. Arduino устанавливает на выводах частоту 488,28 Гц и разрешение 8 разрядов (от 0 до 255).

Схема. Широтно-импульсная модуляция для чайников

В Arduino на базе ATmega168/328 для ШИМ используются три таймера:

Таймер 0 — выводы 5 и 6
Таймер 1 — выводы 9 и 10
Таймер 2 — выводы 3 и 11

ШИМ Ардуино определяется интегральными компонентами, называемыми таймерами. Каждый таймер в платах Arduino Uno и Nano на базе микроконтроллера ATmega168/328 имеет по два канала, подключенных к выходам. Для изменения частоты PWM сигнала требуется изменение таймера, к которому он подключается. При этом PWM изменится и на аналоговых выходах, подключенных параллельно к этому же таймеру.

Как увеличить частоту и разрядность ШИМ Ардуино

Не существует способа изменить частоту ШИМ Arduino без прямого управления памятью на низком уровне. Рассмотрим далее, как изменить режим работы таймера, чтобы увеличить частоту (frequency) ШИМ Ардуино. Таймер 0 используется для расчета времени, т.е. функции delay и millis . Увеличение частоты на Таймер 0 приведет к нарушению функций сохранения времени, которые могут использоваться в скетче.

Чтобы увеличить разрядность Ардуино на 9 и 10 аналоговом выходе, изменим частоту Таймера 1 без библиотеки. Максимальная частота PWM может достигать на платах Ардуино Уно и Нано — 62 500 Гц. Для этого в процедуре void setup() необходимо добавить соответствующую команду из таблицы, которая приведена далее.

Разрешение Частота ШИМ Команды установки режима
8 бит 62 500 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
7 812,5 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
976,56 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0d;

Максимальная частота ШИМ Ардуино (Arduino PWM Frequency) — 62 500 Гц.

Блог технической поддержки моих разработок

В уроке узнаем о широтно-импульсной модуляции, о реализации этого способа управления в контроллерах Ардуино, о режимах и функциях работы с ШИМ в Ардуино.

Прервемся на урок от разработки контроллера холодильника, для того чтобы научиться работать с широтно-импульсным модулятором Ардуино.

Читайте также:  Прикольные никнеймы на английском для парней

В нашей разработке используется именно такой способ регулирования мощности на элементе Пельтье.

Широтно-импульсная модуляция.

Широтно-импульсная модуляция (ШИМ) это способ управления мощностью на нагрузке с помощью изменения скважности импульсов при постоянной амплитуде и частоте импульсов.

Можно выделить две основные области применения широтно-импульсной модуляции:

  • Во вторичных источниках питания, различных регуляторах мощности, регуляторах яркости источников света, скорости вращения коллекторных двигателей и т.п. В этих случаях применение ШИМ позволяет значительно увеличить КПД системы и упростить ее реализацию.
  • Для получения аналогового сигнала с помощью цифрового выхода микроконтроллера. Своеобразный цифро-аналоговый преобразователь (ЦАП). Очень простой в реализации, требует минимума внешних компонентов. Часто достаточно одной RC цепочки.

Принцип регулирования с помощью ШИМ – изменение ширины импульсов при постоянной амплитуде и частоте сигнала.

На диаграмме можно увидеть основные параметры ШИМ сигнала:

  • Ui — амплитуда импульсов ;
  • Ton – время активного (включенного) состояния сигнала;
  • Toff – время отключенного состояния сигнала;
  • Tpwm – время периода ШИМ.

Даже интуитивно понятно, что мощность на нагрузке пропорциональна соотношению времени включенного и отключенного состояния сигнала.

Это соотношение определяет коэффициент заполнения ШИМ:

Он показывает, какую часть периода сигнал находится во включенном состоянии. Может меняться:

  • от 0 – сигнал всегда выключен;
  • до 1 — сигнал все время находится во включенном состоянии.

Чаще используют процентный коэффициент заполнения. В этом случае он находится в пределах от 0 до 100%.

Среднее значение электрической мощности на нагрузке строго пропорционально коэффициенту заполнения. Когда говорят, что ШИМ равен, например, 20%, то имеют в виду именно коэффициент заполнения.

Формирование аналогового сигнала.

Если сигнал ШИМ пропустить через фильтр низких частот (ФНЧ), то на выходе фильтра мы получим аналоговый сигнал, напряжение которого пропорционально коэффициенту заполнения ШИМ.

В качестве ФНЧ можно использовать простейшую RC цепочку.


Из-за неидеальной характеристики такого фильтра частота среза должна быть минимум на порядок меньше частоты ШИМ. Для простого RC фильтра частота среза вычисляется по формуле:

  • При повышении частоты среза ФНЧ на выходе фильтра увеличиваются пульсации с частотой ШИМ.
  • При уменьшении частоты среза фильтра снижается время реакции выходного аналогового сигнала на изменения ширины импульсов.

Из этого вытекает главный недостаток широтно-импульсной модуляции. Метод способен синтезировать только достаточно медленные аналоговые сигналы или требует применения фильтров низких частот с высокой добротностью, сложных в реализации.

Я бы рекомендовал:

  • В случае, когда к быстродействию аналогового сигнала жестких требований нет выбирать заведомо заниженную частоту среза фильтра.
  • Если необходимо оптимизировать быстродействие аналогового преобразователя, то лучше промоделировать схему.

Даже простейшие моделирующие программы вычисляют уровень пульсаций достаточно точно. Вот результаты моделирования на SwCAD для ШИМ частотой 500 Гц и RC фильтрами с частотами среза 500 Гц, 50 Гц и 5 Гц. Зеленым цветом показана диаграмма ШИМ, синим – напряжение на выходе RC фильтра.

Частота среза 500 Гц (10 кОм, 32 нФ).

Частота среза 50 Гц (10 кОм, 320 нФ).

Частота среза 5 Гц (10 кОм, 3,2 мкФ).

Точность преобразования широтно-импульсных модуляторов определяется погрешностью амплитуды импульсов (т.е. стабильностью питания микроконтроллера) и значением падения напряжения на ключах цифровых выходов микроконтроллера. Как правило, точность ШИМ микроконтроллеров невысока. Добиться высокой точности ШИМ преобразования можно с помощью дополнительной схемы с аналоговыми ключами и источником опорного напряжения.

К недостаткам использования широтно-импульсных модуляторов в качестве ЦАП также следует отнести высокое выходное сопротивление. Оно определяется сопротивлением резистора RC фильтра и не может быть низким из-за малой нагрузочной способности выходов микроконтроллера.

Широтно-импульсные модуляторы в Ардуино.

Платы Ардуино на базе микроконтроллеров ATmega168/328 имеют 6 аппаратных широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на выводах 3, 5, 6, 9, 10, 11.

Управление аппаратными ШИМ осуществляется с помощью системной функции analogWrite().

Читайте также:  Сопротивление датчика температуры стиральной машины индезит

void analogWrite(pin, val)

Функция переводит вывод в режим ШИМ и задает для него коэффициент заполнения. Перед использованием analogWrite() функцию pinMode() для установки вывода в режим “выход” вызывать необязательно.

  • pin – номер вывода для генерации ШИМ сигнала.
  • val – коэффициент заполнения ШИМ. Без дополнительных установок диапазон val от 0 до 255 и соответствует коэффициенту заполнения от 0 до 100 %. Т.е. разрядность системных ШИМ в Ардуино 8 разрядов.

analogWrite(9, 25); // на выводе 9 ШИМ = 10%

Частота ШИМ Ардуино 488,28 Гц.

Для генерации ШИМ используются все три таймера Ардуино.

Таймер Используется для генерации ШИМ на выводах
Таймер 0 выводы 5 и 6
Таймер 1 выводы 9 и 10
Таймер 2 выводы 3 и 11

Если таймер используется для других целей, например для прерывания, то параметры ШИМ соответствующих выводов могут не соответствовать указанным выше.

Поэтому, при использовании библиотек MsTimer2, TimerOne или им подобных некоторые выводы в качестве ШИМ сигналов использовать нельзя.

Увеличение частоты и разрядности ШИМ Ардуино.

Система Ардуино устанавливает на всех выводах ШИМ параметры:

  • частота 488,28 Гц;
  • разрешение 8 разрядов (0…255).

Очень низкая частота. Для большинства приложений совершенно не допустимая.

В разработке контроллера элемента Пельтье, начатой в предыдущем уроке, частота ШИМ должна быть не менее 30-50 кГц. В интернете достаточно много предложений по увеличению частоты ШИМВо всех описываются методы увеличения частоты до 31 кГц. В принципе приемлемый вариант, но мне захотелось большего.

Я разобрался с Таймером 1 микроконтроллера ATmega168/328, перевел ШИМ в быстродействующий режим и добился частоты ШИМ Ардуино до 62,5 кГц. Заодно я научился менять разрядность ШИМ. Чтобы в следующий раз не копаться в документации на микроконтроллеры ATmega168/328 я свел всевозможные варианты ШИМ для таймера 1 в таблицу.

Строчки из правого столбца для выбранного варианта необходимо написать в функции setup().

Варианты параметров ШИМ на выводах 9 и 10 Ардуино (таймер 1).

Разрешение Частота ШИМ Команды установки режима
8 бит 62 500 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
7 812,5 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
976,56 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0d;
9 бит 31 250 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
3 906,25 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
488,28 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
122,07 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
30,52 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0d;
10 бит 1 5625 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x09;
1 953,13 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
15,26 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0d;

Следующий скетч генерирует на выводе 9 ШИМ с частотой 62,5 кГц и коэффициентом заполнения примерно 10 %.

void setup() <
// ШИМ 8 разрядов, 62,5 кГц
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
analogWrite(9, 25); // на выводе 9 ШИМ=10%
>

Это максимально возможная частота ШИМ Ардуино для большинства плат (с частотой генератора 16 мГц).

В следующем уроке вернемся к разработке контроллера элемента Пельтье.