GrabDuck

Таймеры-счётчики Arduino - Vanyamba uses Linux

:

Флаг переполнения TOVn в режиме CTC устанавливается так же, как и в нормальном режиме.

В этом режиме таймер-счётчик на каждом такте увеличивает на единицу значение регистра TCNTn от 0 до верхней границы регистра (255 для 8-битных таймеров или 65535 для 16-битного). При переполнении, как и в нормальном режиме, устанавливается флаг переполнения TOVn, а также обновляется значение совпадения из регистра OCRnx (двойная буферизация).

Вывод OCnx в этом режиме может работать как нормальном режиме, так и в инверсном. В нормальном режиме он устанавливается в высокий уровень при TCNTn равном 0, и в низкий уровень при совпадении значений регистров TCNTn и OCRnx. В инверсном режиме - наоборот.

Временная диаграмма работы таймера-счётчика в режиме быстрого ШИМ:


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

Для расчёта Частоты ШИМ можно применить формулу

        Fpwm = Fclk / (N*256),

где Fclk равен тактовой частоте таймера-счётчика, а N равен коэффициенту предделителя (например, 1, 8, 32, 64, ...).

Если записать в регистр OCRnx значение половины верхней границы (127 для 8-битных счётчиков или 32767 для 16-битного), то логический уровень на выводе OCnx будет переключаться с половиной тактовой частоты таймера, так же, как и режиме CTC, но при этом можно использовать двойную буферизацию регистра OCRnx.

Значения, близкие к верхней и нижней границам TCNTn - это особый случай. Если записать в регистр OCRnx ноль, то напряжение на выводе OCnx в нормальном режиме будет изменяться краткими импульсами каждые 256 или 65536 тактов. А если записать 255 или 65535, то оно постоянно равно логической единице в нормальном режиме или нулю - в инверсном.

Режим ШИМ с коррекцией фазы.

В этом таймер-счётчик на каждом такте увеличивает на единицу значение регистра TCNTn от 0 до верхней границы, а затем уменьшает значение TCNTn до 0, и т.д. В качестве верхней границы может выступать как максимальное значение регистра (255 для 8-битных таймеров и 65535 для 16-битного), так и значение регистра OCRnx. Регистр TCNTn принимает верхнее или нижнее значение на 1 такт.

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

Временная диаграмма работы таймера-счётчика в режиме ШИМ с коррекцией фазы:


Флаг прерывания TOVn в этом режиме устанавливается, когда регистр TCNTn равен 0.

Вывод OCnx переключается при совпадении регистров TCNTn и OCnx. Когда значение регистра TCNTn увеличивается, состояние вывода OCnx переключается из логического нуля в единицу, и наоборот, когда значение регистра уменьшается. Он также может работать как в нормальном режиме вывода, так и в инверсном.

Если регистр OCRnx имеет значение 255 (65535) или 0, то вывод OCnx постоянно пребывает либо в состоянии логической единицы, либо в состоянии логического нуля.

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

  • Регистр OCRnx изменяет значение с 255 (65535) на меньшее. Чтобы обеспечить симметрию относительно 0 при обновлении OCRnx таймер переключает состояние вывода.
  • При запуске таймера-счётчика регистр TCNTn имеет значение, большее, чем OCRnx.
Частота ШИМ для этого режима может быть рассчитана по формуле

        Fpwm = Fclk / (N*510),

где Fclk равен тактовой частоте таймера, а N равен коэффициенту предделителя (например, 1, 8, 32, 64, ...).

При чтении документации лично я сделал вывод, что если в качестве верхней границы в этом режиме используется значение регистра OCRnx, то переключение вывода OCnx будет происходить, только если его каждый раз менять во время очередного периода. Поскольку если значение регистра равно верхней границе, которая в данном случае задаётся значением OCRnx, то на выводе будет постоянно высокий или низкий уровень, в зависимости от режима вывода нормального либо инверсного.

Режим ШИМ с коррекцией фазы и частоты.

Этот режим доступен для 16-битного таймера-счётчика 1 и только для вывода OC1A. В этом режиме таймер-счётчик также как и в режиме ШИМ с коррекцией фазы увеличивает значение регистра TCNTn на единицу на каждом такте до достижения верхней границы, а затем уменьшает до нуля, и т.д. Верхней границей также может быть 65535 либо значение OCR1A.

Отличие от режима ШИМ с коррекцией фазы состоит в том, что в этом режиме значение регистра OCR1A обновляется из буферного регистра не при TCNT1, равном верхней границе,  а при TCNT1 равном 0.

Временная диаграмма работы таймера-счётчика в режиме ШИМ с коррекцией фазы и частоты:

Из диаграммы видно, что этот режим также отличается от режима ШИМ с коррекцией фазы тем, что в точке 0 вывод OC1A находится в нормальном режиме вывода в состоянии логической единицы, а не нуля. При совпадении значений регистров TCNT1 и OCR1A cостояние вывода OC1A переключается из логической единицы в ноль, когда значение регистра TCNT1 увеличивается, и из логического нуля в единицу, когда значение регистра TCNT1 уменьшается.

