Какова частота выхода ШИМ на Arduino?

22

Какую частоту Arduinos использует для обычного ШИМ, когда вы используете analogWrite ()?

И отличается ли это для разных моделей Arduino? Меня особенно интересует Mega 2560, но я также хочу узнать, совместимо ли оно между моделями.

Я видел мимолетные ссылки на Arduino с использованием 500 Гц, что кажется очень медленным.

Дункан С
источник
Это также зависит от булавки, которую вы используете.
Гербен

Ответы:

31

Сигнал ШИМ генерируется таймерами на микросхемах AVR. Каждый таймер может генерировать ШИМ-сигнал на двух или трех разных контактах. Каждый вывод может иметь свой собственный рабочий цикл, но они имеют общую частоту ШИМ. Вы можете изменить частоту ШИМ, изменив источник синхронизации для таймеров. По умолчанию они используют тактовую частоту процессора, деленную на 64, т.е. у них установлен прескалер 64 с помощью кода инициализации Arduino. Чтобы еще больше запутать, есть два разных режима ШИМ: быстрый ШИМ и ШИМ с коррекцией фазы. В быстром ШИМ таймер считает до 255, затем переполняется и начинается с 0 (256 различных состояний). В ШИМ с корректной фазой таймер считает 255, затем меняет направление и понижает до нуля, меняет направление и т. Д. (510 различных состояний).

Arduino Mega имеет 5 таймеров, timer0 - timer4. Поскольку timer0 также используется для функций миллис и микросхем, он использует быстрый ШИМ, тогда как другие таймеры настроены на ШИМ с корректной фазой. Это приводит к различным частотам на разных выводах:

  • Выводы 4 и 13, управляемые таймером 0:
    16 МГц / 64/256 = 976,56 Гц

  • Другие выводы ШИМ, управляемые таймером 1-4:
    16 МГц / 64/510 = 490,20 Гц

Вычисление: Режим часов / Прескалер / ШИМ, число состояний

Ситуация такая же для всех других плат Arduino, о которых я знаю, за исключением того, что у них меньше таймеров, которые подключаются к разным контактам.

Вы можете изменить частоту ШИМ, изменив прескалер таймера. Смотрите эту страницу: http://playground.arduino.cc/Main/TimerPWMCheatsheet

Также можно настроить счетчики таймеров на значение, отличное от 255. На 8-разрядных таймерах вы потеряете выходной контакт, но на 16-разрядных таймерах вы можете использовать входной регистр захвата для определения значения TOP. Функция захвата ввода - это функция, редко используемая в сообществе Arduino, поэтому вы, вероятно, не пропустите ее.

Библиотеки Arduino позволяют использовать только 8-битное разрешение, даже на 16-битных таймерах. Если вы хотите более высокое разрешение, вам придется написать свой собственный аналогWrite или использовать библиотеку, созданную для этой цели. На Arduino Mega timer0 и timer2 являются 8-битными, а остальные - 16-битными.

Изменяя режим 16-битных таймеров, чтобы использовать полное разрешение, в сочетании с изменением предскалера и значения TOP, вы можете достичь очень широкого диапазона частот ШИМ.

Максимальная частота, которую вы можете достичь, - это тактовая частота / 4, если для прескейлера установить значение 1, а для TOP в 3 в режиме быстрого ШИМ - меньшее значение не допускается. Это даст вам 4 МГц ШИМ с разрешением 2 бита. Это может быть в 0%, 25%, 50% или 75% времени. Более высокое значение TOP даст вам более высокое разрешение на более низкой частоте.

Для более подробного объяснения прочитайте эту статью или обратитесь к таблице .

Изменение прескалера, режима ШИМ или значения TOP для таймера 0 приведет к путанице millis()и micros().

user2973
источник
1
Я так понимаю, что самая быстрая частота, которую вы могли бы получить для ШИМ, составляет 16 МГц / 256 (prescaler = 1) или 62,5 КГц?
Дункан С
И далее, что частота ШИМ должна быть равной 62,5 кГц? Кто-то в другой теме хотел контролировать скорость вращения вентилятора 4-контактного ПК. Видимо, он хочет сигнал управления ШИМ 25 кГц. 62,5 / 25 равно 2,5, что не является целочисленным значением.
Дункан C
Я обновил ответ, чтобы более подробно рассказать о возможностях достижения определенных частот,
user2973
На низкочастотной стороне вы можете предварительно масштабировать 16-битный таймер в режиме фазовой коррекции с помощью прескалера 1024, чтобы получить 16e6 / 1024/2 ^ 16/2 = 0,119 Гц или 7,1 такта / минуту. Для более низких значений необходимо переключать биты на основе чего-то вроде millis (). Или, может быть, вызвать счетчик на внешнем входном контакте T ?.
Дэйв Икс