Как повысить частоту шим ардуино

ШИМ сигнал

Как повысить частоту шим ардуино

Очень часто в робототехнике возникает необходимость плавно управлять каким-то процессом, будь то яркость светодиода, мощность обогревателя или скорость вращения моторчика. Вполне очевидно, что управление напрямую связано с изменением напряжения на потребителе: и светодиод будет по-другому светить, и моторчик крутиться с другой скоростью. Но проблема в том, что управлять напряжением может только такая штука, как ЦАП – цифро-аналоговый преобразователь, а в нашем микроконтроллере встроенного ЦАПа нет, у нас есть только цифровой сигнал, т.е. либо вкл, либо выкл: Как повысить частоту шим ардуино Можно ли добиться плавного управления цифровым сигналом? Оказывается можно! Представьте себе вентилятор, вращающийся на полной мощности, напряжение постоянно. Представим теперь, что секунду напряжение подаётся, и секунду – нет, и так продолжается “по кругу”. Вентилятор начнёт крутиться в два раза медленнее, но мы скорее всего будем замечать моменты включения и выключения, особенно если вентилятор маленький. Большой вентилятор более инертен и там можно даже не заметить изменений скорости в пределах двух секунд. Можно теперь включать напряжение на 0.5 секунды, а на остальные 1.5 секунды – выключать. Вентилятор будет крутиться со скоростью 25% от максимальной. Мы с вами смогли представить так называемый ШИМ сигнал, широтно-импульсную модуляцию Как повысить частоту шим ардуино С лампочкой накаливания оно тоже будет работать, она ведь весьма инертна, но вот со светодиодом мы будем видеть, как он включается и выключается, потому что он практически не имеет задержки включения/выключения. Что же делать? Всё очень просто, поднять частоту. В мысленном эксперименте у нас был период 2 секунды, что есть 0.5 Гц. А теперь представьте себе такой сигнал с частотой скажем 1000 Гц. Или 25’000 Гц (25 кГц). Теперь роль играет инертность глаза, он не заметит вспышек на такой частоте, для него это будет просто уменьшение яркости. Задача решена! Изменяя так называемое “заполнение” ШИМ сигнала можно менять “суммарное” напряжение (интегрированное) за некоторый период. Чем больше заполнение ШИМ, тем выше напряжение, но не выше напряжения, которое мы “ШИМим”: Как повысить частоту шим ардуино При помощи ШИМ сигнала можно даже модулировать сложные аналоговые сигналы, например – синусоиду. На картинке ниже показан ШИМ (снизу) и этот же ШИМ после фильтров: Как повысить частоту шим ардуино Вот таким образом кстати и работают инвертеры DC-AC. Возвращаясь к свойствам ШИМ сигнала, их всего два: частота (frequency) и заполнение (duty), с ними мы разобрались. Давайте перейдём к генерации ШИМ при помощи Arduino.

Arduino и ШИМ

В уроке про функции времени я рассказывал, что у микроконтроллера есть так называемые счётчики, которые считают “пинки” от тактового генератора (кварца). Данные счётчики как раз и генерируют ШИМ сигнал, т.е. само вычислительное ядро микроконтроллера в этом не участвует. Помимо расчётов, даже вывод сигнала с ноги МК ложится на плечи счётчика. Это очень важно понимать, потому что ШИМ сигнал не тормозит выполнение кода, так как его генерацией занимается буквально “другая железка”. На платах UNO/Nano/Pro Mini у нас есть три таймера-счётчика, у каждого таймера есть по два выхода на пины МК, то есть у нас есть 2*3=6 пинов, способных генерировать ШИМ сигнал. Для генерации ШИМ у нас есть готовая функция analogWrite(pin, duty)

Совместим эти знания с прошлым уроком и попробуем менять яркость светодиода, подключенного через резистор к пину D3. Потенциометр подключен к пину A0

Примечание:

Рассмотренный пример меняет яркость светодиода в зависимости от положения рукоятки потенциометра. Пару слов о “стандартном” ШИМ сигнале – мы получаем его с такими настройками, какие нам даёт библиотека Arduino.h, а настройки эти сильно занижены по сравнению с возможностями Arduino. Про “улучшение” ШИМ мы поговорим позже, а сейчас давайте глянем на характеристики ШИМ “из коробки”:

ТаймерПиныЧастотаРазрешение
Timer 0D5 и D6976 Гц8 бит (0-255)
Timer 1D9 и D10488 Гц8 бит (0-255)
Timer 2D3 и D11488 Гц8 бит (0-255)

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

Видео

Источник

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

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

Расшифровка и определение ШИМ

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

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

Как повысить частоту шим ардуино

Увеличивая частоту импульсов ШИМа на Ардуино, можно выполнять операции на высокой скорости.

Декодер создает этот сигнал для управления двигателем. Это та же концепция, что и функции мощности импульса, находящиеся на блоках питания постоянного тока.

Рассмотрим основные преимущества использования ШИМ Ардуино:

Создать широтно-импульсный модулятор можно на esp8266 шим, на Ардуино УНО и Ардуино Нано шим. То есть для конструирования подойдет любая модель описываемого микроконтроллера.

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

AnalogRead – это функция, которая используется для считывания аналоговых значений из аналоговых контактов ШИМа на Ардуино. Плата Arduino UNO имеет 6-канальный 10-битный аналого-цифровой преобразователь (АЦП). Это означает, что АЦП в Arduino UNO будет отображать входные напряжения от 0 до 5 В в целое значение от 0 до 1023.

Как повысить частоту шим ардуино

Следовательно, функция analogRead возвращает любое значение от 0 до 1023. Синтаксис функции analogReadanalogRead (аналоговый вывод no).

Поскольку мы считываем аналоговые напряжения от потенциометра на выводе A0, нам нужно написать analogRead (A0) в эскизе. Когда он возвращает целочисленное значение, с ним создается временная переменная целочисленного типа данных. Следующая функция – analogWrite. Это функция, которая используется для установки рабочего цикла сигнала ШИМ для любого заданного штыря ШИМ.

Синтаксис функции analogWrite – analogWrite (вывод PWM no, value).

Значение указывает рабочий цикл и должно быть значением от 0 (0 В) до 255 (5 В).

Перейдем к фактическому эскизу схемы управления яркостью светодиода. Окончательный эскиз показан на следующем рисунке.

Как повысить частоту шим ардуино

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

Но диапазон значений, принимаемых функцией analogWrite, находится в диапазоне от 0 до 255. Следовательно, нам нужно выполнить некоторые математические вычисления, чтобы поместить подходящее значение в функцию analogWrite.

Наконец, вычисленное значение помещается в функцию analogWrite вместе с выводом PWM для получения сигнала PWM.

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

Еще один вариант скетча для Ардуино:

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

Чтобы использовать частотный ШИМ на Arduino Uno, нужно всего лишь установить один из ШИМ-выводов в качестве выхода, затем вызывать команду analogWrite и установить уровень. Частота установлена ​​примерно на 500 Гц, поэтому не нужно беспокоиться об этой части.

Мы выбираем контакт под номером 3, устанавливаем его, как output, и analogWrite значение для него. При выборе выхода у нас есть 256 уровней на выбор. Уровень рабочего цикла можно установить между номерами 0 и 255, где 0 – рабочий цикл 0 %, а 255 – 100 % рабочего цикла.

