Какова частота PWM-выхода на Arduino

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

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

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

, 👍25

Обсуждение

Это также зависит от используемого вами контакта., @Gerben


1 ответ


Лучший ответ:

36

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

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

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

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

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

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

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

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

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

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

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

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

Изменение прескалера, режима ШИМ или МАКСИМАЛЬНОГО значения для timer0 приведет к сбоям в работе millis() и micros().

,

Я так понимаю, что самая быстрая частота, которую вы могли бы получить для ШИМ, составляет 16 МГц/256 (прескалер = 1) или 62,5 кГц?, @Duncan C

И далее, что частота ШИМ должна быть четным коэффициентом 62,5 кГц? Кто-то в другом потоке хотел контролировать скорость вентилятора 4-контактного вентилятора ПК. Очевидно, ему нужен управляющий сигнал ШИМ 25 кГц. 62,5/25 равно 2,5, что не является целочисленным значением., @Duncan C

Я обновил ответ, чтобы подробнее рассказать о возможностях достижения определенных частот,, @user2973

На низкочастотном конце вы можете настроить 16-разрядный таймер в режиме с фазовой коррекцией с помощью 1024 прескалера, чтобы получить 16e6/1024/2^16/2 = 0,119 Гц или 7,1 циклов в минуту. Для меньшего, чем это, нужно было бы переключать биты на основе чего-то вроде millis(). Или, может быть, вызвать счетчик на внешнем входном выводе T?., @Dave X