Аппаратный блок 16-разрядного таймера/счетчика 1 (далее для сокращения TC1) позволяет программе точно работать в реальном времени (отслеживать события), генерировать звук и измерять длительности импульсов.
Основные возможности TC1:
• Честный 16-битный дизайн (например, он дает возможность аппаратно реализовать 16-разрядный ШИМ). • Два независимых друг от друга узла сравнения (Output Compare Units). • Регистры сравнения с двойной буферизацией (Double Buffered Output Compare Registers). • Один узел захвата по входу (Input Capture Unit). • Блок подавления шума на входе захвата (Input Capture Noise Canceler). • Автоматический сброс таймера при событии захвата, Clear Timer on Compare Match (Auto Reload, автоперезагрузка). • Модулятор ШИМ без дрожания фронтов, с корректной фазой (Glitch-free, Phase Correct Pulse Width Modulator, PWM). • Изменяемый период ШИМ. • Генератор частот. • Счетчик внешних событий (External Event Counter). • 4 независимых источника прерывания (TOV1, OCF1A, OCF1B и ICF1).
Примечание: в этом описании большинство имен регистров и бит написаны в общей форме. В некоторых местах n в нижнем регистре заменяется номером таймера/счетчика. В частности, в этом тексте n почти всегда заменяется на 1, что означает Timer/Counter 1, или TC1 (во врезке про прескалер буква n оставлена, потому что информация по прескалеру относится к обоим таймерам 0 и 1, поэтому буква n может быть заменена на 0 или 1). Буква x в нижнем регистре часто заменяет обозначение канала Output Compare. Однако при использовании имен регистров и бит в программе следует приводить полное имя, например для доступа к значению счетчика TC1 следует использовать имя регистра TCNT1, и т. п.
Упрощенная блок-схема TC1 показана на рисунке 19-1. Реальное размещение сигналов на внешних выводах см. во врезке ниже. Также см. разделы даташита [1]: "Pin Configurations", "Alternate Functions of Port B", "Alternate Functions of Port D".
T1 - эта ножка может работать как тактовый вход для таймера/счетчика 1 (Timer/Counter1 External Counter Input). Подробнее см. статью [4].
P20
PD5
OC1A - сигнал события совпадения A таймера 1 (Timer/Counter1 Output Compare A Match Output).
P21
PD6
ICP1, вход для захвата внешних импульсов (Timer/Counter1 Input Capture Pin). Может использоваться для измерения длительностей сигнала с помощью таймера 1.
Ножка PD4, к которой привязан сигнал OC1B, задействован на сигнал USB D-, но его можно использовать, если USB не нужен.
В таблицах ниже показаны функции ножек портов GPIO, которые имеют отношение к работе TC1.
[Порт PB]
Порт
Альтернативные функции
PB1
T1, внешний вход для подачи тактов на таймер/счетчик 1 (Timer/Counter1 External Counter Input).
[Порты PD]
Порт
Альтернативные функции
PD4
OC1B, выход сигнала о событии совпадения таймера/счетчика 1 с заданным значением канала B (Timer/Counter1 Output Compare B Match Output).
PD5
OC1A, выход сигнала о событии совпадения таймера/счетчика 1 с заданным значением канала A (Timer/Counter1 Output Compare A Match Output).
PD6
ICP1, вход захвата значения таймера/счетчика по внешнему событию (Timer/Counter1 Input Capture Pin).
Особенности регистров. Регистры Timer/Counter (TCNT1), Output Compare Registers (OCR1A, OCR1B) и Input Capture Register (ICR1) являются 16-разрядными. Поэтому для доступа к ним следует придерживаться специальной процедуры (микроконтроллер AVR 8-разрядный). Эти процедуры описаны в разделе даташита "Accessing 16-bit Registers" (также см. [2]). Регистры управления TC1 (Timer/Counter Control Registers TCCR1A и TCCR1B) 8-разрядные, так что для доступа к ним со стороны программы CPU нет никаких ограничений. Сигналы запросов прерывания (Interrupt requests, что на рис. 19-1 показаны сокращениями Int.Req.) отображаются на флаги в регистре Timer Interrupt Flag Register (TIFR). Все прерывания TC1 маскируются индивидуально в битами регистра Timer Interrupt Mask Register (TIMSK). На рисунке TIFR и TIMSK не показаны, потому что эти регистры также связаны и с другими таймерами микроконтроллера.
TC1 может получать тактирование внутренне, через делитель частоты (prescaler), или от внутреннего источника тактов на выводе T1. Логика выбора тактов (Clock Select) управляет, какой источник тактов, и какой его активный перепад будет использоваться для инкремента (или декремента) значения счетчика TC1. Счетчик не активен, когда не выбран источник тактирования. Выход логики выбора тактов обозначается как такты таймера TC1 (сигнал clkT1).
Регистры сравнения для генерации выходного сигнала с двойной буферизацией (Output Compare Registers, OCR1A, OCR1B) постоянно сравниваются со значением счетчика TC1 (регистр Timer/Counter, TCNT1). Результат сравнения может использоваться для генерации сигнала ШИМ или для изменяемой выходной частоты на ножках Output Compare Pin (OC1A, OC1B), подробнее см. "Узлы Output Compare" ниже. При совпадении генерируется событие Compare Match, которое установит флаг Compare Match Flag (OCF1A, OCF1B), и это может использоваться для генерации запроса на прерывание Output Compare.
Регистр захвата (Input Capture Register, ICR1) может захватывать значение счетчика (TCNT1) по внешнему событию, которое возникает (это настраивается) либо на выводе Input Capture Pin (ICP1), или на выводах Analog Comparator (см. раздел "Analog Comparator" даташита [1]). На входе блока Input Capture может быть подключен цифровой узел подавления помех (Noise Canceler), чтобы снизить шансы случайного захвата коротких импульсов.
Значение TOP, или максимальное значение счетчика, может быть в некоторых режимах работы определено либо регистром OCR1A, либо регистром ICR1, либо установлено в одно из фиксированных значений (см. таблицу 19-1). Когда в режиме ШИМ (PWM) используется OCR1A в качестве значения TOP, регистр OCR1A не может использоваться для генерации выхода ШИМ. Однако в этом случае значение TOP получит двойную буферизацию, что позволяет программно менять значение TOP в режиме реального времени (run time). Если требуется фиксированное значение TOP, регистр ICR1 может использоваться как альтернатива, освобождая OCR1A для использования в качестве выхода ШИМ.
Определения. В этом описании часто будут использоваться следующие определения:
Таблица 19-1. Определения констант.
BOTTOM
Счетчик достиг BOTTOM, когда он становится равным 0x0000.
MAX
Счетчик достиг максимального значения MAX, когда он становится равным 0xFFFF (в десятичной форме 65535).
TOP
Счетчик достигает TOP, когда он становится равным самому большому значению в последовательности счета. Значение TOP может быть назначено в одно из фиксированных значений: 0x00FF, 0x01FF или 0x03FF, или значение TOP может быть сохранено в регистре OCR1A или ICR1. Присваивание значения TOP зависит от режима работы.
Совместимость. 16-bit Timer/Counter был обновлен и улучшен по сравнению с предыдущими версиями 16-bit AVR Timer/Counter. Совместимость полностью соблюдается в контексте следующего:
• Все регистры 16-bit Timer/Counter относятся к адресному пространству регистров I/O, включая регистры прерываний таймера (Timer Interrupt Registers). • Положение бит внутри всех регистров 16-bit Timer/Counter, включая регистры прерываний таймера. • Векторы прерывания.
У следующих бит управления поменялись имена, однако у них сохранился функционал и размещение в регистрах:
• Имя PWM10 изменено на WGM10. • PWM11 изменено на WGM11. • CTC1 изменено на WGM12.
Добавлены следующие биты в регистры управления:
• FOC1A и FOC1B добавлены в регистр TCCR1A. • WGM13 добавлен в регистр TCCR1B.
16-bit Timer/Counter имеет улучшения, которые в некоторых случаях влияют на совместимость.
[Источники тактирования]
Как уже упоминалось, TC1 может получать такты либо от внутреннего, либо от внешнего источника. Логика выбора тактов управляется битами CS12..CS10, которые находятся в Timer/Counter Control Register B (TCCR1B). Частота тактирования может быть поделена прескалером, см. врезку ниже.
Таймеры Timer/Counter1 и Timer/Counter0 (TC1 и TC0) имеют общий модуль делителя (prescaler module), однако эти таймеры/счетчики могут иметь разные настройки. Описание ниже применимо к обоим таймерам/счетчикам TC1 и TC0.
Внутренний источник тактов. Таймер/счетчик может тактироваться напрямую от системной тактовой частоты (путем установки CSn2:0 = 1). Это предоставляет самый быстрый счет, поскольку счетчик работает на частоте ядра и портов ввода/вывода (fCLK_I/O). Альтернативно может быть выбран один из выходов прескалера, где частота тактирования может быть либо fCLK_I/O/8, fCLK_I/O/64, fCLK_I/O/256 или fCLK_I/O/1024.
Сброс прескалера. Прескалер всегда работает (т. е. его работа не зависит от состояния логики выбора тактов таймеров/счетчиков), и используется совместно TC1 и TC0. Поскольку на сам прескалер не влияет логика выбора тактов, внутреннее состояние прескалера неявно влияет на ситуации, когда используются частоты прескалера. Один из примеров возникновения таких артефактов, когда таймер разрешен и тактируется от прескалера (6 > CSn2:0 > 1). Количество системных тактов от момента, когда таймер разрешен, до первого момента счета может быть в диапазоне от 1 до N+1 системных тактовых циклов, где N равно выбранному коэффициенту прескалера (8, 64, 256 или 1024).
Есть возможность сбросить прескалер, чтобы засинхронизировать таймер/счетчик с ходом выполнения программы. Однако при этом следует иметь в виду, что тот же самый прескалер может использоваться и другим таймером/счетчиком. Сброс прескалера повлияет на период всех таймеров/счетчиков, которые к нему подключены.
Внешний источник тактов. Внешний источник тактов, подключенный к выводу T1/T0, может использоваться для тактирования таймеров/счетчиков TC1 и TC0 (сигналы clkT1 и clkT0). Вывод T1/T0 анализируется на каждом такте системной частоты специальной логикой синхронизации внешнего вывода. Синхронизированный (оцифрованный) внешний сигнал затем передается на детектор перепада. На рис. 18-1 показана функциональная блок-схема логики синхронизации и детектора перепада T1/T0. Регистры тактируются по положительному перепаду внутренней системной частоты (clkI/O). Защелка прозрачна в интервале лог. 1 сигнала внутренних системных тактов.
Детектор перепада генерирует импульс clkT1/clkT0 для каждого положительного (CSn2:0 = 7) или отрицательного (CSn2:0 = 6) перепада уровня, который он определил.
Рис. 18-1. Логика оцифровки (выборки уровня) на выводах T1/T0.
Логика синхронизации и детектора перепада вводит задержку от 2.5 до 3.5 системных такта между сигналом на выводе T1/T0 и моментом обновления счетчика.
Разрешение и запрет входа тактов должны осуществляться, когда уровень T1/T0 стабилен как минимум в течение одного периода системных тактов, иначе есть риск генерации ошибочного импульса счета для таймера/счетчика.
Каждая половина периода поступающей внешней тактовой частоты должна быть дольше одного периода системных тактов, чтобы гарантировать корректную оцифровку T1/T0. Внешняя частота должна быть гарантированно ниже половины системной частоты (fExtClk < fclk_I/O/2) при скважности 50%. Поскольку детектор перепада использует оцифровку уровня, максимальная частота, которую он может детектировать, равна половине частоты дискретизации (в соответствии с теоремой Найквиста). Однако из-за вариации системной частоты и скважности, производимой генератором (определяется допусками внешнего кварца, керамического резонатора, емкостью конденсаторов, подключенных к выводам XTAL1 и XTAL2, температурой окружающей среды и другими факторами), рекомендуется ограничить максимальную частоту внешних тактов, чтобы она была меньше fclk_I/O/2.5.
Внешняя тактовая частота не может быть поделена прескалером.
Рис. 18-2. Прескалер для Timer/Counter1 и Timer/Counter0. Логика синхронизации ножек входов (T1/T0) показана на рисунке 18-1.
Регистры прескалера. Когда используются специальные команды ассемблера IN и OUT, относящиеся к I/O, должно использоваться адресное пространство I/O 0x00 .. 0x3F. Когда регистры адресуются через пространство данных инструкциями LD и ST, к этим адресам нужно добавить 0x20.
SFIOR – Special Function IO Register, смещение 0x30 в адресном пространстве I/O, состояние после сброса 0. Когда этот регистр адресуется командами LD и ST, адрес смещения этого регистра 0x50.
Разряд
7
6
5
4
3
2
1
0
-
-
-
-
-
-
-
PSR10
SFIOR
Чтение/запись
R/W
Сброс
0
0
0
0
0
0
0
0
PSR10 (бит 0): Prescaler Reset Timer/Counter1 и Timer/Counter0
Когда в этот бит записывается лог. 1, то будет сброшен общий прескалер для TC1 и TC0. Этот бит будет очищен аппаратно после выполнения операции сброса. Запись лог. 0 в этот бит не дает никакого эффекта. Имейте в виду, что TC1 и TC0 используют один и тот же прескалер, поэтому если прескалер используется на обоих этих таймерах, то сброс прескалера повлияет на них одновременно, и вызовет повлияет на последовательность из счета. Бит PSR10 всегда читается как 0.
[Узел счетчика]
Основная часть 16-bit Timer/Counter это программируемый 16-разрядный счетчик, который может считать в обоих направлениях. На рис. 19-2 показана блок-схема счетчика и его окружения.
Рис. 19-2. Блок-схема Counter Unit.
Описание внутренних сигналов:
count инкрементирует или декрементирует на единицу TCNT1. direction выбирает направление счета (инкремент или декремент). clear очищает TCNT1 (сбрасывает в 0 все его биты). clkT1 такты таймера/счетчика. TOP сигнализирует, что TCNT1 достиг максимального значения. BOTTOM сигнализирует, что TCNT1 достиг минимального значения (нуля).
16-битный счетчик отображается на две 8-битные ячейки адресного пространства I/O: старшая половина счетчика (TCNT1H) и младшая половина счетчика (TCNT1L). К регистру TCNT1H процессор может обратиться только косвенной адресацией (indirect access). Когда CPU осуществляет доступ к TCNT1H ячейке I/O, то на самом деле CPU получает доступ к временному регистру старшего байта (TEMP). Этот временный регистр обновляется значением TCNT1H, когда читается регистр TCNT1L, и TCNT1H обновляется значением из временного регистра, когда записывается регистр TCNT1L. Это позволяет процессору читать или записывать весь 16-битный счетчик целиком за 1 такт через внутреннюю 8-битную шину данных (подробнее см. [2]).
Важно отметить, что есть специальные случаи, когда запись в регистр TCNT1 при непрерывном счете может привести к непредсказуемым результатам. Эти специальные случаи описаны в соответствующих секциях, где это имеет значение.
В зависимости от используемого режима работы счетчик очищается, инкрементируется или декрементируется на каждом такте таймера (clkT1). Сигнал clkT1 может генерироваться из внешнего или внутреннего источника, выбранного битами CS12:0). Когда ни один из источников тактов не выбран (CS12:0 = 0), таймер остановлен. Однако к значению счетчика TCNT1 можно получить доступ со стороны CPU, независимо от того, присутствует clkT1 или нет. Операции записи CPU отменяют (т. е. запись имеет приоритет) все очистки счетчика или операции счета.
В последовательность счета определяется установкой бит Waveform Generation (WGM13:0), находящихся в Timer/Counter Control Register A и B (TCCR1A и TCCR1B). Имеется строгая зависимость между поведением (счетом) счетчика и формами сигнала, генерируемыми на выходах Output Compare (OC1x). Для дополнительной информации по последовательностям счета и формам генерируемых сигналов см. "Режимы работы".
Флаг переполнения Timer/Counter Overflow (TOV1) установится в соответствии с выбранным битами WGM13:0 режимом работы. TOV1 может использоваться для генерации прерывания CPU.
[Узел Input Capture]
В таймере/счетчике реализован узел захвата по входному сигналу (Input Capture), который может захватывать внешние события и привязывать к ним метки реального времени. Событие показывает внешний сигнал, который может поступать на вывод ICP1 или альтернативно на блок компаратора (Analog Comparator). Эти метки времени могут использоваться для вычисления частоты, скважности и других параметров сигнала, который генерирует события захвата. Альтернативно метки времени могут использоваться для создания лога событий.
Input Capture показан на рис. 19-3. На этой блок схеме элементы, которые не являются непосредственно частями узла Input Capture, показаны серым цветом.
Рис. 19-3. Блок схема Input Capture Unit.
Когда меняется логический уровень (это изменение является событием) на выводе Input Capture Pin (ICP1), или альтернативно на выходе компаратора Analog Comparator Output (ACO), то это изменение, подтверждаемое детектором перепада, вызовет срабатывание захвата (capture). При захвате 16-битное значение счетчика (TCNT1) записывается в регистр Input Capture Register (ICR1). Установится флаг Input Capture Flag (ICF1) на том же системном такте, на котором значение TCNT1 копируется в регистр ICR1. Если разрешено прерывание захвата (TICIE1 = 1), то флаг Input Capture генерирует прерывание Input Capture. Флаг ICF1 автоматически сбросится, когда выполнится соответствующий обработчик прерывания. Альтернативно флаг ICF1 может быть очищен программно путем записи лог. 1 в соответствующую позицию бита I/O флага ICF1.
Чтение 16-битного значения Input Capture Register (ICR1) осуществляется сначала чтением младшего байта (ICR1L), и затем старшего байта (ICR1H). Когда читается младший байт, старший при этом копируется во временный регистр старшего байта (TEMP). Когда CPU читает ячейку I/O ICR1H, то на самом деле он читает регистр TEMP [2].
Регистр ICR1 может быть записан только когда режим генерации сигнала (Waveform Generation mode) использует регистр ICR1 для определения значения TOP счетчика (см. таблицу 19-1). В этом случае биты Waveform Generation mode (WGMn3:0) должны быть установлены до того, как значение TOP может быть записано в регистр ICR1. Когда записывается регистр ICR1, сначала должен быть записана старшим байтом I/O ячейка ICR1H, затем записан младший байт в ICR1L [2].
Источник сигнала Input Capture. Основным триггером срабатывания блока Input Capture таймера TC1 служит вход Input Capture Pin (ICP1). TC1 может альтернативно для Input Capture использовать выход компаратора (Analog Comparator Output, сигнал ACO). Analog Comparator выбирается как источник триггера захвата путем установки бита Analog Comparator Input Capture (ACIC) в регистре управления компаратором Analog Comparator Control and Status Register (ACSR). Имейте в виду, что изменение источника триггера может привести к ложному одиночному срабатыванию функции захвата. Таким образом, флаг ICF1 должен быть очищен после изменения источника сигнала захвата.
Оба входа, и Input Capture Pin (ICP1), и Analog Comparator Output (ACO) оцифровываются той же самой техникой, что и вывод T1 (см. рис. 18-1). Детектор перепада также аналогичный. Однако когда разрешен noise canceler, перед детектором перепада вставляется дополнительная логика, которая увеличивает задержку на 4 системных такта. Имейте в виду входной noise canceler и детектор перепада всегда разрешены, за исключением случаев, когда таймер/счетчик установлен в режим генерации сигнала (Waveform Generation mode), в котором ICR1 используется для определения TOP.
Input Capture может сработать под действием программы, если она управляет ножкой порта GPIO сигнала ICP1, настроенного как выход.
Noise Canceler. Узел подавления помех (noise canceler) улучшает помехозащищенность путем применения схемы цифровой фильтрации. Вход noise canceler оцифровывается 4 раза, и когда все 4 выборки оказываются одинаковыми, то этот логический уровень передается на вход детектора перепада как достоверный.
Noise canceler разрешается путем установки бита Input Capture Noise Canceler (ICNC1) в регистре Timer/Counter Control Register B (TCCR1B). Если noise canceler разрешен, то это вводит задержку из 4 системных тактов от изменения уровня события до обновления регистра ICR1. Noise canceler использует системную тактовую частоту, поэтому на него не влияет настройка прескалера таймера/счетчика.
Использование узла Input Capture. Основная сложность применения функции Input Capture - предоставить достаточное количество процессорного времени для обработки входных событий. Время между двумя соседними событиями является критичным, за это время обработчик прерывания должен успеть обработать факт события. Если процессор не прочитал (например, не успел прочитать) значение захвата в регистре ICR1 до наступления следующего события, то ICR1 будет перезаписан новым значением счетчика. В этом случае результат захвата будет некорректен.
Когда используется прерывание Input Capture, в обработчике прерывания регистр ICR1 должен быть как можно раньше, насколько это возможно. Даже несмотря на то, что прерывание Input Capture имеет довольно высокий приоритет, максимальное время реакции на прерывание зависит от максимального количества периодов тактов, которое тратится запросами на другие прерывания. Следует помнить, что активное прерывание AVR с низким приоритетом не может быть прервано, если вытеснение специально не разрешено в этом низкоприоритетном обработчике прерывания (см. "О приоритетах прерываний архитектуры AVR" в [3]).
Не рекомендуется использование узла Input Capture в любом режиме, когда значение TOP (разрешающая способность) активно меняется в процессе работы.
Измерение скважности сигнала требует срабатывания захвата после каждого перепада. Изменение чувствительного перепада должно быть сделано как можно ближе к моменту окончания чтения регистра ICR1. После изменения перепада флаг Input Capture Flag (ICF1) должен быть очищен программно (записью в его I/O позицию единицы). Для измерения только частоты очистка флага ICF1 не требуется (если используется обработчик прерывания).
[Узлы Output Compare]
16-битный цифровой компаратор непрерывно сравнивает TCNT1 с регистрами Output Compare (OCR1x). Если TCNT1 становится равным OCR1x, компаратор сигнализирует о совпадении. Совпадение установит флаг Output Compare Flag (OCF1x) на следующем такте таймера. Если прерывание сравнения разрешено (OCIE1x = 1), то флаг Output Compare генерирует прерывание Output Compare. Флаг OCF1x автоматически очищается, когда выполняется обработчик прерывания. Альтернативно флаг OCF1x может быть очищен программно записью лог. 1 в его I/O позицию бита. Генератор сигнала (waveform generator) использует сигнал совпадения для генерации выхода в соответствии с установленным режимом битами Waveform Generation mode (WGM13:0) и битами Compare Output mode (COM1x1, COM1x0). Сигналы TOP и BOTTOM используются блоком waveform generator для обработки специальных случаев предельных значений счетчика в некоторых режимах работы (см. "Режимы работы").
Специальная функция блока Output Compare A позволяет определить для таймера/счетчика значение TOP (т. е. разрешающую способность счета). В дополнение к разрешающей способности счетчика, значение TOP определяет время периода сигнала, который синтезирует waveform generator.
На рис. 19-4 показана блок-схема узла Output Compare. Маленькая буква x соответствует одному из блоков сравнения Output Compare (A/B). Элементы блок-схемы, которые не являются непосредственно частью узла Output Compare, обозначены серым цветом.
Рис. 19-4. Блок-схема Output Compare Unit.
Регистр OCR1x применяет двойную буферизацию, когда используется один из 12 режимов ШИМ (Pulse Width Modulation, PWM). Для режимов работы Normal и Clear Timer on Compare (CTC) двойная буферизация запрещена. Двойная буферизация синхронизирует обновление регистра сравнения OCR1x на последовательности счета TOP или BOTTOM. Эта синхронизация предотвращает появление несимметричных импульсов ШИМ, генерируя чистый, свободный от паразитных выбросов выходной сигнал.
Доступ к регистру OCR1x может показаться сложным, однако это не так. Когда разрешается двойная буферизация, ядро CPU получает доступ к регистру буфера OCR1x, и если двойная буферизация запрещена, то доступ осуществляется к регистру OCR1x напрямую, без буфера. Содержимое OCR1x (регистра сравнения или его буфера) меняется только операцией записи (таймер/счетчик не обновляет этот регистр автоматически, как он это делает с регистром TCNT1 и ICR1). Таким образом, OCR1x не читается через временный регистр старшего байта (TEMP). Однако хорошей практикой остается предварительное чтение младшего байта при доступе к другим 16-битным регистрам. Запись регистров OCR1x должна осуществляться через регистр TEMP, поскольку все 16-бит используются одновременно и непрерывно. Сначала записывается старший батй (OCR1xH). Когда старший байт записан в ячейку I/O, регистр TEMP обновляется этим записанным значением. Тогда после этого записывается младший байт (OCR1xL), и во время этой операции в том же самом системном такте старший байт будет скопирован в старшие 8 байт либо регистра OCR1x, либо его буфера. Подробнее про операции с 16-битными регистрами см. [2].
Force Output Compare. В режимах генерации сигнала, не относящихся к ШИМ (non-PWM Waveform Generation modes), есть возможность принудительно запустить совпадение цифрового компаратора записью лог. 1 в бит Force Output Compare (FOC1x). Forcing Compare Match не установит флаг OCF1x и не приведет к перезагрузке или очистке таймера, однако уровень на выводе OC1x обновится, как если бы произошло реальное событие совпадения сравнения Compare Match (настройки бит COM1x1, COM1x0 определяют, как изменится уровень на выводе OC1x: он установится, сбросится или переключится в противоположное состояние).
Блокирование Compare Match записью в TCNT1. Все записи со стороны CPU в регистр TCNT1 будут блокировать любые совпадения Compare Match, которые произойдут на следующем такте таймера, даже когда таймер остановлен. Эта функция позволяет инициализировать OCR1x в то же самое значение, что и TCNT1, без срабатывания прерывания, когда разрешается тактирование таймера/счетчика.
Использование Output Compare Unit. Поскольку запись TCNT1 в любом режиме работы заблокирует все совпадения compare match на один такт таймера, есть риски при изменении TCNT1, когда используется любой из каналов Output Compare, независимо от того, работает таймер/счетчик, или нет. Если значение, записанное в TCNT1, равно значению OCR1x, то Compare Match будет потеряно, в результате чего получится неправильно сгенерированный сигнал. Не записывайте TCNT1 равным значению TOP в режимах ШИМ (PWM) с переменными значениями TOP. Compare Match для TOP будет проигнорировано, и счетчик продолжит счет до значения 0xFFFF. Подобным образом не записывайте значение TCNT1, равным BOTTOM, когда счетчик считает вниз.
Настройка OC1x должна быть выполнена перед установкой регистра Data Direction Register (DDR), чтобы соответствующая ножка порта работала как выход. Самый простой способ установки значения OC1x - использовать биты строба Force Output Compare (FOCnx) в режиме Normal. Регистр OC1x сохраняет свое значение, даже когда меняются режимы генерации сигнала (Waveform Generation modes).
Будьте внимательны, биты COM1x1, COM1x0 не имеют двойной буферизации вместе со значением сравнения. Изменение бит COM1x1, COM1x0 вступают в силу немедленно.
[Выход Compare Match]
Биты режима Compare Output (COM1x1, COM1x0) выполняют 2 функции. Генератор сигналов (waveform generator) использует биты COM1x1, COM1x0 для определения состояния Output Compare (OC1x) на следующем событии совпадения Compare Match. Вторая функция бит COM1x1, COM1x0 это управление источником сигнала выхода вывода OC1x. Рис. 19-5 показывает упрощенную схему логики, на которую влияют настройки бит COM1x1, COM1x0. Регистры I/O, биты I/O и внешние выводы I/O на этом рисунке показаны жирным шрифтом. Показаны только те части регистров GPIO (регистры DDR и PORT), на которые влияют биты COM1x1, COM1x0. Когда ссылаются на состояние OC1x, имеется в виду внутреннее состояние регистра OC1x, а не вывода OC1x. Если происходит сброс системы (System Reset), то регистр OC1x сбрасывается в 0.
Рис. 19-5. Схема формирования выходного сигнала Compare Match.
Функция GPIO ножки порта (программный цифровой ввод/вывод) отменяется функцией Output Compare (OC1x) генератора сигналов (waveform generator), если установлен любой из бит COM1x1, COM1x0. Однако направление работы ножки порта OC1x (вход или выход) все еще контролируется соответствующим битом регистра DDR. Таким образом, если требуется на выводе OC1x формировать выходной сигнал, то соответствующий разряд регистра DDR (DDR_OC1x) должен быть установлен, иначе значение OC1x не появится на выходе порта. Функция переназначения порта в основном не зависит от Waveform Generation mode, но есть некоторые исключения. За подробностями обращайтесь к таблицам 19-2, 19-3 и 19-4.
Дизайн логики вывода Output Compare позволяет инициализацию состояния OC1x перед разрешением работы выхода. Обратите внимание, что некоторые настройки бит COM1x1, 0 зарезервированы для определенных режимов работы (см. ниже во врезках описание регистров).
Биты COM1x1, COM1x0 не оказывают влияния на узел Input Capture.
Compare Output Mode и генерация сигналов. Генератор сигналов (waveform generator) использует биты COM1x1, COM1x0 по-разному в режимах Normal, CTC и PWM. Для всех режимов настройка COM1x1, COM1x0 = 0 говорит генератору сигналов, что не нужно выполнять никаких действий с регистром OC1x на следующем событии Compare Match. Для действий, связанных с выводом сигнала сравнения (compare output) в режимах не ШИМ (non-PWM modes) см. таблицу 19-2. Для режима быстрого ШИМ (fast PWM mode) см. таблицу 19-3, и для режима ШИМ с корректными частотой и фазой (режим phase correct PWM и режим phase and frequency correct PWM) см. таблицу 19-4.
Изменение состояния бит COM1x1, COM1x0 даст эффект на первом Compare Match после того, как эти биты были записаны. Для режимов не ШИМ (non-PWM modes) действие может быть немедленно применено использованием бит строба FOC1x.
Режим быстрого ШИМ (fast PWM mode) больше всего подходит для синтеза сигналов звуковых частот. Режимы с корректной фазой (phase correct PWM и phase and frequency correct PWM) подойдут только для формирования медленно изменяющихся или статичных сигналов - по принципу настроил и забыл, без изменения параметров генерации на лету в обработчике прерывания. Причина в том, что для обработчика прерывания этих режимов (по флагу переполнения или флагу совпадения) в предельных значениях регулирования остается слишком мало времени на проведение каких-либо серьезных вычислений.
[Режимы работы]
Режим работы (т. е. поведение таймера/счетчика и выводов Output Compare) определяется комбинацией настроек бит Waveform Generation mode (WGM13:0) и Compare Output mode (COM1x1, COM1x0). Биты Compare Output mode никак не влияют на последовательность счета, в то время как биты Waveform Generation mode на это влияют. Биты COM1x1, COM1x0 управляют, должен ли быть выход ШИМ проинвертирован или нет (inverted PWM или non-inverted PWM). Для не ШИМ режимов (non-PWM modes) биты COM1x1, COM1x0 определяют, как будет изменять свой уровень OC1x на событиях Compare Match: установка, очистка или переключение в противоположное состояние (см. предыдущую главу "Выход Compare Match").
Подробную информацию с диаграммами времени см. главу "Диаграммы сигналов таймера/счетчика".
Normal Mode. Самый простой режим работы это режим Normal (WGM13:0 = 0). В этом режиме счетчик всегда считает вверх (инкрементируется), и очистка счетчика не происходит. Счетчик просто переваливает через свое максимальное 16-битное значение (MAX = 0xFFFF), и затем перезапускает счет со значения BOTTOM (0x0000). В режиме Normal флаг переполнения Timer/Counter Overflow Flag (TOV1) установится на том же самом тайте таймера, на котором регистр счетчика TCNT1 станет нулем. В этом случае флаг TOV1 ведет себя наподобие 17-го бита счетчика, кроме случаев, если он только установлен и после этого не очищен. Однако в комбинации с использованием прерывания переполнения таймера флаг TOV1 будет автоматически очищаться, и аппаратная разрешающая способность таймера может быть увеличена программно. В режиме Normal нет никаких специальных случаев, требующих учета, новое значение счетчика может быть записано в любой момент времени.
Блок Input Capture в режиме Normal прост в использовании. Однако рассмотрите ситуации, когда максимальный измеряемый интервал времени превышает разрешающую способность счетчика. Если интервал между событиями слишком большой, то следует использовать прерывание переполнения, или нужно настроить прескалер таким образом, чтобы изменить разрешающую способность блока захвата.
Блоки Output Compare могут использовать для генерации прерываний в некоторое заданное время. Использование Output Compare для генерации сигналов в режиме Normal не рекомендуется, поскольку это будет занимать слишком много процессорного времени по сравнению с другими режимами.
Clear Timer on Compare Match (CTC) Mode. В этом режиме (очистка таймера при совпадении сравнения, WGM13:0 = 4 или 12), регистр OCR1A или ICR1 используется для манипулирования разрешающей способностью счетчика. В режиме CTC счетчик очищается (сбрасывается в 0), когда значение счетчика (TCNT1) совпадает либо с OCR1A (WGM13:0 = 4), либо с ICR1 (WGM13:0 = 12). OCR1A или ICR1 определяют верхнее значение для счетчика, и таким образом его разрешающую способность. Этот режим дает больше контроля над выходной частотой Compare Match. Он также упрощает операцию подсчета внешних событий.
На рис. 19-6 ниже показаны диаграммы времени работы в режиме CTC. Значение счетчика (TCNT1) растет, пока не произойдет совпадение сравнения Compare Match со значением либо OCR1A, либо ICR1, после чего счетчик (TCNT1) очищается.
Рис. 19-6. Диаграмма времени работы CTC Mode.
Может генерироваться прерывание каждый раз, когда счетчик достигает значения TOP, путем использования флага OCF1A или ICF1, в зависимости от того, какой регистр использовался для определения значения TOP. Если прерывание разрешено, то подпрограмма обработчика прерывания (ISR) может использоваться для обновления значения TOP. Однако изменение значения TOP на значение, близкое к BOTTOM,
Когда счетчик работает без прескалера или с малым коэффициентом деления прескалера (т. е. тактируется высокой частотой), следует обратить внимание на то, что режим CTC не имеет функции двойной буферизации. Поэтому если новое значение, которое было записано в OCR1A или ICR1, меньше, чем текущее значение TCNT1, то счетчик пропустит Compare Match. После этого пропуска счетчик продолжит счет до своего максимального 16-битного значения (0xFFFF) и перевалит в 0x0000 перед тем как возникнет Compare Match. Во многих случаях такое поведение может быть нежелательным. Альтернативой будет режим fast PWM с использованием OCR1A для определения TOP (WGM13:0 = 15), поскольку в этом случае OCR1A получит двойную буферизацию.
Для генерации сигнала в режиме CTC выход OC1A может быть установлен на переключение своего логического уровня на каждом Compare Match путем установки битов Compare Output mode в режим переключения (toggle mode COM1A1:0 = 1). Значение OC1A не появится на выводе порта, соответствующего сигналу OC1A, пока этот порт не будет установлен как выход настройкой регистра DDR (DDR_OC1A = 1). Максимальная частота на выходе fOCnA получится равной fclk_I/O/2, когда OCR1A установлен в 0 (0x0000). Частота выхода fOCnA определяется по формуле:
N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).
Как и в режиме Normal, флаг переполнения TOV1 установится на том же самом такте таймера, на котором значение счетчика перейдет от MAX к 0x0000.
Fast PWM Mode. Режим быстрой ШИМ (fast Pulse Width Modulation, или fast PWM mode, WGM13:0 = 5, 6, 7, 14 или 15) предоставляет опцию генерации ШИМ повышенной частоты. Fast PWM отличается от других опций генерации ШИМ своим однотактным принципом работы. Счетчик считает от BOTTOM до TOP, после чего перезапускается со значения BOTTOM. В режиме не инверсного вывода при совпадении сравнения (noninverting Compare Output mode) выход Output Compare (OC1x) очищается, когда произошло совпадения Compare Match между TCNT1 и OCR1x, и установится на значении BOTTOM. В режиме инверсии (inverting Compare Output mode) все наоборот, выход установится при Compare Match, и сбросится на BOTTOM. Из-за однотактного принципа работы частота ШИМ в режиме fast PWM может быть в 2 раза выше, чем в режимах phase correct PWM и phase and frequency correct PWM, которые работают по двухтактному принципу. Эта высокая частота делает режим fast PWM хорошо подходящим для регулирования мощности, выпрямления тока и и приложений ЦАП (DAC). Высокая частота позволяет применять внешние компоненты (индуктивности, конденсаторы) малых размеров, уменьшая общую стоимость системы.
Разрешающая способность fast PWM может быть зафиксирована на 8, 9 или 10 битах, или может быть определена либо ICR1, либо OCR1A. Минимальная допустимая разрешающая способность составляет 2 бита (ICR1 или OCR1A в значении 0x0003), и максимальная 16 бит (ICR1 или OCR1A в значении MAX). Разрешающая способность ШИМ в битах вычисляется по формуле:
log(TOP+1) RFPWM = ------------- log(2)
В режиме fast PWM счетчик инкрементируется, пока его значение не достигнет одного из фиксированных значений 0x00FF, 0x01FF или 0x03FF (WGM13:0 = 5, 6 или 7), значения в ICR1 (WGM13:0 = 14), или значения в OCR1A (WGM13:0 = 15). Затем счетчик будет очищен на следующем такте таймера. Диаграмма режима fast PWM показана на рис. 19-7 ниже. Здесь показан режим fast PWM, когда OCR1A или ICR1 используется для определения TOP. Значение TCNT1 показано на гистограмме, чтобы проиллюстрировать его однотактный принцип работы. Эта диаграмма включает не инверсный (non-inverted PWM) и инверсный (inverted PWM) выходные сигналы ШИМ. Маленькие горизонтальные черточки показывают совпадения между значениями OCR1x и TCNT1. Флаг прерывания OC1x установится, когда произойдет Compare Match.
Рис. 19-7. Диаграмма времени Fast PWM Mode.
Флаг переполнения счетчика TOV1 установится каждый раз, когда счетчик достигает TOP. Дополнительно установится флаг OCF1A или ICF1 на том же такте таймера, на каком установится флаг TOV1, когда либо OCR1A, либо ICR1 используется для определения значения TOP. Если одно из прерываний разрешено, обработчик прерывания может использоваться для обновления значения TOP и значения сравнения.
Когда меняется значение TOP, программа должна гарантировать, что новое значение TOP больше или равно значению всех регистров сравнения. Если TOP меньше, чем любой из регистров Compare, то совпадение Compare Match никогда не произойдет при счете между TCNT1 и OCR1x. Имейте в виду, что когда используются фиксированные значения TOP, то не используемые биты маскируются нулями, когда записывается любой из регистров OCR1x (т. е. при использовании фиксированных значений TOP условие TOP >= OCR1x выполнится автоматически).
Процедура обновления ICR1 отличается от обновления OCR1A, когда они используются для определения значения TOP. Регистр ICR1 не имеет двойной буферизации. Это означает, что если ICR1 меняется на малое значение, когда счетчик работает без прескалера или с малым коэффициентом деления прескалера, то есть риск, что новое записанное значение ICR1 окажется меньше текущего значения TCNT1. В результате счетчик пропустит Compare Match на этом значении TOP, продолжая счет до значения MAX (0xFFFF) и вернется к начальному значению 0x0000 перед возникновением Compare Match. Однако регистр OCR1A имеет двойную буферизацию. Это позволяет безопасно записать I/O ячейку OCR1A в любой момент времени. Когда I/O ячейка OCRnA записана, записанное значение будет помещено в буферный регистр OCR1A. Затем регистр OCR1A Compare будет обновлен значением из буферного регистра на следующем такте таймера после того, как TCNT1 совпадет с TOP. Обновление произойдет на том же такте таймера, на каком очистится TCNT1 и установится флаг TOV1.
Регистр ICR1 для определения TOP хорошо работает при использовании фиксированных значений TOP (т. е. когда ICR1 постоянно и не меняется). При использовании ICR1 регистр OCR1A свободен для применения в формировании ШИМ-сигнала на OC1A. Однако если базовая частота ШИМ активно меняется (путем изменения значения TOP), то очевидно, что использование OCR1A в качестве TOP намного более лучший выбор, потому что OCR1A имеет двойную буферизацию.
В режиме fast PWM узлы сравнения позволяют генерировать сигналы ШИМ на выводах OC1x. Установка битов COM1x1, COM1x0 в значение 2 будет давать не инверсный ШИМ (non-inverted PWM), и при установке COM1x1, COM1x0 в значение 3 будет генерироваться инверсный ШИМ (inverted PWM), см. таблицу 19-3. Сигнал OC1x появится на ножке порта только тогда, когда его направление работы настроено регистром DDR как выход (должен быть установлен в единицу соответствующий бит DDR_OC1x). Сигналы ШИМ генерируются установкой (или очисткой) OC1x при Compare Match (совпадении) между OCR1x и TCNT1, и очисткой (или установкой) OC1x на такте таймера, когда его счетчик очищается (автоматически меняет свое значение от TOP к BOTTOM).
Частота ШИМ может быть вычислена по следующей формуле:
fclk_I/O fOC1xPWM = ------------- N · (1 + TOP)
N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).
Предельные значения регистра OCR1x представляют специальные случаи, когда генерируется ШИМ в режиме fast PWM. Если OCR1x установлен равным BOTTOM (0x0000), то на выходе получатся короткие пики для каждого TOP+1 такта таймера. Установка OCR1x равным TOP приведет к постоянному уровню лог. 1 или лог. 0 (в зависимости от полярности/инверсии OC1x, что устанавливается битами COM1x1, COM1x0).
Генерация частоты прямоугольного сигнала (со скважностью 50%) в режиме fast PWM может быть осуществлена установкой OC1A в режим переключения уровня на каждом Compare Match (COM1A1:0 = 1). Это применимо только когда OCR1A используется для определения значения TOP (WGM13:0 = 15). Генерируемый сигнал будет иметь максимальную частоту fOC1A = fclk_I/O/2, когда OCR1A установлен в ноль (0x0000). Эта функция подобна переключению OC1A на противоположное состояние в режиме CTC, за исключением того, что в режиме fast PWM разрешена функция двойной буферизации в узле Output Compare.
Phase Correct PWM Mode. Режим генерации ШИМ с корректной фазой (phase correct PWM mode, WGM13:0 = 1, 2, 3, 10 или 11) предоставляет опцию генерации качественного ШИМ с высокой разрешающей способностью. Режим phase correct PWM, как и режим phase and frequency correct PWM, основан на двухтактном принципе работы. Счетчик считает сначала от BOTTOM (0x0000) до TOP, и затем обратно от TOP до BOTTOM. В не инверсном (non-inverting Compare Output) режиме выход Output Compare (OC1x) очищается при совпадении Compare Match между TCNT1 и OCR1x, когда идет счет вверх, и устанавливается при Compare Match, когда идет счет вниз. В инверсном режиме все наоборот. Двухтактный принцип работы понижает максимальную рабочую частоту ШИМ вдвое по сравнению с однотактным принципом. Однако из-за симметричности счета в двухтактных режимах ШИМ эти режимы лучше всего подходят для приложений управления моторами.
Разрешающая способность ШИМ в режиме phase correct PWM может быть фиксирована на разрядности 8, 9 или 10 бит, или может быть определено значением ICR1 или OCR1A. Минимально допустимая разрешающая способность 2 разряда (ICR1 или OCR1A в значении 0x0003), и максимальная разрешающая способность 16 разрядов (ICR1 или OCR1A в значении MAX). Разрешающая способность ШИМ в битах тогда может быть рассчитана по следующей формуле:
log(TOP+1) RPCPWM = ------------- log(2)
В режиме phase correct PWM счетчик инкрементируется до тех пор, пока не достигнет одного из фиксированных значений 0x00FF, 0x01FF или 0x03FF (WGM13:0 = 1, 2 или 3), значения ICR1 (WGM13:0 = 10) или значения OCR1A (WGM13:0 = 11). По достижении TOP счетчик меняет направление счета. Значение TCNT1 будет равно TOP в течение одного такта таймера. Диаграмма времени phase correct PWM показана на рис. 19-8. Этот рисунок показывает режим phase correct PWM, когда OCR1A или ICR1 используются для определения TOP. Значение TCNT1 на этой диаграмме времени показано как гистограмма в качестве иллюстрации двухтактного принципа работы. Диаграмма включает не инверсный и инверсный выходные сигналы ШИМ. Маленькие горизонтальные черточки на склонах гистограммы обозначают значения TCNT1, когда происходят совпадения между OCR1x и TCNT1. Флаг прерывания OCF1x установится, когда произойдет Compare Match.
Рис. 19-8. Диаграмма времени Phase Correct PWM Mode.
Флаг переполнения TOV1 установится всякий раз, когда счетчик достигнет BOTTOM. Когда либо OCR1A, либо ICR1 используются для определения значения TOP, флаги OC1A или ICF1 соответственно установятся на том же самом такте таймера, на каком регистры OCR1x обновятся значением из двойного буфера (на TOP). Флаги прерывания могут использоваться для генерации прерывания каждый раз, когда счетчик достигает значения TOP или BOTTOM.
Когда меняется значение TOP, программа должна гарантировать, что новое значение TOP окажется больше или равно значению всех регистров сравнения (Compare Registers). Если TOP будет меньше, чем любой из регистров сравнения, то Compare Match никогда не произойдет между TCNT1 и OCR1x. Обратите внимание, что когда используются фиксированные значения TOP, то когда записываются регистры OCR1x, их не используемые биты маскируются нулями. Как иллюстрирует третий период диаграммы рис. 19-8, активное изменение TOP, когда таймер/счетчик считает в режиме Phase Correct, может привести к несимметричному выходному сигналу. Причину этого можно найти во времени обновления регистра OCR1x. Поскольку обновление OCR1x происходит на TOP, период PWM начинается и заканчивается на TOP. Это подразумевает, что длина падающего склона определяется предыдущим значением TOP, в то время как длина склона нарастания определяется новым значением TOP. Когда эти два значения различаются для двух склонов, два наклона периода будут отличаться по длительности. Эта разница в длине в результате приведет к несимметричному выходному сигналу.
Рекомендуется использовать режим корректной фазы и частоты (Phase and Frequency Correct mode) вместо режима корректной фазы (Phase Correct mode), когда меняется значение TOP в процессе счета таймера счетчика. Когда используется статическое TOP (т. е. не изменяющееся значение предела счета), то практически нет никакой разницы в работе этих двух режимов.
В режиме phase correct PWM узлы сравнения позволяют генерацию сигналов ШИМ на выводах OC1x. Установка бит COM1x1, COM1x0 в значение 2 даст не инверсный ШИМ (non-inverted PWM), и инверсный ШИМ (inverted PWM) может генерироваться установкой COM1x1, COM1x0 в значение 3 (см. таблицу 19-4). Сигнал OC1x появится на ножке порта только тогда, когда его направление работы настроено регистром DDR как выход (должен быть установлен в единицу соответствующий бит DDR_OC1x). Сигнал ШИМ генерируется установкой (или очисткой) OC1x на совпадении Compare Match между OCR1x и TCNT1, когда счетчик считает вверх, и очищает (или устанавливает) OC1x на совпадении Compare Match между OCR1x и TCNT1, когда считчик считает вниз. Частота ШИМ на выходе, когда используется phase correct PWM, может быть вычислена по следующей формуле:
fclk_I/O fOC1xPCPWM = ------------- 2 · N · TOP
N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).
Предельные значения для регистра OCR1x представляют специальные случаи, когда генерируется ШИМ в режиме phase correct PWM. Если OCR1x установлено равным BOTTOM, то на выходе будет постоянный лог. 0, и если OCR1x установлено равным значению TOP то на выходе будет постоянно лог. 1, когда ШИМ не инвертирован (non-inverted PWM). Для инверсного ШИМ эти выходные значения поменяются на противоположные.
Если OCR1A используется для определения значения TOP (WGM13:0 = 11), и COM1A1:0 = 1, то выход OC1A будет переключаться со скважностью 50%.
Phase and Frequency Correct PWM Mode. Режим корректной фазы и частоты ШИМ, или phase and frequency correct PWM mode (WGM13:0 = 8 или 9) предоставляет опцию формирования качественного ШИМ с высокой разрешающей способностью. Режим phase and frequency correct, как и режим phase correct PWM основан на двухтактном принципе работы. Счетчик считает с повторениями от BOTTOM (0x0000) до TOP, и затем от TOP до BOTTOM. В не инвертирующем режиме (non-inverting Compare Output mode) сигнал Output Compare (OC1x) очищается при совпадении значений (Compare Match) TCNT1 и OCR1x при счете вверх, и устанавливается при Compare Match во время счета вниз. В режиме инверсии Compare Output уровни OCR1x меняются на противоположные. Двухтактный принцип формирования ШИМ дает максимальную частоту ШИМ в 2 раза ниже, чем однотактный принцип работы. Однако из-за симметричности сигнала двухтактных режимов ШИМ эти режимы лучше подходят для приложений управления моторами.
Главное отличие режимов phase correct PWM и phase and frequency correct PWM в моменте времени, когда регистр OCR1x обновляется содержимым буферного регистра OCR1x (см. рисунки 19-8 и 19-9).
Разрешающая способность ШИМ для режима phase and frequency correct PWM может быть определена либо ICR1, либо OCR1A. Минимальная допустимая разрешающая способность 2 бита (ICR1 или OCR1A в значении 0x0003), и максимальная разрешающая способность 16 бит (ICR1 или OCR1A в значении MAX). Разрешающая способность ШИМ в битах может быть вычислена по формуле:
log(TOP+1) RPFCPWM = ------------ log(2)
В режиме phase and frequency correct PWM счетчик инкрементируется, пока его значение не совпадет с ICR1 (WGMn3:0 = 8) или с OCR1A (WGM13:0 = 9). Тем самым счетчик достиг TOP, после чего меняет направление счета. Значение TCNT1 будет равно TOP в течение одного такта таймера. Диаграмма сигналов режима phase correct and frequency correct PWM показана на рис. 19-9. Рисунок показывает режим phase and frequency correct PWM, когда OCR1A или ICR1 используются для определения TOP. Значение TCNT1 показано как гистограмма, что иллюстрирует двухтактный принцип работы. Диаграмма включает не инверсный и инверсный выходы ШИМ. Маленькие горизонтальные черточки помечают на склонах изменения TCNT1 моменты совпадения OCR1x и TCNT1 (Compare Match). Флаг прерывания OCF1x будет установлен, когда произойдет Compare Match.
Рис. 19-9. Диаграммы времени Phase and Frequency Correct PWM Mode.
Флаг переполнения TOV1 установится на том же такте таймера, на каком регистры OCR1x обновятся значением из двойного буфера (в момент, когда счетчик TCNT1 становится равным BOTTOM). Когда OCR1A или ICR1 используются для определения значения TOP, установится флаг OC1A или ICF1, когда TCNT1 достигает TOP. Могут использоваться флаги прерывания для генерации прерывания каждый раз, когда счетчик достигает значения TOP или BOTTOM.
Когда меняется значение TOP, программа должна гарантировать, что новое значение TOP больше или равно всем регистрам сравнения. Если же значение TOP окажется меньше любого из регистров сравнения, то совпадение Compare Match никогда не произойдет между TCNT1 и OCR1x.
Как видно на диаграмме рис. 19-9, все периоды ШИМ симметричны, что отличается от режима Phase Correct PWM. Поскольку регистры OCR1x обновляются на BOTTOM, длительность склонов спада и нарастания всегда будет одинаковой. Это дает симметричные выходные импульсы, и таким образом корректную частоту.
Использование регистра ICR1 для определения TOP хорошо работает, когда используются постоянные (которые не меняются в процессе работы) значения TOP. При использовании ICR1 регистр OCR1A освобождается для генерации ШИМ на выводе OC1A. Однако если базовая частота ШИМ активно меняется путем изменения значения TOP, использование OCR1A в качестве TOP очевидно будет намного лучшим выбором из-за наличия двойной буферизации OCR1A.
В режиме phase and frequency correct PWM блоки сравнения позволяют генерировать сигналы ШИМ на выводах OC1x. Установка бит COM1x1, COM1x0 в значение 2 будет генерировать не инверсный ШИМ, и установка COM1x1, COM1x0 в значение 3 будет генерировать инверсный ШИМ (см. таблицу 19-4). Реальные значения OC1x будут выводиться на ножку порта только если направление работы этой ножки порта настроено регистром DDR на выход(DDR_OC1x == лог. 1). Сигнал ШИМ генерируется путем установки (или очистки) OC1x при совпадении сравнения Compare Match между OCR1x и TCNT1, когда счетчик считает вверх, и очистки (или установки) OC1x при Compare Match между OCR1x и TCNT1, когда счетчик считает вниз. Частота ШИМ режима phase and frequency correct PWM может быть вычислена по формуле:
fclk_I/O fOC1xPFCPWM = -------------- 2 · N · TOP
N представляет коэффициент деления прескалера (1, 8, 64, 256 или 1024).
Предельные значения регистра OCR1x представляют специальные случаи, когда генерируется ШИМ в режиме phase and frequency correct PWM. Если OCR1x установлен равным BOTTOM, то в режиме не инверсного ШИМ на выходе будет постоянно лог. 0, и если OCR1x установлен равным TOP, но на выходе будет постоянно лог. 1. Для инверсного ШИМ выходные сигналы получат противоположные значения.
Если OCR1A используется для определения значения TOP (WGM13:0 = 9), и COM1A1:0 = 1, то выход OC1A будет переключаться со скважностью 50%.
[Диаграммы сигналов таймера/счетчика]
Таймер/счетчик имеет синхронный дизайн. На следующих рисунках частота тактов тактов таймера (clkT1) показана как сигнал разрешения тактирования. Рисунки включают информацию о том, когда устанавливаются флаги прерывания, и когда обновляется регистр OCR1x значением буфера OCR1x (только для режимов, где задействовано двойная буферизация). Следующий рисунок показывает диаграмму времени для установки OCF1x.
Рис. 19-10. Установка OCF1x, без деления частоты прескалером.
Следующий рисунок показывает те же самые диаграммы времени, но с разрешенным прескалером.
Рис. 19-11. Установка OCF1x, прескалер делит частоту на 8 (fclk_I/O/8).
Следующий рисунок показывает в разных режима последовательность счета при значениях, близких к TOP. Когда используется режим phase and frequency correct PWM, регистр OCR1x обновляется на BOTTOM. Диаграммы времени будут такими же, но TOP должнен быть заменен на BOTTOM, TOP-1 на BOTTOM+1, и так далее. Тот же самый принцип переименования применим для режимов, когда флаг TOV1 устанавливается на BOTTOM.
Рис. 19-12. Диаграмма таймера счетчика без деления частоты прескалером.
Следующий рисунок показывает те же данные времени, но с разрешенным прескалером.
Адресация регистров. Когда используются специальные инструкции ассемблера IN и OUT, для обращения к регистрам I/O должны использоваться адреса в диапазоне 0x00 .. 0x3F. Когда к тем же регистрам I/O адресация осуществляется с помощью инструкций LD и ST (адресация через пространство данных), то к этим адресам должна быть добавлена константа 0x20.
Регистр A управления таймером/счетчиком 1, имеет адрес I/O 0x2F (при адресации через пространство данных адрес 0x4F), состояние после сброса 0.
Разряд
7
6
5
4
3
2
1
0
COM1A1
COM1A0
COM1B1
COM1B0
FOC1A
FOC1B
WGM11
WGM10
TCCR1A
Чтение/запись
R/W
R/W
R/W
R/W
W
W
R/W
R/W
Сброс
0
0
0
0
0
0
0
0
COM1A1 (биты 7, 6): Compare Output Mode for Channel A
Определяют режим вывода при сравнении для канала A.
COM1B1 (биты 5, 4): Compare Output Mode for Channel B [n = 1:0]
Определяют режим вывода при сравнении для канала B.
COM1A1:0 и COM1B1:0 управляют поведением внешних выводов Output Compare pins (OC1A и OC1B соответственно). Если один из битов COM1A1:0 установлен в лог. 1, то для выхода OC1A отменяется нормальный GPIO-функционал соответствующей ножки порта PD5. Если один или оба бита COM1B1:0 установлены в лог. 1, то для выхода OC1B отменяется нормальный GPIO-функционал соответствующей ножки порта PD4. Однако следует иметь в виду, что регистр настройки направления работы ножек порта (Data Direction Register, DDR) все еще оказывает соответствующее влияние на работу выходов OC1A или OC1B (PD5 или PD4). Поэтому если требуется выводит аппаратно формируемый сигнал сравнения на выводы OC1A или OC1B, то для разрешения работы выходного драйвера также следует установить соответствующие биты PD5 или PD4 в регистре DDR.
Когда сигнал OC1A или OC1B выводится на ножку порта, функция бит COM1x1, COM1x0 (x заменяется на A или B) зависит от настроек бит WGM13:0. В таблице 19-2 показан функционал бит COM1x1, COM1x0, когда биты WGM13:0 установлены в режим Normal или CTC (режимы non-PWM, т. е. не относящиеся к формированию ШИМ).
Нормальная работа порта GPIO, сигналы OC1A/OC1B отключены от ножки порта.
0
1
Переключение уровня OC1A/OC1B в противоположное состояние при Compare Match.
1
0
Очистка уровня OC1A/OC1B (установка выхода в лог. 0) при Compare Match.
1
1
Установка уровня OC1A/OC1B (установка выхода в лог. 1) при Compare Match.
Таблица 19-3 показывает функционал бит COM1x1, COM1x0, когда биты WGM13:0 установлены в режим fast PWM.
Таблица 19-3. Compare Output Mode, режим Fast PWM(1).
COM1A1/COM1B1
COM1A0/COM1B0
Функция
0
0
Нормальная работа порта GPIO, сигналы OC1A/OC1B отключены от ножки порта.
0
1
WGM13:0 = 15: переключение в противоположный уровень OC1A при Compare Match, OC1B отключен (нормальная работа порта). Для всех других настроек WGM1 будет задана нормальная работа порта, OC1A/OC1B отключены от ножки порта.
1
0
Очистка уровня OC1A/OC1B при Compare Match, установка OC1A/OC1B на BOTTOM (не инверсный режим).
1
1
Установка уровня OC1A/OC1B при Compare Match, очистка OC1A/OC1B на BOTTOM (инверсный режим).
Примечание (1): имеет место специальный случай, когда OCR1A/OCR1B равен TOP, и установлен COM1A1/COM1B1. В этом случае Compare Match игнорируется, но установка или очистка происходят на BOTTOM. Подробнее см. описание режима Fast PWM.
Таблица 19-4 показывает функционал бит COM1x1, COM1x0, когда биты WGM13:0 установлены в режим phase correct PWM или режим phase and frequency correct PWM.
Таблица 19-4. Compare Output Mode, режим Phase Correct PWM и Phase and Frequency Correct PWM(2).
COM1A1/COM1B1
COM1A0/COM1B0
Функция
0
0
Нормальная работа порта GPIO, сигналы OC1A/OC1B отключены от ножки порта.
0
1
WGM13:0 = 9 или 14: переключение в противоположный уровень OC1A при Compare Match, OC1B отключен (нормальная работа порта). Для всех других настроек WGM1 будет задана нормальная работа порта, OC1A/OC1B отключены от ножки порта.
1
0
Очистка уровня OC1A/OC1B на Compare Match при счете вверх, установка OC1A/OC1B на Compare Match при счете вниз (не инверсный режим).
1
1
Установка уровня OC1A/OC1B на Compare Match при счете вверх, очистка OC1A/OC1B на Compare Match при счете вниз (инверсный режим).
Примечание (2): имеет место специальный случай, когда OCR1A/OCR1B равен TOP, и установлен COM1A1/COM1B1. Подробнее см. описание режима Phase Correct PWM.
FOC1A (бит 3): Force Output Compare for channel A
Принудительное срабатывание совпадения сравнения для канала A.
FOC1B (бит 2): Force Output Compare for channel B
Принудительное срабатывание совпадения сравнения для канала B.
Биты FOC1A/FOC1B активны только когда биты WGM13:0 задают режим non-PWM (не относящийся к формированию ШИМ режим). Однако для гарантирования совместимости с будущими моделями микроконтроллеров эти биты должны устанавливаться в 0, когда TCCR1A записывается в режиме ШИМ. Когда в бит FOC1A/FOC1B записывается лог. 1, немедленно происходит Compare Match в узле генерации сигнала, и выход OC1A/OC1B поменяет свое состояние в соответствии с настройкой бит COM1x1, COM1x0. Обратите внимание, что биты FOC1A/FOC1B реализованы как стробы. Значение в битах COM1x1, COM1x0 определяют эффект от принудительного сравнения.
Строб FOC1A/FOC1B не будет генерировать ни прерывание, ни очистку таймера в режиме Clear Timer on Compare Match (CTC) при использовании OCR1A в качестве TOP.
Вместе с битами WGM13, WGM12 из регистра TCCR1B эти биты управляют последовательностью счета, источником для TOP и типом используемой генерации сигнала, см. таблицу 19-5. Режимы, поддерживаемые узлом таймера/счетчика: Normal mode (counter), Clear Timer on Compare match (CTC) mode, и также 3 типа режимов ШИМ (Pulse Width Modulation, PWM), см. описание режимов в главе "Режимы работы".
Таблица 19-5. Описание функционала бит управления режимом генерации сигнала (Waveform Generation).
Mode
WGM13
WGM12 (CTC1)
WGM11 (PWM11)
WGM10 (PWM10)
Режим работы таймера/счетчика(3)
TOP
Когда обновляется OCR1x
Когда устанавливается TOV1
0
0
0
0
0
Normal
0xFFFF
Немедленно
MAX
1
0
0
0
1
PWM, Phase Correct, 8-bit
0x00FF
TOP
BOTTOM
2
0
0
1
0
PWM, Phase Correct, 9-bit
0x01FF
TOP
BOTTOM
3
0
0
1
1
PWM, Phase Correct, 10-bit
0x03FF
TOP
BOTTOM
4
0
1
0
0
CTC
OCR1A
Немедленно
MAX
5
0
1
0
1
Fast PWM, 8-bit
0x00FF
BOTTOM
TOP
6
0
1
1
0
Fast PWM, 9-bit
0x01FF
BOTTOM
TOP
7
0
1
1
1
Fast PWM, 10-bit
0x03FF
BOTTOM
TOP
8
1
0
0
0
Phase and Frequency Correct PWM
ICR1
BOTTOM
BOTTOM
9
1
0
0
1
OCR1A
BOTTOM
BOTTOM
10
1
0
1
0
Phase Correct PWM
ICR1
TOP
BOTTOM
11
1
0
1
1
OCR1A
TOP
BOTTOM
12
1
1
0
0
CTC
ICR1
Немедленно
MAX
13
1
1
0
1
Зарезервировано
-
-
-
14
1
1
1
0
Fast PWM
ICR1
BOTTOM
TOP
15
1
1
1
1
OCR1A
BOTTOM
TOP
Примечание (3): столбец Mode показывает номер режима. Имена бит CTC1, PWM11 и PWM10 устарели, вместо них используйте имена WGM12, WGM11, WGM10. Однако функционал и место размещения этих бит совместимы с предыдущими версиями таймера.
Регистр B управления таймером/счетчиком 1, имеет адрес I/O 0x2E (при адресации через пространство данных адрес 0x4E), состояние после сброса 0.
Разряд
7
6
5
4
3
2
1
0
ICNC1
ICES1
-
WGM13
WGM12
CS12
CS11
CS10
TCCR1B
Чтение/запись
R/W
R/W
-
R/W
R/W
R/W
R/W
R/W
Сброс
0
0
0
0
0
0
0
0
ICNC1 (бит 7): Input Capture Noise Canceler
Установка этого бита в лог. 1 активирует функцию подавления помех по входу (Input Capture Noise Canceler). Когда подавитель активирован, то сигнал на входе захвата (Input Capture pin, ICP1) проходит через цифровой фильтр. Чтобы сигнал прошел через этот фильтр, требуется 4 одинаковые следующие друг за другом выборки уровня ICP1. Таким образом, при работе подавителя помех Input Capture получает задержку на 4 такта генератора.
ICES1 (бит 6): Input Capture Edge Select
Этот бит выбирает, какой перепад на выводе ICP1 используется как триггер события захвата. Когда ICES1 == 0, в качестве события триггера захвата используется спад уровня лог. 1 -> лог. 0 (отрицательный перепад), и когда ICES1 == 1, в качестве триггера используется нарастание уровня лог. 0 -> лог. 1 (положительный перепад).
Когда срабатывает захват в соответствии с перепадом, настроенным битом ICES1, значение счетчика копируется в регистр захвата Input Capture Register (ICR1). Это событие также установит флаг Input Capture Flag (ICF1), и это может использоваться для прерывание Input Capture Interrupt, если оно разрешено.
Когда ICR1 используется как значение TOP (см. описание бит WGM13 .. WGM10 в описании регистров TCCR1A и TCCR1B), ICP1 отключен и соответственно функция захвата Input Capture запрещена.
WGM13 (бит 4): Waveform Generation Mode
WGM12 (бит 3): Waveform Generation Mode
Биты WGM13, WGM12 вместе с битами WGM11, WGM10 определяют режим генерации сигнала, см. описание регистра TCCR1A.
CS12, CS11, CS10 (биты 2..0): Clock Select
Эти 3 бита выбирают источник тактирования таймера/счетчика, см. рисунки 19-10, 19-11 и таблицу 19-6.
Таблица 19-6. Описание бит выбора тактов.
CS12
CS11
CS10
Описание
0
0
0
Источник тактов не задан (таймер/счетчик остановлен).
0
0
1
clkI/O (без делителя частоты)
0
1
0
clkI/O / 8 (с выхода делителя)
0
1
1
clkI/O / 64 (с выхода делителя)
1
0
0
clkI/O / 256 (с выхода делителя)
1
0
1
clkI/O / 1024 (с выхода делителя)
1
1
0
Внешний тактовый сигнал, поданный на вход T1. Тактирование происходит по срезу (спаду) уровня сигнала.
1
1
1
Внешний тактовый сигнал, поданный на вход T1. Тактирование происходит по фронту (нарастанию) уровня сигнала.
Если для тактирования Timer/Counter1 используются режимы с внешним выводом, то перепады на ножке T1 будут тактировать счетчик, даже если вывод T1 сконфигурирован как выход. Эта возможность позволяет программе подсчитывать внутренние события.
Младший байт таймера/счетчика, имеет адрес I/O 0x2C (при адресации через пространство данных адрес 0x4C), состояние после сброса 0.
[TCNT1H - Timer/Counter1 High byte]
Старший байт таймера/счетчика, имеет адрес I/O 0x2D (при адресации через пространство данных адрес 0x4D), состояние после сброса 0.
Эти два регистра TCNT1H и TCNT1L, скомбинированные в 16-битный регистр TCNT1, дает прямой доступ на операции чтения и записи к 16-битному счетчику таймера 1. Для гарантии атомарного доступа к половинкам регистра TCNT1 имеется специальный 8-битный регистр TEMP, и специальные способы доступа (подробнее см. [2]).
Модификация счетчика (TCNT1), когда счетчик считает, добавляет риск пропуска события совпадения сравнения Compare Match между TCNT1 и одним из регистров OCR1x.
Запись в регистр TCNT1 блокирует (устраняет) Compare Match на следующем такте таймера для всех узлов сравнения.
Младший байт регистра сравнения канала A, имеет адрес I/O 0x2A (при адресации через пространство данных адрес 0x4A), состояние после сброса 0.
[OCR1AH – Output Compare Register 1 A High byte]
Старший байт регистра сравнения канала A, имеет адрес I/O 0x2B (при адресации через пространство данных адрес 0x4B), состояние после сброса 0.
Регистры сравнения содержат 16-битное значение, которое постоянно сравнивается со значением счетчика (TCNT1). Совпадение может использоваться для генерации прерывания Output Compare, или для генерации вывода сигнала (waveform output) на выводе OC1x.
Регистры сравнения 16-битные, поэтому для атомарного обращения к ним применяют специальные методы [2]. Регистры доступны на чтение и запись.
Младший байт регистра захвата, имеет адрес I/O 0x26 (при адресации через пространство данных адрес 0x46), состояние после сброса 0.
[ICR1H – Input Capture Register 1 High byte]
Старший байт регистра захвата, имеет адрес I/O 0x27 (при адресации через пространство данных адрес 0x47), состояние после сброса 0.
Регистр Input Capture обновляется значением счетчика (TCNT1) каждый раз, когда происходит событие изменения уровня на выводе ICP1 (или опционально на выходе компаратора Analog Comparator). ICR1 может использоваться для определения значения TOP для счетчика.
Регистр захвата 16-битный, поэтому для атомарного обращения к нему применяют специальные методы [2]. Регистры доступны на чтение и запись.
Когда в этот бит записана лог. 1, и установлен флаг I в Status Register (SREG), т. е. когда глобально разрешены прерывания, то разрешено прерывание захвата по входу значения счетчика (Timer/Counter1 Input Capture Interrupt). Управление ходом выполнения программы будет передано по соответствующему вектору (см. раздел Interrupts даташита [1]), когда установится флаг ICF1, находящийся в регистре TIFR.
OCIE1A (бит 4): Timer/Counter1, Output Compare A Match Interrupt Enable
Когда в этот бит записана лог. 1, и установлен флаг I в Status Register (SREG), т. е. когда глобально разрешены прерывания, то разрешено прерывание по событию совпадения сравнения значения счетчика с регистром OCR1A (Timer/Counter1 Output Compare A match Interrupt). Управление ходом выполнения программы будет передано по соответствующему вектору (см. раздел Interrupts даташита [1]), когда установится флаг OCF1A, находящийся в регистре TIFR.
OCIE1B (бит 3): Timer/Counter1, Output Compare B Match Interrupt Enable
Когда в этот бит записана лог. 1, и установлен флаг I в Status Register (SREG), т. е. когда глобально разрешены прерывания, то разрешено прерывание по событию совпадения сравнения значения счетчика с регистром OCR1B (Timer/Counter1 Output Compare B match Interrupt). Управление ходом выполнения программы будет передано по соответствующему вектору (см. раздел Interrupts даташита [1]), когда установится флаг OCF1B, находящийся в регистре TIFR.
Когда в этот бит записана лог. 1, и установлен флаг I в Status Register (SREG), т. е. когда глобально разрешены прерывания, то разрешено прерывание по событию переполнения счетчика (Timer/Counter1 Overflow Interrupt). Управление ходом выполнения программы будет передано по соответствующему вектору (см. раздел Interrupts даташита [1]), когда установится флаг TOV1, находящийся в регистре TIFR.
Регистр флагов прерываний таймера/счетчика, имеет адрес I/O 0x38 (при адресации через пространство данных адрес 0x58), состояние после сброса 0.
Разряд
7
6
5
4
3
2
1
0
-
-
ICF1
OCF1A
OCF1B
TOV1
-
-
TIFR
Чтение/запись
-
-
R/W
R/W
R/W
R/W
-
-
Сброс
0
0
0
0
0
0
0
0
ICF1 (бит 5): Timer/Counter1, Input Capture Flag
Этот флаг установится, когда произошло событие захвата по входу ICP1 (или по выходу ACO компаратора). Когда в Input Capture Register (ICR1) настроен битами WGM13..WGM10 для использования в качестве значения TOP, флаг ICF1 установится, когда счетчик достигнет значения TOP.
ICF1 автоматически очистится, когда выполнится обработчик прерывания по адресу Input Capture Interrupt Vector. Альтернативно ICF1 можно очистить записью в него лог. 1 (запись 0 не оказывает никакого действия).
OCF1A (бит 4): Timer/Counter1, Output Compare A Match Flag
Этот флаг установится на том же такте таймера, на котором значение счетчика (TCNT1) совпадет с Output Compare Register A (OCR1A).
Имейте в виду, что строб Forced Output Compare (FOC1A) не будет устанавливать флаг OCF1A.
OCF1A автоматически очистится, когда выполнится обработчик прерывания по адресу Output Compare Match A Interrupt Vector. Альтернативно OCF1A можно очистить записью в него лог. 1 (запись 0 не оказывает никакого действия).
OCF1B (бит 3): Timer/Counter1, Output Compare B Match Flag
Этот флаг установится на том же такте таймера, на котором значение счетчика (TCNT1) совпадет с Output Compare Register B (OCR1B).
Имейте в виду, что строб Forced Output Compare (FOC1B) не будет устанавливать флаг OCF1B.
OCF1B автоматически очистится, когда выполнится обработчик прерывания по адресу Output Compare Match B Interrupt Vector. Альтернативно OCF1B можно очистить записью в него лог. 1 (запись 0 не оказывает никакого действия).
TOV1 (бит 2): Timer/Counter1, Overflow Flag
Установка этого флага зависит от настроек бит WGM13..WGM10. В режимах Normal и CTC флаг TOV1 установится, когда счетчик таймера переполнится. См. описание действия бит WGM13..WGM10 в таблице 19-5 для получения информации по поведению флага TOV1 для различных настроек бит WGM13..WGM10.
TOV1 автоматически очистится, когда выполнится обработчик прерывания по адресу Timer/Counter1 Overflow Interrupt Vector. Альтернативно TOV1 можно очистить записью в него лог. 1 (запись 0 не оказывает никакого действия).