Последний вывод микроконтроллера на плате Arduino Uno составляет 5 В. Чтобы установить светодиод, который мы выбрали для полной яркости, нам необходимо подать напряжение 3,3 В и 15 мА тока. Для этого мы понижаем напряжение на резисторе 100 Ом.

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

Для изменения частоты ШИМа Ардуино в большую сторону необходимо обратиться к следующей инструкции.

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

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

Как повысить частоту шим ардуиноРис.: а) структура МОП ПТ с индуцированным каналом. б) графическое изображение.

В этом примере предположим, что MOSFET будет управлять не критической нагрузкой, такой, как светодиод высокой мощности. В этом случае нам просто нужно оставаться в разумных пределах, поэтому пиковый ток в светодиоде не будет превышен. В этом случае пульсация в 0,1 вольта была бы более чем достаточной.

Примеры использования ШИМ на Ардуино

Широкополосная широтно-импульсная модуляция является способом кодирования напряжения на фиксированную несущую частоту. Он обычно используется для радиоуправляемых устройств. Каждый тип схемы модуляции имеет свои преимущества и недостатки.

AM-модуляция была первым типом модуляции, используемой для радиопередач. Самая простая схема модуляции для реализации требует только одного транзистора или усилителя вакуумной трубки, как это было сделано в первые дни с момента создания радио.

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

Источник

Ускоряем свою Arduino

Месяца 3 назад, как и многие горе-электроники, купил себе на мой тогдашний взгляд самую навороченную микропроцессорную плату из семейства Arduino, а именно Seeeduino Mega, на базе процессора Atmega1280. Побаловавшись всласть вращающимся сервоприводом и моргающим светодиодом, встал вопрос: «зачем же я её купил?».

Я работаю одним из ведущих конструкторов на одном крупном военном Зеленоградском заводе, и в данный момент веду проект по разработке метрологического средства измерения. В данной задаче существует бесконечное множество проблем, которые требуют индивидуального решения. Одной из таких задач является управление шаговым двигателем без шумов и с шагом не 1.8 градуса, как сказано в документации шагового двигателя, а до 0.0001 градуса. Казалось бы, задача сложна и нерешабельна, но, повозившись немного со схемами управления, пришёл к выводу, что всё реально и возможно. Требуется только генерация двух сигналов специфичной формы и со сдвигом фаз и частотой изменения напряжения до 1 МГц. (Подробное исследование шагового мотора и раскрытие всех тайн управления напишу в следующей статье) Сразу же в голове стали появляться проблески надежды, что я не зря потратил 1500 рублей на свою красненькую Seeeduino, и я, набравшись энтузиазма, начал разбираться.

Первоначальный ужас:

Подключив микропроцессорную плату к осцилографу, и написав цикл digitalWrite(HIGH), и ниже digitalWrite(LOW), на осцилографе обнаружил довольно унылый меандр с частотой 50Гц. Это кошмар. Это крах, подумал я, на фоне требуемых 1Мгц.
Далее, через осцилограф, я изучил еще несколько скоростей выполнения:
AnalogRead() — скорость выполнения 110 мкс.
AnalogWrite() — 2000 мкс
SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.
DigitalWrite() — 1800мкс
DigitalRead() — 1900мкс

На этом я, всплакнув, чуть не выкинул свою Seeeduino. Но не тут-то было!

Глаза боятся, руки делают!

Не буду рассказывать свои душевные муки и описывать три долгих дня изучения, лучше сразу скажу всё как есть!
Подняв всю возможную документацию на Arduino и на процессор Atmega1280, исследовав опыт зарубежных коллег, хочу предложить несколько советов, как заменять чтение/запись:

Улучшаем AnalogRead()

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &=

_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() <
int start ;
int i ;

#if FASTADC
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif

