Сигнал ШИМ генерируется таймерами на микросхемах 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()
.