Частота ШИМ в этом режиме задаётся значением либо регистра OCR1А, либо регистра ICR1 (при использовании модуля захвата ввода). Минимальное разрешение составляет 2 бита, таким образом минимальное значение для этих регистров равно 3. Максимальное разрешение составляет 16 бит.

Разрешение ШИМ в битах может быть рассчитано по формуле

        Rpwm = log(TOP+1) / log(2),

где TOP равен верхней границе ШИМ.

Для расчёта частоты ШИМ применима формула

        Fpwm = F   clk/ (2*N*TOP),

где TOP равен верхней границе таймера, а N равен коэффициенту предделителя (то есть 1, 8, 64, 256 или 1024).

Регистр TCNT1 принимает значение верхней или нижней границы на 1 такт.

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

На диаграмме видно, что сигнал на выводе симметричен во всех периодах. Таким образом, импульсы в этом режиме фазово и частотно корректны.

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

Значение верхней границы и нуля в качестве значения регистра OCR1A - это особые случаи в этом режиме. При OCR1A равном верхней границе, вывод OC1A находится в состоянии высокого уровня в нормальном режиме вывода. При OCR1A равном нулю на выводе OC1A логический ноль. В инверсном режиме вывода - наоборот.

Если регистр OCR1A используется для задания верхней границы, на выводе OC1A генерируется ШИМ с 50%-ным циклом заполнения.

Модуль захвата ввода.

Таймер-счётчик 1 дополнительно оснащён устройством захвата ввода, которое может срабатывать по фронтам внешнего сигнала, подаваемого на вывод ICP1 (вывод Digital с номером 8), либо по переднему фронту импульса, либо по заднему. Вместо цифрового входа ICP1 модуль захвата ввода может использовать как триггер сигнал от аналогового компаратора.

При возникновении заданного события модуль захвата ввода копирует в 16-битный регистр ICR1 (пара 8-битных регистров ICR1H и ICR1L) текущее значение регистра TCNT1 и устанавливает флаг прерывания ICF1 (вектор прерывания TIMER1_CAPT_vect). Это значение можно использовать для вычисления частоты сигналов, циклов заполнения ШИМ, и т.п.

Если во время обработки прерывания происходит очередное событие модуля захвата ввода, то значение регистра ICR1 изменяется. Поэтому при обработке прерывания оно должно быть считано в первую очередь. Сперва считывается младший байт из регистра ICR1L, затем старший байт - ICR1H, поскольку при чтении значения из регистра ICR1L значение регистра ICR1H буферизируется. Это нужно для того, чтобы при возможном изменении значения регистра ICR1 между чтением ICR1L и ICR1H не получилось так, что младший байт ICR1 оказался бы из одного события, а старший из другого.

Запись значений в регистр ICR1 доступна только при использовании его для задания верхней границы для таймера 1. При использовании модуля захвата ввода он доступен только для чтения.

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

Режимы генерирования сигналов таймерами-счётчиками.

Ниже приведены таблицы доступных режимов работы таймеров счётчиков.

Режимы 8-битных таймеров-счётчиков 0 и 2.

 Номер  Режим таймера-счётчика
 Верхняя точка
 Обновление OCRnx
 Установка флага TOVn
 0  Нормальный  0xFF  Сразу же
 0xFF
 1  ШИМ с коррекцией фазы
 0xFF  В верхней точке
 0
 2  CTC  OCRA  Сразу же
 0xFF
 3  Быстрый ШИМ
 0xFF  В нижней точке
 0xFF
 4  (Зарезервирован)  -  -  -
 5  ШИМ с коррекцией фазы
 OCRA  В верхней точке
 0
 6  (Зарезервирован)  -  -  -
 7  Быстрый ШИМ
 OCRA  В нижней точке
 В верхней точке

Режимы 16-битного таймера-счётчика 1.

 Номер  Режим таймера-счётчика
 Верхняя точка
 Обновление OCRnx
 Установка флага TOVn
 0  Нормальный  0xFFFF  Сразу же
 0xFFFF
 1  ШИМ с коррекцией фазы, 8-битный
 0x00FF  В верхней точке
 0
 2  ШИМ с коррекцией фазы, 9-битный
 0x01FF  В верхней точке
 0
 3  ШИМ с коррекцией фазы, 10-битный
 0x03FF  В верхней точке  0
 4  CTC  OCR1A  Сразу же  0xFFFF
 5  Быстрый ШИМ, 8-битный
 0x00FF  В нижней точке
 В верхней точке
 6  Быстрый ШИМ, 9-битный
 0x01FF  В нижней точке  В верхней точке
 7  Быстрый ШИМ, 10-битный
 0x03FF  В нижней точке  В верхней точке
 8  ШИМ с коррекцией фазы и частоты
 ICR1  В нижней точке  0
 9  ШИМ с коррекцией фазы и частоты
 OCR1A  В нижней точке  0
 10  ШИМ с коррекцией фазы
 ICR1  В верхней точке  0
 11  ШИМ с коррекцией фазы
 OCR1A  В верхней точке  0
 12  CTC  ICR1  Сразу же  0xFFFF
 13  (Зарезервирован)  -  -  -
 14  Быстрый ШИМ
 ICR1  В нижней точке  В верхней точке
 15  Быстрый ШИМ
 OCR1A  В нижней точке  В верхней точке


См. далее