Serial.begin(9600) ;
Serial.print(«ADCTEST: «) ;
start = millis() ;
for (i = 0 ; i

Результат: скорость 18,2 мкс против бывших 110 мкс.
Кстати, максимальная скорость АЦП Атмеги как раз 16мкс. Как вариант — использовать другую микросхему, заточенную именно под АЦП, которая позволит уменьшить скорость до 0,2мкс (читать ниже, почему)

Улучшаем digitalWrite()

Каждая Arduino/Seeeduino/Feduino/Orduino/прочаяduino имеет порты. Каждый порт — 8 бит, которые сначала надо настроить на запись. Например, на моей Seeeduino PORTA — c 22 по 30 ножку. Теперь всё просто. Управляем с 22 по 30 ножки с помощью функций
PORTA=B00001010 (битовая, ножки 23 и 25 — HIGH)
или
PORTA=10 (десятичная, всё так же)
Результат = 0,2мкс против 1800мкс, которые достигаются обычным digitalWrite()

Улучшаем digitalRead()

Практически то же самое, что и в улучшении с digitalWrite(), но теперь настраиваем ножки на INPUT, и используем, например:
if (PINA==B00000010) <. >(если на ножке 23 присутствует HIGH, а на 22 и 24-30 присутствует LOW)
Результат выполнения этого if() — 0.2мкс против 1900мкс, которые достигаются обычным digitalRead()

Улучшаем ШИМ модулятор, или analogWrite()

for (int k=0;k
Вот и получили ШИМ с частотой 19кГц против 50Гц.

Источник

Как повысить частоту шим ардуино

. Функция analogWrite не предоставляет реального аналогового выхода, вместо этого эмулируя аналоговый сигнал с помощью ШИМ (PWM).

Как повысить частоту шим ардуино

Как повысить частоту шим ардуино

Сигнал широтно-импульсной модуляции ШИМ (английская аббревиатура PWM, обозначающая Pulse Width Modulation) это сигнал, состоящий из последовательности специально сформированного двоичного сигнала. Термин «двоичный» означает, что сигнал может иметь только два состояния «HIGH» (лог. 1) и «LOW» (лог. 0). Аналоговая информация передается не уровнями сигнала, а соотношением между лог. 1 и лог. 0 (скважностью) генерируемых импульсов.

Если устройство, подключенное к выводу импульсов ШИМ, имеем меньшую полосу передачи частот, чем частота ШИМ, то получается результат фильтра низких частот (ФНЧ), и тогда ШИМ передает усредненное значение, воспринимаемой устройством как аналоговый сигнал. Выводы PWM платы Arduino Leonardo используют частоты модуляции 488 Гц или 976 Гц. Когда Вы используете функцию analogWrite, нацеленную на управление светодиодом (LED). то у светодиода полоса частот включения и выключения обычно заведомо превышает 1 кГц. Однако наши глаза имеют максимально распознаваемую частоту пульсацию не выше 100 Гц. Так как полоса частот мерцаний LED значительно превышает полосу воспринимаемых частот для глаза человека, то мы видим только среднее значение импульсов PWM (среднюю яркость свечения), не замечая того факта, что светодиод полностью включается и выключается за короткие промежутки времени импульсов PWM.

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

В целом частоты PWM в диапазоне от 500 Гц до 1 кГц коробочного Arduino вполне адекватны для управления моторами. Однако если мы хотим генерировать звуковой сигнал, то функция analogWrite не будет работать. Люди слышат частоты в диапазоне до примерно 20 кГц, что намного выше, чем частота Arduino PWM. Обычные динамики, если на них подать сигнал PWM, будут выдавать слышимый тональный звук с частотой PWM.

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

[Возможности ШИМ плат Arduino Leonardo]

Давайте рассмотрим, как формируется ШИМ на платах Arduino Leonardo. Большинство плат Arduino генерирует сигналы ШИМ с помощью таймеров. Периферийное устройство таймера предоставляет аппаратную генерацию ШИМ, не вовлекающую вычисления CPU для непосредственного формирования импульсов ШИМ. Каждый таймер имеет ограниченное количество сигналов ШИМ, которые можно генерировать аппаратно.

Плата Arduino Leonardo использует микроконтроллер ATmega32U4. У него на кристалле имеется 4 таймера: Timer 0, Timer 1, Timer 3 и Timer 4. Таймеры 1 и 3 одинаковые, однако остальные таймеры несколько отличаются. Другие платы Arduino используют другие таймеры, которые есть в наличии у микроконтроллера, установленного на плате.

В следующей таблице показано использование таймеров для генерации ШИМ платой Arduino Leonardo.

Порт ArduinoТаймер, каналЧастота ШИМ, ГцРежим
3Timer 0, B976Single Slope (Fast PWM)
5Timer 3, A488Dual Slope (Phase Corrected)
6Timer 4, D488Dual Slope (Phase Corrected)
9Timer 1, A488Dual Slope (Phase Corrected)
10Timer 1, B488Dual Slope (Phase Corrected)
11Timer 0, A976Single Slope (Fast PWM)
13Timer 4, A488Dual Slope (Phase Corrected)

Некоторые библиотеки Arduino также используют таймеры. Библиотека Servo на плате Leonardo использует Timer 1, то время как библиотека MsTimer2 использует Timer 4. Вам следует знать требования используемых библиотек к таймерам, поскольку они могут повлиять на генерацию ШИМ, связанную с их таймером.

Есть два основных способа создать сигнал ШИМ с помощью таймера. Если нужны дополнительные подробности по устройству таймера 4, см. [2].

[Single Slope PWM]

Как повысить частоту шим ардуино

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

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

Функция Arduino analogWrite() работает с Timer 0 микроконтроллера ATmega32u4 по принципу одного наклона пилы (single slope). Используется тактовая частота 250 кГц, полученная делением на 64 системной тактовой частоты 16 МГц. В результате получается частота импульсов ШИМ 976 Гц.

[Dual Slope PWM]

Другой способ генерировать ШИМ состоит в конфигурации счетчика для счета вперед и назад. Счетчик увеличивается с каждым тактом, и когда достигнет максимального значения, начинает уменьшаться на каждом такте. Уменьшение происходит до момента достижения счетчиком нуля, после чего опять начинается счет на увеличение. Это дает треугольную форму диаграммы изменения состояния счетчика вместо пилообразной, получается так называемый двухскатный ШИМ (Dual Slope PWM).

Как повысить частоту шим ардуино

Также мы можем сконфигурировать регистр сравнения, чтобы генерируемый выходной сигнал был в лог. 1, когда счетчик содержит значение меньшее, чем в этом регистре. Это также будет генерировать импульсы ШИМ, как это было в режиме Single Slope. Отличие в том, что генерируемый сигнал ШИМ получается синхронизированным по центру генерируемых импульсов.

Способ генерации ШИМ Dual Slope более точен, и поэтому лучше подходит для управления моторами. Однако его частота получается в 2 раза ниже, чем у Single Slope. В любом случае, частота ШИМ будет одинаковой у всех каналов сравнения, когда они используют один и тот же таймер.

Функция Arduino analogWrite() в режиме Dual Slope работает на микроконтроллере ATmega32U4 на таймерах 1, 3 и 4. Причина того, что Timer 0 не работает Dual Slope возможно в том, что Timer 0 используется для отслеживания реального времени, поэтому было бы сложно реализовать и на нем двухскатный принцип формирования ШИМ. В режиме двухскатного ШИМ все выводы, связанные с этим ШИМ, работают на половине частоты Timer 0, 488 Гц.

Timer 3 имеет только один аппаратный выход OC3A на порту 5 Arduino, связанный с регистром сравнения OCR3A.

Все это дает 7 выводов ШИМ, управляемых библиотеками Arduino.

[Fast PWM на Timer 1]

Если частоты 976 Гц, которую предлагает analogWrite из библиотек Arduino, недостаточно, то нам придется самостоятельно реализовать не низком уровне управление ШИМ. Timer 1 хороший кандидат, так как у него есть 3 канала сравнения, и он не будет пересекаться с функциями задержки Arduino. Следует иметь в виду, что библиотека Servo также использует Timer 1, поэтому при её использовании лучше выбрать другой таймер для ШИМ.

Timer 1 основан на 16-разрядном счетчике. Это означает, что он может считать от 0 до 65535 до возникновения переполнения. Этот таймер имеет несколько режимов работы, включая 12 режимов PWM. Самый быстрый PWM доступен в режиме Single Slope с разрядностью 8 бит, когда таймер считает от 0 до 255. Поскольку Single Slope быстрее, чем Dual Slope, этот режим также называется быстрым ШИМ (Fast PWM).

Вы также можете использовать режимы PWM разрядностью 9 и 10 бит (счет до 511 и до 1023 соответственно), которые могут работать в односкатном и двухскатном режимах. Три режима разрядности 8, 9 и 10 бит для Single Slope PWM и Single Slope PWM дают 6 режимов ШИМ. Еще 6 дополнительных режимов ШИМ дает программирование предельного счета до любого 16-разрядного значения, не ограничиваясь 255, 511 или 1023.

Таймер получает тактирование от глобального прескалера тактов микроконтроллера, что дает 5 вариантов частот тактирования, получаемых от системной частоты (у Arduino Leonardo это 16 МГц). Прескалер может делить системную частоту на 1 (т. е. нет деления), 8, 64, 256 и 1024. В таблице ниже показаны варианты частот тактирования и получающихся частот ШИМ для режима при использовании стандартных разрядностей 8, 9 и 10 бит:

Делитель18642561024Макс.
значение
счета
Частота тактов, Гц1600000020000002500006250015625
8 бит Fast PWM, Гц625007812.5976.6244.161256
9 бит Fast PWM, Гц312503906.3488.3122.130.5512
10 бит Fast PWM, Гц156251953.1244.161.015.31024
8 бит Dual Slope PWM, Гц312503906.3488.3122.130.5256
9 бит Dual Slope PWM, Гц156251953.1244.161.015.3512
10 бит Dual Slope PWM, Гц7812.5976.6122.130.57.61024

В режиме двухскатного ШИМ (Dual Slope PWM) максимальная частота ШИМ будет в 2 раза меньше. Из предыдущей таблицы мы видели, что максимальная частота ШИМ у Timer 1 составляет 62.5 кГц (Single Slope PWM). Это достаточно высокая частота для генерации аудиосигнала с помощью ШИМ.

Чтобы сконфигурировать Timer 1, мы должны запрограммировать регистры TCCR1A и TCCR1B.

№ разрядов76543210
Имена битCOM1A1COM1A0COM1B1COM1B0COM1C1COM1C0WGM11WGM10
Чтение/записьrwrwrwrwrwrwrwrw
Нач. значение00000000

• Bit 7:6 – COM1A1:0: Compare Output Mode for Channel A
• Bit 5:4 – COM1B1:0: Compare Output Mode for Channel B
• Bit 3:2 – COM1C1:0: Compare Output Mode for Channel C

Биты COM1A1:0, COM1B1:0 и COM1C1:0 управляют поведением выводов сравнения (OC1A, OC1B и OC1C соответственно). Если один или оба бита COM1A1:0 установлены в лог. 1, то выход OC1A заменяет обычный функционал порта GPIO на функционал ШИМ. То же самое относится и к битам COM1B1:0 и COM1C1:0, они по тому же самому принципу переназначают функционал портов GPIO для выводов, к которым относятся сигналы OC1B и OC1C. Однако имейте в виду, что регистр направления (Data Direction Register, DDR) должен иметь в лог. 1 биты, соответствующие разрядам OCnA, OCnB или OCnC, чтобы разрешить работу выходного драйвера для сигналов ШИМ.

Когда сигналы OC1A, OC1B или OC1C подключены к выводу порта, функция бит COM1A1:0, COM1B1:0 или COM1C1:0 зависит от настройки бит WGM13:0. Таблица 14-1 показывает функциональность бит COM1x1:0, когда биты WGM13:0 установлены в режим Normal или CTC (режимы не PWM).

Таблица 14-1. Compare Output Mode, не PWM.

COM1A1, COM1B1, COM1C1COM1A0, COM1B0, COM1C0Поведение выходов OC1A, OC1B, OC1C
00Обычная работа порта, сигнал ШИМ отключен от OC1x.
01Переключение в противоположное состояние OC1x при Compare Match.
10Очистка OC1x при Compare Match (сброс в лог. 0).
11Установка OC1x при Compare Match (установка в лог. 1).

Таблица 14-2 показывает функционал бит COM1x1:0, когда биты WGM13:0 установлены в режим Fast PWM.

COM1A1, COM1B1, COM1C1COM1A0, COM1B0, COM1C0Поведение выходов OC1A, OC1B, OC1C
00Обычная работа порта, сигнал ШИМ отключен от OC1x.
01При битах WGM13:0 в значении 14 или 15: переключение OC1A при Compare Match, OC1B и OC1C отключены (обычная работа порта GPIO). Для всех других настроек WGM1 обычная работа порта, сигналы ШИМ отключены от OC1x. См. таблицу 14-4.
10Очистка OC1x при Compare Math, установка при достижении TOP.
11Установка при Compare Match, очистка при достижении TOP.

Примечание (1). Специальный случай возникает, когда значение OCR1A, OCR1B, OCR1C равно TOP, и установлены биты COM1A1, COM1B1, COM1C1. В этом случае событие совпадения (Compare Match) игнорируется, но установка или очистка осуществляется на значении TOP. Подробнее см. описание «Fast PWM Mode» в даташите на микроконтроллер ATmega32U4.

Таблица 14-3 показывает функционал бит COM1x1:0, когда биты WGM13:0 установлены в режим Phase Correct and Frequency Correct PWM.

COM1A1, COM1B1, COM1C1COM1A0, COM1B0, COM1C0Поведение выходов OC1A, OC1B, OC1C
00Обычная работа порта, сигнал ШИМ отключен от OC1x.
01При битах WGM13:0 в значении 8, 9. 10 или 11: переключение OC1A при Compare Match, OC1B и OC1C отключены (обычная работа порта GPIO). Для всех других настроек WGM1 обычная работа порта, сигналы ШИМ отключены от OC1x. См. таблицу 14-4.
10Очистка OC1x при Compare Math, когда идет счет вверх. Установка OC1x при Compare Math, когда идет счет вниз.
11Установка OC1x при Compare Match, когда идет счет вверх. Сброс при Compare Math, когда идет счет вниз.

Примечание (1). Специальный случай возникает, когда значение OCR1A, OCR1B, OCR1C равно TOP, и установлены биты COM1A1, COM1B1, COM1C1. Подробнее см. описание «Phase Correct PWM Mode» в даташите на микроконтроллер ATmega32U4.

• Bit 1:0 – WGM11:0: Waveform Generation Mode

Вместе с битами WGM13:2, которые находятся в регистре TCCR1B (см. врезку ниже), эти биты управляют последовательностью счета, источником максимального значения (TOP) счетчика, и какой будет использоваться тип генерации формы сигнала, см. таблицу 14-4. Режимы работы, поддерживаемые таймером/счетчиком: Normal mode (счетчик), Clear Timer on Compare match (CTC) mode (сброс таймера при совпадении), и три типа режимов ШИМ (Pulse Width Modulation, PWM). Подробнее см. «Modes of Operation» в даташите на микроконтроллер ATmega32U4.

Таблица 14-4. Описание бит режимов генерации (Waveform Generation).

ModeWGM13:10Режим работы таймера/счетчикаTOPКогда произойдет обновление OCR1xКогда установится флаг TOV1
00000Normal0xFFFFНемедленноMAX
10001PWM, Phase Correct, 8-bit0x00FFTOPBOTTOM
20010PWM, Phase Correct, 9-bit0x01FFTOPBOTTOM
30011PWM, Phase Correct, 10-bit0x03FFTOPBOTTOM
40100CTCOCR1AНемедленноMAX
50101Fast PWM, 8-bit0x00FFTOPTOP
60110Fast PWM, 9-bit0x01FFTOPTOP
70111Fast PWM, 10-bit0x03FFTOPTOP
81000PWM, Phase and Frequency CorrectICR1BOTTOMBOTTOM
91001PWM, Phase and Frequency CorrectOCR1ABOTTOMBOTTOM
101010PWM, Phase CorrectICR1TOPBOTTOM
111011PWM, Phase CorrectOCR1ATOPBOTTOM
121100CTCICR1НемедленноMAX
131101Зарезервировано
141110Fast PWMICR1TOPTOP
151111Fast PWMOCR1ATOPTOP

Примечание: имена бит CTC1 и PWM11:0 устарели. Используйте вместо них имена WGM12:0. Однако функциональность этих бит и их размещение в регистрах совместимы с предыдущими версиями таймера.

№ разрядов76543210
Имена битICNC1ICES1 WGM13WGM12CS12CS11CS10
Чтение/записьrwrwrwrwrwrwrwrw
Нач. значение00000000

• Bit 7 – ICNCn: Input Capture Noise Canceler

Установка этого бита в лог. 1 активирует подавитель шума на входе захвата (Input Capture Noise Canceler). Когда активирован Noise Canceler, то сигнал с вывода Input Capture Pin (ICP1) проходит через цифровой фильтр. Функция фильтра требует, чтобы на входе появились друг за другом 4 одинаковые выборки уровня, чтобы было определено действительное изменение ICP1. Таким образом, захват по входу в случае фильтрации срабатывает с задержкой 4 такта системных тактов.

• Bit 6 – ICESn: Input Capture Edge Select

Когда сработал захват в соответствии с установкой бита ICES1, значение счетчика копируется в регистр захвата Input Capture Register (ICR1). Это событие также установит бит Input Capture Flag (ICF1), и это вызовет прерывание Input Capture Interrupt, если оно разрешено.

Когда ICR1 используется в качестве значения TOP (см. описание бит WGM13:0, которые находятся в регистрах TCCR1A и TCCR1B), то ICP1 отключается, и соответственно функция захвата по входу запрещена.

• Bit 5 – Reserved Bit

Этот бит зарезервирован для использования в будущем. Чтобы обеспечить совместимость с будущими микроконтроллерами, в него следует записывать 0, когда записывается регистр TCCR1B.

• Bit 4:3 – WGM13:2: Waveform Generation Mode

См. информацию по этим битам в описании регистра TCCR1A (врезка выше, таблица 14-4).

• Bit 2:0 – CS12:0: Clock Select

Эти три бита выбирают тактовую частоту для таймера счетчика, см. рис. 13-8 и 13-9 в даташите на микроконтроллер ATmega32U4.

Таблица 14-5. Описание бит выбора тактов.

CS12CS11CS10Asynchronous Clocking Mode
000Timer/Counter1 остановлен
001clkI/O/1 (прескалер отключен)
010clkI/O/8 (от выхода прескалера)
011clkI/O/64 (от выхода прескалера)
100clkI/O/256 (от выхода прескалера)
101clkI/O/1024 (от выхода прескалера)
110Внешний сигнал тактирования, поданный на вывод T1. Активный перепад 1->0.
111Внешний сигнал тактирования, поданный на вывод T1. Активный перепад 0->1.

Если используется внешний вывод для тактирования Timer/Counter1, то перепады на выводе T1 все равно будут подсчитаны счетчиком, даже если T1 сконфигурирован как выход. Эта функция дает возможность программно управлять счетом.

Биты 0, 1 и 2 регистра TCCR1B (CS10, CS11 и CS12) управляют опциями тактирования таймера 1, как это показано в таблице 14-5 (см. выше врезку с описанием регистра TCCR1B).

Биты 0 и 1 регистра TCCR1A (WGM10, WGM11) и биты 3 и 4 (WGM12, WGM13) регистра TCCR1B конфигурируют вид формы генерации сигнала. Соответствующие настройки показаны в таблице 14-4 (см. описание регистра TCCR1A во врезке выше). Режимы 1, 2, 3, 5, 6 и 7 из таблицы 14-4 соответствуют стандартным режимам ШИМ.

После того, как таймер сконфигурирован в один из режимов ШИМ, каждый из трех каналов сравнения A, B и C можно разрешить для генерации сигнала PWM. Для этого нужно сконфигурировать биты COM1x0 и COM1x1 (x заменяется на A, B или C) регистра TCCR1A в соответствии с таблицей 14-2 (см. описание регистра TCCR1A).

Значение сравнения ШИМ для каждого канала следует запрограммировать в регистры OCR1A, OCR1B и OCR1C.

Конфигурирования бит TCCR1A недостаточно, чтобы сигналы ШИМ появились на выводах микроконтроллера. Нам также нужно сконфигурировать их в режим выхода. По цоколевке ATmega32U4 можно увидеть, что выходы OC1A, OC1B и OC1C связаны с разрядами портов PB5, PB6 и PB7 (соответствуют портам Arduino 9, 10 и 11). Таким образом, нужно настроить эти ножки портов как выходы, что делается программирование в лог. 1 разрядов PB5, PB6 и PB7 регистра DDRB.

[Fast PWM на Timer 4]

Используя таймеры 0, 1 или 3 мы можем получить сигналы ШИМ частотой импульсов до 62.5 кГц, но максимальной частоты ШИМ можно достичь только с помощью Timer 4.

Timer 4 это 10-разрядный таймер, который может работать на очень высокой скорости счета, потому что для него есть дополнительные варианты тактирования.

В микроконтроллере ATmega32U4 имеется периферийное устройство USB. Этот периферийное устройство требует для своей работы частоты 48 МГц, которая генерируется из 16 МГц системной частоты с помощью встроенной ФАПЧ (соответствующий английский аналог этого термина Phase Locked Loop, сокращенно PLL). В плате Arduino Leonardo PLL получает на входе 16 МГц системной тактовой частоты, и умножением на 6 получает 96 МГц.

Имейте в виду, что неправильная конфигурация PLL микроконтроллера Arduino Leonardo нарушит обмен данными через её интерфейс USB. Вам всего лишь следует знать, что PLL может предоставлять свой выходной сигнал для тактирования Timer 4.

Регистр PLLFRQ, управляющий конфигурацией PLL, имеет много других установок, но нас интересуют только биты PLLTM0 и PLLTM1, которые определяют входную тактовую частоту для Timer 4.

№ разрядов76543210
Имена битPINMUXPLLUSBPLLTM1PLLTM0PDIV3PDIV2PDIV1PDIV0
Чтение/записьrwrwrwrwrwrwrwrw
Нач. значение00000100

• Bit 7– PINMUX: PLL Input Multiplexer

Этот бит выбирает входную тактовую частоту для PLL:

PINMUX = 0: вход PLL подключен к PLL Prescaler, который получает в качестве источника главную системную частоту (Primary System Clock).

PINMUX = 1: вход PLL напрямую подключен к внутреннему калиброванному RC-генератору 8 МГц. Этот режим позволяет работать USB Low Speed без использования внешнего кварцевого резонатора, или при использовании внешнего резонатора на частоту, отличающуюся от 8 или 16 МГц.

• Bit 6– PLLUSB: PLL Postcaler for USB Peripheral

Этот бит выбирает коэффициент деления между выходной частотой PLL и входной частотой модуля USB:

PLLUSB = 0: нет деления прямое подключение (если PLL Output = 48 МГц).

PLLUSB = 1: частота PLL Output делится на 2, и передается в модуль USB (если PLL Output = 96 МГц).

• Bit 5:4 – PLLTM1:0: PLL Postcaler for High Speed Timer

Эти биты кодируют коэффициент деления между выходной частотой ФАПЧ (PLL Output) и тактовым входом высокоскоростного таймера (High Speed Timer).

Имейте в виду, что коэффициент деления 1.5 вводит некоторый дополнительный джиттер в тактовую частоту, но связанная с этим ошибка близка к нулю, поскольку средняя скважность тактов 50% (см. рис. 6-7).

PLLTM1PLLTM0Коэффициент постскалера PLL для высокоскоростного таймера
000 (отключено)
011
101.5
112

Как повысить частоту шим ардуино

Рис. 6-7. Работа PLL Postcaler с коэффициентом деления 1.5.

• Bit 3:0 – PDIV3:0 PLL Lock Frequency

Эти биты конфигурируют опорную частоту внутреннего генератора ФАПЧ, управляемого напряжением (PLL internal VCO clock reference) в соответствии с требуемой выходной частотой.

PDIV3PDIV2PDIV1PDIV0Выходная частота PLL
0000Не допускается
0001Не допускается
0010Не допускается
001140 МГц
010048 МГц
010156 МГц
0110Не допускается
011172 МГц
100080 МГц
100188 МГц
101096 МГц
1011Не допускается
1100Не допускается
1101Не допускается
1110Не допускается
1111Не допускается

Оптимальная конфигурация PLL на 5V (выделено в таблице жирным шрифтом): PLL output = 96 МГц, поделенная на 1.5 для генерации тактов 64 МГц для High Speed Timer, и деленная на 2 для генерации тактовой частоты 48 МГц блока USB.

Есть 4 опции тактирования: не использовать PLL для тактирования таймера (тогда он будет получать системные такты), или использовать выход PLL, поделенный на 1, 1.5 или 2. Последние 3 варианта дадут тактовые частоты 96, 64 или 48 МГц.

№ разрядов76543210
Имена битPWM4X PSR4DTPS41DTPS40 CS43 CS42 CS41 CS40
Чтение/записьrwrwrwrwrwrwrwrw
Нач. значение00000000

Когда этот бит установлен в лог. 1, выбирается режим инверсии ШИМ (PWM Inversion Mode), и инвертируются выходы Dead Time Generator, OC4x и

Когда этот бит установлен в лог. 1, прескалер Timer/Counter4 будет сброшен (без влияния на TCNT4). Этот бит очистится аппаратно после завершения выполнения этой операции сброса прескалера. Запись в лог. 0 этого бита не оказывает никакого эффекта. Этот бит всегда читается как 0.

Отдельный прескалер Dead Time, установленный перед Dead Time Generator, может делить частоту тактов Timer/Counter4 (PCK или CK) на коэффициенты 1, 2, 4 или 8, предоставляя тем самым большой диапазон регулировки интервалов мертвого времени. Прескалер Dead Time управляется двумя битами DTPS41 и DTPS40 регистра Dead Time Prescaler. Эти биты определяют коэффициент деления прескалера Dead Time (см. таблицу 15-13).

Таблица 15-13. Коэффициенты деления прескалера мертвого времени.

DTPS41DTPS40Коэффициент, на который прескалер делит частоту тактов Timer/Counter4
001 (нет деления частоты)
012
104
118

Эти биты определяют источник тактирования и коэффициент предделителя Timer/Counter4 (см. таблицу 15-14).

Таблица 15-14. Timer/Counter4 Prescaler Select.

CS43CS42CS41CS40Asynchronous Clocking ModeSynchronous Clocking Mode
0000Timer/Counter4 остановлен
0001PCKCK
0010PCK/2CK/2
0011PCK/4CK/4
0100PCK/8CK/8
0101PCK/16CK/16
0110PCK/32CK/32
0111PCK/64CK/64
1000PCK/128CK/128
1001PCK/256CK/256
1010PCK/512CK/512
1011PCK/1024CK/1024
1100PCK/2048CK/2048
1101PCK/4096CK/4096
1110PCK/8192CK/8192
1111PCK/16384CK/16384

Настройка, указанная в первой строке таблицы 15-14, предоставляет возможность запрета таймера.

Таким образом, с помощью PLL и делителей Timer 4 можно получить входные частоты таймера между 96 МГц и 5859 Гц.

Так же, как это делалось для Timer 1, для Timer 4 нужно выбрать форму генерации выходного сигнала битами WGM40 и WGM41 регистра TCCR4D.

№ разрядов76543210
Имена битFPIE4FPEN4FPNC4FPES4FPAC4FPF4WGM41WGM40
Чтение/записьrwrwrwrwrwrwrwrw
Нач. значение00000000

Установка этого бита в лог. 1 разрешает прерывание Fault Protection.

• Бит 6– FPEN4: Fault Protection Mode Enable

Установка этого бита в лог. 1 активирует Fault Protection Mode.

• Бит 5 – FPNC4: Fault Protection Noise Canceler

Установка этого бита в лог. 1 активирует Fault Protection Noise Canceler (подавитель помех сигнала срабатывания защиты). Когда подавитель помех активирован, вход вывода Fault Protection (INT0) проходит через цифровой фильтр. Эта функция требует четырех одинаковых значений, появившихся на выводе INT0, чтобы был обнаружен сигнал. Таким образом, срабатывание защиты Fault Protection имеет задержку на 4 такта системного генератора, когда функция подавителя помех активирована.

• Бит 4 – FPES4: Fault Protection Edge Select

Этот бит выбирает, какой перепад на выводе Fault Protection (INT0) будет использоваться как событие сигнала для срабатывания защиты. Когда в бит FPES4 записан лог. 0, активным сигналом будет спад уровня, и когда в бит FPES4 записана лог. 1, активным сигналом будет нарастание уровня.

Когда в этот бит записана лог. 1, то разрешена функция Fault Protection для Timer/Counter4, срабатывающая от выхода аналогового компаратора. В этом случае выход этого компаратора напрямую подключается ко входу логики Fault Protection, при этом сигнал от компаратора использует те же функции подавителя помех и выбора перепада, как это работало со входом INT0. Когда в этот бит записан лог. 0, то между функцией Fault Protection и аналоговым компаратором соединение отсутствует. Чтобы компаратор вызвал срабатывание прерывания Timer/Counter4 Fault Protection, должен быть установлен бит FPIE4 регистра управления Timer/Counter4 Control Register D (TCCR4D).

Когда бит FPIE4 установлен в лог. 1, разрешено прерывание Fault Protection. Активность на этом выводе в любом случае вызовет запрос на прерывание, даже если вывод Fault Protection сконфигурирован как выход. Прерывание, соответствующее запросу Fault Protection Interrupt, запустится по адресу Fault Protection Interrupt Vector. Бит FPF4 очищается аппаратно, когда выполняется соответствующий вектор прерывания. Альтернативно FPF4 очищается после такта синхронизации путем записи лог. 1 в этот флаг. Когда когда установлен бит I регистра SREG, а также биты FPIE4 и FPF4, запустится обработчик прерывания Fault Protection.

Эти биты связаны с битом PWM4x для совместного управления последовательностью счета таймера и типом формируемого сигнала (см. таблицу 15-18).

Режимы работы, поддерживаемые Timer/Counter4: Normal mode (обычный режим, счетчик), Fast PWM Mode (быстрый ШИМ), Phase and Frequency Correct PWM (ШИМ повышенного качества) и PWM6 (режим для управления трехфазными бесколлекторными двигателями BLDC).

Таблица 15-18. Описание бит настройки режима Waveform Generation.

PWM4xWGM41:40Режим работы таймера/счетчикаTOPКогда произойдет обновление OCR4xКогда установится флаг TOV4
000NormalOCR4CНемедленноTOP
100Fast PWMOCR4CTOPTOP
101Phase and Frequency Correct PWMOCR4CBOTTOMBOTTOM
110PWM6 / Single-slopeOCR4CTOPTOP
111PWM6 / Dual-slopeOCR4CBOTTOMBOTTOM

Доступны опции Fast PWM, Phase and Frequency Correct PWM, PWM6 Single Slope и PWM6 Dual Slope (см. таблицу 15-18 врезки выше).

PWM6 это специальный режим PWM, который для управления BLDC двигателем использует сразу 3 канала ШИМ, A, B и D (подробнее см. [2]).

№ разрядов76543210
Имена битCOM4A1COM4A0COM4B1COM4B0FOC4AFOC4BPWM4APWM4B
Чтение/записьrwrwrwrwwwrwrw
Нач. значение00000000

• 7, 6 – COM4A1, COM4A0: Comparator A Output Mode

Эти биты управляют поведением выхода генератора сигналов Waveform Output (OCW4A) и подключением вывода Output Compare (OC4A). Если установлены оба бита COM4A1:0, то выход OC4A отменяет обычный функционал порта GPIO, к которому OC4A подключен. Комплементарный выход

OC4A подключается только в режимах PWM, когда биты COM4A1:0 установлены в 01. Обратите внимание, что биты регистра направления (DDR), соответствующие сигналам OC4A и

OC4A, должны быть установлены, чтобы заработал выходной драйвер этих сигналов.

Функция бит COM4A1:0 зависит от настроек бит PWM4A, WGM40 и WGM41. Таблица 15-5 показывает функциональность бит COM4A1:0, когда установлен бит PWM4A, в обычном режиме (Normal Mode, не PWM).

Таблица 15-5. Compare Output Mode, Normal Mode (не PWM).

COM4A1COM4A0Поведение OCW4AВыв. OC4AВыв.

OC4A

00Обычная работа портаОтключенОтключен
01Переключение при Compare MatchПодключенОтключен
10Очистка при Compare MatchПодключенОтключен
11Установка при Compare MatchПодключенОтключен

Таблица 15-6 показывает функциональность бит COM4A1:0, когда биты PWM4A, WGM40 и WGM41 установлены в режим быстрого ШИМ.

Таблица 15-6. Compare Output Mode, Fast PWM Mode.

COM4A1COM4A0Поведение OCW4AВыв. OC4AВыв.

OC4A

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match, установка при TCNT4=0x000ПодключенПодключен
10ПодключенОтключен
11Установка при Compare Match, очистка при TCNT4=0x000ПодключенОтключен

Таблица 15-7 показывает функциональность бит COM4A1:0, когда биты PWM4A, WGM40 и WGM41 установлены в режим Phase and Frequency Correct PWM.

Таблица 15-7. Compare Output Mode, Phase and Frequency Correct PWM Mode.

COM4A1COM4A0Поведение OCW4AВыв. OC4AВыв.

OC4A

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match и счете вверх, установка при Compare Match и счете внизПодключенПодключен
10ПодключенОтключен
11Установка при Compare Match и счете вверх, очистка при Compare Match и счете внизПодключенОтключен

Таблица 15-8 показывает функциональность бит COM4A1:0, когда биты PWM4A, WGM40 и WGM41 установлены в односкатный режим PWM6. В режиме PWM6 используется один и тот же сигнал Waveform Output (OCW4A) для генерации всех сигналов, и значения Output Compare OC4A и

OC4A подключены к выводам OC4A,

Таблица 15-8. Compare Output Mode, Single-Slope PWM6 Mode.

OC4A

COM4A1COM4A0Поведение OCW4AВыв. OC4AВыв.

OC4A

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match, установка при TCNT4=0x000OC4A
10OC4AOC4A
11Установка при Compare Match, очистка при TCNT4=0x000OC4AOC4A

Таблица 15-9 показывает функциональность бит COM4A1:0, когда биты PWM4A, WGM40 и WGM41 установлены в двухскатный режим PWM6.

Таблица 15-9. Compare Output Mode, Dual-Slope PWM6 Mode.

OC4A

COM4A1COM4A0Поведение OCW4AВыв. OC4AВыв.

OC4A

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match и счете вверх, установка при Compare Match и счете внизOC4A
10OC4AOC4A
11Установка при Compare Match и счете вверх, очистка при Compare Match и счете внизOC4AOC4A

Эти биты управляют поведением выхода генератора сигнала Waveform Output (OCW4B), и подключается в ножке Output Compare (OC4B). Если один или оба бита COM4B1:0 установлены, то выход OC4B отменяет нормальный функционал порта GPIO вывода микроконтроллера, к которому подключен OC4B. Комплементарный выход

OC4B подключен только в режимах PWM, когда биты COM4B1:0 установлены в 01. Обратите внимание, что биты регистра направления (DDR), соответствующие сигналу OC4B, должны быть установлены, чтобы разрешить работу выходного драйвера.

Функция бит COM4B1:0 зависит от настроек бит PWM4B и WGM40.

Таблица 15-10 показывает функциональность бит COM4B1:0, когда бит PWM4B установлен в режим Normal (не PWM).

Таблица 15-10. Compare Output Mode, Normal Mode (не PWM).

COM4B1COM4B0Поведение OCW4BВыв. OC4BВыв.

OC4B

00Обычная работа портаОтключенОтключен
01Переключение при Compare MatchПодключенОтключен
10Очистка при Compare MatchПодключенОтключен
11Установка при Compare MatchПодключенОтключен

Таблица 15-11. Показывает функциональность бит COM4B1:0, когда биты PWM4B и WGM40 установлены в режим Fast PWM.

Таблица 15-11. Compare Output Mode, Fast PWM Mode.

COM4B1COM4B0Поведение OCW4BВыв. OC4BВыв.

OC4B

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match, установка при TCNT4=0x000ПодключенПодключен
10ПодключенОтключен
11Установка при Compare Match, очистка при TCNT4=0x000ПодключенОтключен

Таблица 15-12 показывает функциональность бит COM4B1:0, когда биты PWM4B и WGM40 установлены в режим Phase and Frequency Correct PWM.

Таблица 15-12. Compare Output Mode, Phase and Frequency Correct PWM Mode.

COM4B1COM4B0Поведение OCW4BВыв. OC4BВыв.

OC4B

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match и счете вверх, установка при Compare Match и счете внизПодключенПодключен
10ПодключенОтключен
11Установка при Compare Match и счете вверх, очистка при Compare Match и счете внизПодключенОтключен

Бит FOC4A активен только когда бит PWM4A задает режим не PWM.

При записи лог. 1 в этот бит принудительно меняется сигнал Waveform Output (OCW4A) и вывод Output Compare (OC4A) в соответствии со значениями, уже установленными в COM4A1 и COM4A0. Если COM4A1 и COM4A0 записаны в том же цикле, что и FOC4A, то будут использоваться новые установки. Бит Force Output Compare может использоваться для изменения значения выходного вывода, не обращая внимание на значение таймера. Произойдет автоматическое действие, запрограммированное COM4A1 и COM4A0, как если бы произошло событие совпадения, но при этом не будет сгенерировано прерывание.

Бит FOC4A всегда читается как 0.

Бит FOC4B активен только когда бит PWM4B задает режим не PWM.

При записи лог. 1 в этот бит принудительно меняется сигнал Waveform Output (OCW4B) и вывод Output Compare (OC4B) в соответствии со значениями, уже установленными в COM4B1 и COM4B0. Если COM4B1 и COM4B0 записаны в том же цикле, что и FOC4B, то будут использоваться новые установки. Бит Force Output Compare может использоваться для изменения значения выходного вывода, не обращая внимание на значение таймера. Произойдет автоматическое действие, запрограммированное COM4B1 и COM4B0, как если бы произошло событие совпадения, но при этом не будет сгенерировано прерывание.

Бит FOC4B всегда читается как 0.

Когда этот бит установлен в лог. 1, то разрешается режим PWM, основанный на компараторе OCR4A.

Когда этот бит установлен в лог. 1, то разрешается режим PWM, основанный на компараторе OCR4B.

№ разрядов76543210
Имена битCOM4A1SCOM4A0SCOM4B1SCOMAB0SCOM4D1COM4D0FOC4DPWM4D
Чтение/записьrwrwrwrwrwrwrwrw
Нач. значение00000000

Эти биты затеняют биты COM4A1 и COM4A0, как это указано в описании регистра TCCR4A – Timer/Counter4 Control Register A (см. врезку выше).

Эти биты затеняют биты COM4B1 и COM4B0, как это указано в описании регистра TCCR4A – Timer/Counter4 Control Register A (см. врезку выше).

Эти биты управляют поведением выхода генератора сигнала Waveform Output (OCW4D) и подключением к выводу Output Compare (OC4D). Если один или оба бита COM4D1:0 установлены, то выход OC4D отменяет функциональность ножек порта GPIO, к которым подключается сигнал OC4D. Комплементарный выход

OC4D подключается только в режимах PWM, когда биты COM4D1:0 установлены в 01. Обратите внимание, что биты регистра направления (DDR), соответствующие ножкам OC4D, должны быть установлены, чтобы разрешить работу выходного драйвера.

Функция бит COM4D1:0 зависит от настроек бит PWM4D и WGM40.

Таблица 15-15 показывает функционал бит COM4D1:0, когда бит PWM4D установлен в режим Normal (не PWM).

Таблица 15-15. Compare Output Mode, Normal Mode (не PWM).

COM4D1COM4D0Поведение OCW4DВыв. OC4DВыв.

OC4D

00Обычная работа портаОтключенОтключен
01Переключение при Compare MatchПодключенОтключен
10Очистка при Compare MatchПодключенОтключен
11Установка при Compare MatchПодключенОтключен

Таблица 15-16 показывает функционал бит COM4D1:0, когда биты PWM4D и WGM40 установлены в режим быстрого ШИМ.

Таблица 15-16. Compare Output Mode, Fast PWM Mode.

COM4D1COM4D0Поведение OCW4DВыв. OC4DВыв.

OC4D

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match, установка при TCNT4=0x000ПодключенПодключен
10ПодключенОтключен
11Установка при Compare Match, очистка при TCNT4=0x000ПодключенОтключен

Таблица 15-17 показывает функциональность бит COM4D1:0, когда биты PWM4D и WGM40 установлены в режим Phase and Frequency Correct PWM.

Таблица 15-17. Compare Output Mode, Phase and Frequency Correct PWM Mode.

COM4D1COM4D0Поведение OCW4DВыв. OC4DВыв.

OC4D

00Обычная работа портаОтключенОтключен
01Очистка при Compare Match и счете вверх, установка при Compare Match и счете внизПодключенПодключен
10ПодключенОтключен
11Установка при Compare Match и счете вверх, очистка при Compare Match и счете внизПодключенОтключен

Бит FOC4D активен только когда бит PWM4D задает режим не PWM.

При записи лог. 1 в этот бит принудительно меняется сигнал Waveform Output (OCW4D) и вывод Output Compare (OC4D) в соответствии со значениями, уже установленными в COM4D1 и COM4D0. Если COM4D1 и COM4D0 записаны в том же цикле, что и FOC4D, то будут использоваться новые установки. Бит Force Output Compare может использоваться для изменения значения выходного вывода, не обращая внимание на значение таймера. Произойдет автоматическое действие, запрограммированное COM4D1 и COM4D0, как если бы произошло событие совпадения, но при этом не будет сгенерировано прерывание.

Бит FOC4D всегда читается как 0.

Когда этот бит установлен в лог. 1, то разрешается режим PWM, основанный на компараторе OCR4D.

В скетче Arduino, показанном ниже, собраны все режимы генерации ШИМ на основе Fast PWM. В скетче имеется код, необходимый для работы 5 выводов портов, связанных с таймерами 1 и 4 в режимах Fast PWM. Этот скетч доступен на GitHub [3].

Код Timer 1. Этот код включает 4 функции и соответствующие определения. Используются все три канала сравнения Timer 1 для генерации сигналов ШИМ на портах Arduino 9, 10 и 11.

Функция pwm91011configure должна быть предварительно вызвана, чтобы можно было воспользоваться любыми другими функциями, связанными с этим таймером. Она сконфигурирует таймер для работы в режиме Single Slope Fast PWM, и установит прескалер в режим, указанный в аргументе функции. Есть 5 возможных режимов PWM62k, PWM8k, PWM1k, PWM244 и PWM61, связанных с четырьмя доступными частотами режимов Single Slope 8 bit PWM.

После того, как будет вызвана одна из трех вышеуказанных функций, значение ШИМ может быть быстро изменено прямым доступом к соответствующему регистру сравнения канала. Для упрощения доступа сделаны три определения PWM9, PWM10 и PWM11, связанные с регистрами OCR1A, OCR1B и OCR1C.

Код Timer 4. Этот код включает 3 функции и несколько определений. Используется два из трех доступных каналов сравнения A и D, связанных с портами Arduino 13 и 6. Канал B не используется, потому что он конфликтует с портом 10 Arduino, который используется в канале B Timer 1.

Функция pwm613configure подобна аналогичной, определенной для Timer 1. Она установит режимы PLL и PWM для правильного конфигурирования Timer 4 в высокоскоростном режиме 48 МГц PLL, и установит предел счета в регистре OCR4C установкой всех его 8 бит (значение 255).

Входной аргумент установит один из семи доступных частот прескалера для 48 МГц на тактовом входе Timer 4: PWM187k (187500 Гц), PWM94k (93750 Гц), PWM47k (46875 Гц), PWM23k (23437 Гц), PWM12k (11719 Гц), PWM6k (5859 Гц) и PWM3k (2930 Гц). Если Вы помните, у Timer 4 есть 15 опций прескалера тактов. Нижняя частота не реализована в этих определениях, поскольку она не дает никаких преимуществ перед функционалом стандартной функции analogWrite.

Функции pwmSet13 и pwmSet6 конфигурируют каналы Timer 4, связанные с портами 13 и 6 Arduino, чтобы они работали в режиме ШИМ, и устанавливает значение для ШИМ (от 0 до 255).

Подобно тому, как это делается для таймера 1, посте того, как одна из этих двух функций будет вызвана, значение ШИМ может быть быстро изменено прямым доступом к соответствующему регистру сравнения. Для этой цели сделаны два определения PWM13 и PWM6, связанные соответственно с регистрами сравнения OCR4A и OCR4D. Добавлено дополнительное определение PWM6_13_MAX для доступа к регистру OCR4C, что установит предельное значение счета ШИМ (по умолчанию установлено 255, что дает разрешающую способность ШИМ 8 бит).

Код Setup и Loop. Для проверки работы всех этих функций Timer 1 сконфигурирован в функции setup для генерации сигналов ШИМ на частоте 62.5 кГц. Timer 4 сконфигурирован на частоту 187 кГц. Генерируется 4 сигнала ШИМ. На выводах портов 11 и 13 установлены значения скважности ШИМ 11% и 75%. Для выводов портов 6 и 9 в функции loop программируется переменное значение скважности ШИМ от 0% до 100%.

Форма сгенерированных сигналов ШИМ. На следующей картинке показаны полученные сигналы ШИМ, захвачены логическим анализатором.

Как повысить частоту шим ардуино

Сигналы Timer 1 на выводах портов 9 и 11 имеют одинаковый фронт нарастания уровня, потому что они работают на одном и том же таймере и в одинаковом режиме. То же самое относится и к портам 6 и 13, сигналы на которых генерируются Timer 4. Сигналы ШИМ разных таймеров имеют разные частоту, поэтому фронт нарастания уровня сигналов ШИМ не совпадает у разных таймеров.

Это простой пример программирования микроконтроллера ATmega32U4 на языке C. Микроконтроллер установлен на плате AVR-USB32U4 [4] (аналог Arduino Leonardo). Пищалка (пьезокерамический излучатель звука) подключен к выходу канала B таймера 4, это ножки портов PB5 (

Как повысить частоту шим ардуино

Таймер 4 тактируется от системной тактовой частоты 16 МГц, поделенной на 256. ШИМ настраивается в 10-битном режиме Fast PWM, с противофазным формированием сигнала на

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *