Средства генерации, счёта импульсов и формирования временных интервалов в ATxmega
А. САВЧЕНКО, пос. Зеленоградский Московской обл.
Эта статья продолжает серию материалов того же автора об архитектуре микроконтроллеров семейства ATxmega.
В микроконтроллерах ATxmega серии АЗ имеются восемь таймеров-счётчиков — по два на каждый из портов С D, Е, Е Основой для них стал довольно удачный шестнадцатиразрядный таймер-счётчик микроконтроллеров ATmega, который получил ряд полезных усовершенствований.
Все эти таймеры-счётчики абсолютно идентичны между собой в функциональном плане, но подразделяются на два типа — ТСхО и ТСх1, где х — символическое имя порта, с которым ассоциирован таймер-счётчик. Различие в том, что ТСхО имеют по четыре канала захвата-сравнения, подключаемых к линиям 0—3 своего порта, а в ТСх1 — всего два таких канала, которые подключаются к линиям 4 и 5. Их предшественник — шестнадцатиразрядный таймер-счётчик микроконтроллера семейства ATmega — хорошо описан в [1], поэтому в предлагаемой статье речь пойдёт только об отличиях от него, присущих таймеру-счётчику ATxmega.
Упрощённая структура таймера-счётчика представлена на рис. 1. Он может работать в следующих режимах: нормальном (NORMAL), генерации сигналов заданной частоты (FRQ) и генерации ШИМ-сигналов (PWM). Функционирование таймера-счётчика в этих режимах хорошо освещено в [2, 3], поэтому здесь не описывается.
Очень полезное усовершенствование — введение в структуру таймера-счётчика регистра периода (PER) для хранения значения модуля счёта. В ходе работы счётчика содержимое его счёт ного регистра CNT изменяется от 0 до содержимого регистра PER в ходе прямого счёта и от содержимого регистра PER до 0 в ходе обратного счёта.
Загружая новые значения в регистр PER, можно "на лету" изменять модуль счёта. Это существенно расширяет возможности таймера-счетчика, например, при генерации импульсных последовательностей и ШИМ-сигналов.
Тактировать счётчик можно как сигналами тактовой частоты периферийных устройств микроконтроллера

, так и сигналами, поступающими из системы событий. При этом сигналы событий могут использоваться не толь ко для тактирования, но и для управления работой таймера-счётчика, заставляя его, например, выполнять захват, сравнение или квадратурную дешифрацию, которая рассматривалась в статье [4].
Загрузка новых значений в регистр PER и регистры каналов захвата-сравнения CCA—CCD обычно происходит немедленно после их выдачи программой, однако в ряде случаев немедленное обновление нежелательно, поскольку может вызвать кратковременное появление так называемых "странных сигналов", например, нелогичное изменение длительности формируемых импульсов. Природу такого явления иллюстрирует рис. 2.
Допустим, в регистр периода записано значение PERI, поэтому содержимое счётного регистра CNT циклически изменяется от 0 до этого значения. В момент времени

, происходит перезагрузка регистра периода значением PER2 При PER2>PER1 нарушения в работе счётчика не происходит — CNT досчитает до значения PER2, обнулится и начнёт новый цикл счёта той же длительности.
Но в момент времени

производится перезагрузка регистра PER значением PER3. На этот раз PER3<PER2. Теперь логика управления ждёт выполнения условия CNT = PER3, чтобы обнулить счётчик. Однако в текущем цикле счёта это равенство не будет выполнено, если в момент времени

значение CNT уже было больше PER3. Поэтому счетчик будет считать до переполнения, которое наступит после 65535-го тактового импульса, обнулится самостоятельно и лишь после этого начнёт выполнять циклы счёта от 0 до PER3.
Подобное явление может иметь место при перезагрузке не только регистра периода, но и регистров каналов захвата-сравнения. Для исключения этих ситуаций в таймере-счётчике предусмотрена двойная буферизация загружаемых значений с помощью буферных регистров периода PERBUF и захвата-сравнения CCnBUF.
При двойной буферизации новое значение предела счёта загружают не в основной, а в буферный регистр. Ситуация, представленная на рис. 2, принимает вид, показанный на рис. 3. При загрузке регистра PERBUF, которую производят в моменты времени

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

a одновременно с обнулением счётного регистра происходит перенос значения из регистра PERBUF в регистр PER, поэтому последующие циклы выполняются уже с НОВЫМ периодом. Более подробно механизм двойной буферизации рассмотрен в [3].
При необходимости два 16-разряд-ных таймера-счётчика могут быть объединены в один 32-разрядный с помощью системы событий микроконтроллера. Переполнение "младшего" таймера-счётчика генеоирует событие, которое через канал системы событий поступает в качестве тактирующего сигнала на "старший" таймер-счётчик.
Каждый таймер-счётчик микроконтроллера может генерировать запросы прерывания и события. Условия их генерации одинаковы:
— переполнение (переход от максимального значения к нулевому) 8 ходе прямого счёта или переопустошение (переход от нулевого значения к максимальному) в ходе обратного счёта;
— захват текущего состояния счётного регистра в регистр захвата или равенство текущего значения в счётном регистре значению, загруженному в регистр сравнения (фиксируется каждым из каналов);
— переполнение буфера при использовании любого из каналов захвата-сравнения в режиме захвата.
Таймер-счётчик принимает три программные команды управления, с помощью которых можно незамедлительно изменить его состояние. Команда обновления вызывает те же действия, что и достижение значением в счётном регистре условия обновления. Она может быть заблокирована, если установлен разряд блокировки обновления. Команда повторного старта выполняет принудительный перезапуск текущего периода генерации импульсов, а команда начальной установки позволяет инициализировать все регистры таймера-счётчика начальными значениями. Эта команда исполняется только при условии выключенного состояния таймера счётчика.
И в заключение разговора об особенностях таймера-счётчика несколько слов о двух модулях микроконтроллера, которые хоть и считаются независимыми, но работают только в совокупности с таймером-счётчиком.
Первый из них — модуль повышения разрешающей способности Hi-Res (Hi-Resoiution). Он предназначен для повышения разрешающей способности таймера-счётчика по времени в режимах генерации импульсов заданной частоты и ШИМ.
Основа модуля

— двухразрядный счётчик, тактируемый сигналом CLKPER4 (см. рис. 3 в [5]), частота которого в четыре раза выше частоты С1_КРЕН. При работе в режиме Hi-Res гаймер-счётчик тактируется сигналом CLKPER, однако с каждым тактовым импульсом значение в регистре CNT изменяется не на одну, а на четыре единицы (увеличивается при прямом счёте или уменьшается при обратном). При этом содержимое двух младших разрядов не изменяется.
Результат счёта "склеивается" из 14- ги старших разрядов таймера-счётчика и двух разрядов дополнительного счётчика Hi-Res, которые становятся двумя младшими разрядами 16-разрядного результата счёта. Результат получается правильным, поскольку тактовые последовательности

строго
синхронизированы. Разрешающая способность по времени в режиме Hi-Res улучшается в четыре раза.
В режиме Hi-Res+ к 14-ти старшим разрядам счётного регистра добавляют три разряда дополнительного счётчика, который теперь использует оба (нарастающий и спадающий) перепада импульсов частотой

. Поэтому разрешающая способность по времени улучшается в восемь раз.
Микроконтроллер имеет четыре блока Hi-Res — по одному на каждый из портов, оснащённых таймерами-счётчиками.
Ещё один, предназначенный для расширения возможностей таймера-счётчика, модуль микроконтроллера — AWeX (Auvanced Waveform extension — узел улучшения формы сигнала). Он расширяет возможности таймера-счётчика в режимах генерации импульсов и упрощает реализацию функций управления мощными двухтактными преобразователями напряжения и электродвигателями различных типов — асинхронных, шаговых, коммутируемых реактивных (SR) и бесщёточных постоянного тока (BLDC).
В микроконтроллере имеются два модуля AWeX, которые работают только с нулевыми таймерами-счётчиками портов С и Е. Каждый из них реализует две функции:
— формирует сигналы управления двухтактными импульсными преобразователями напряжения различного назначения со вставкой в выходные импульсные последовательности интервалов "мёртвого времени", что позволяет упростить создание этих узлов и управление их работой;
— генерирует цифровые шаблоны, которые дают возможность управлять электродвигателями, требующими коммутации обмоток по сложным алгоритмам. Следует иметь в виду, что формируемые микроконтроллером сигналы выводятся через линии порта с невысокой нагрузочной способностью и требуют дополнительного усиления, а для управления верхними ключами полумо-стовых и мостовых преобразователей ещё и применения специализированных драйверов.
В деталях работа модуля AWeX описана в [2, 3].
Управление таймером-счётчиком в BASCOM AVR
Для конфигурирования таймеров-счетчиков в системе разработки про-
грамм BASCOM AVR предназначена директива Config ТСху, где х — символическое имя порта, с которым ассоциирован таймер-счётчик; у — тип таймера-счётчика (0 или 1). Полное описание этой директивы приведено в разделе "Помощь" BASCOM AVR. Она позволяет задать большинство необходимых для настройки таймера-счётчика параметров, а недостающие параметры загружаются в программно-доступные регистры таймера-счётчика, основные из которых перечислены ниже.
1.Шестнадцатиразрядные регистры.
PER — уже упоминавшийся выше регистр периода.
CCA, ССВ, ССС, CCD — регистры каналов захвата-сравнения нулевого таймера-счётчика (в имеющем лишь два канала захвата-сравнения первом таймере-счётчике только регистры ССА и ССВ).
2. Восьмиразрядные регистры.
CTRLA — регистр управления А.
Разряды 4—7 не используются, их чтение возвращает нули.
CLKSEL[3:0] (разряды 3—0) — выбор источника тактовых импульсов для таймера-счётчика в соответствии с табл. 1.
CTRLB — регистр управления В.
CCDEN (разряд 7), CCCEN (разряд 6), CCBEN (разряд 5), CCAEN (разряд 4) — разрешения работы каналов захвата-сравнения. Чтобы выходной импульсный сигнал был выведен на линию порта ввода—вывода, необходимо записать 1 в соответствующий разряд этого регистра. Кроме того, линия ввода—вывода должна быть настроена как выход.
Разряд 3 не используется, читается как 0.
WGMODE[2:Oj (разряды 2—0) — код режима работы таймера-счётчика в соответствии с табл. 2.
CTRLD — регистр управления D. EVACT[2:0] (разряды 7—5) — код реакции таймера-счётчика на событие в соответствии с табл. 3
EVDLY (разряд 4) — единица в этом разряде приводит к задержке сигнала выбранного источника на один период

. Эта возможность специально предусмотрена для правильного функционирования составного 32-разряд-ного таймера-счётчика и необходима для компенсации задержки распространения сигнала, образующейся в результате каскадирования двух счётчиков.
EVSEL[3:0] (разряды 3—0) — выоор источника событий в соответствии с табл. 4.
CTRLF — регистр управления F.
Разряды 7—4 не используются.
CMD[1:0] (разряды 3, 2) — код программной команды управления таймером-счётчиком в соответствии с табл, 5.
LUPD (оазряд 1) — блокировка обновления.
DIR (разряд 0) — направление счёта: 0 — прямой, 1 — обратный.
CTRLFSET — установка единиц в регистре CTRLF.
CTRLFCLR — установка нулей в регистре CTRLF.
С регистром CTRLF, как и с некоторыми другими регистрами таймера-счётчика, связаны два регистра установки. Оба они абсолютно идентичны по структуре, но выполняют по отношению к регистру CTRLF противоположные действия: единица в оазряде регистра CTRLFSET устанавливает такое же значение в соответствующем разряде регистра CTRLF, а единица в разряде регистра CTRLFCLR, наоборот обнуляет его. Так сделано для того, чтобы избежать применения к регистру CTRLF операции "чтение—модификация—запись”.
INTFLAGS — регистр флагов прерываний.
CCDIF (разряд 7), CCCIF (разряд 6), CCBIF (разряд 5), CCAIF (разряд 4) — флаги запросов прерывания от каналов захвата-сравнения. В режиме захвата флаг устанавливается, когда в соответствующем регистре блока сравнения появляется захваченная информация. Флаг снимается чтением соответствующего регистра захвата. Переход по вектору прерывания к снятию флага не приводит.
В остальных режимах флаг устанавливается при совпадении значений в регистре CNT и соответствующем регистре сравнения. Он автоматически снимается при переходе по вектору прерывания.
Разряды 3, 2 не используются, при чтении возвращают 0.
ERRIF (разряд 1) — флаг прерывания по ошибке. В режимах генерации импульсов заданной частоты и ШИМ этот флаг устанавливается, если узлом аварийной защиты блока AWeX обнаружена некорректная работа. Флаг ERRIF никогда не устанавливается у таймеров-счётчиков, для которых не предусмотрен блок AWeX. В режиме захвата флаг ERRIF сигнализирует о переполнении буфера в любом из каналов захвата-сравнения, а в режиме управляемой событиями квадратурной дешифрации он свидетельствует о подаче некорректного индексного сигнала Флаг ERRIF автоматически снимается при переходе по соответствующему вектору прерывания.
OVF (разряд 0) — флаг прерывания по переполнению/переопустошению счётного регистра. Он автоматически снимается при переходе по соответствующему вектору прерывания.
Любой из Флагов прерывания можно снять записью в него единицы.
Примеры работы с таймером-счётчиком
В рассматриваемых далэе примерах предполагается, что тактовая частота CLKper равна 32 МГц.
Пример 1. Вывести на линию PD2 прямоугольные импульсы частотой 75 кГц.
Для этого необходимо выполнить следующее:
— выбрать нужный таймер-счётчик и перевести его в режим генерации импульсов заданной частоты;
— рассчитать необходимое значение модуля счёта и занести его в нужный регистр захвата-сравнения;
— настроить линию PD2 на выход.
Задачу будем решать с помощью
таймера TCD0, так как его каналы захвата-сравнения подключены к линиям 1—3 порта D. К нужной второй линии подключён канал ССВ.
Частота следования импульсов на выходе таймера-счётчика, согласно [3], равна

где N — коэффициент предварительного деления частоты (см. описание регистра CTRLA); ССп —значение в нужном регистре канала захвата-сравнения, для нашего случая в регистр ССВ следует записать число
Чтобы вычислить его, необходимо задаться одним из возможных (см. табл. 1) и при этом допустимых, исходя из решаемой задачи, значением N. Если вычисленное значение ССВ получилось дробным, его округляют до ближайшего целого. Чтобы уменьшить ошибку округления, следует выбирать N минимально возможным.
Например, при N = 8 и вычисленном значении ССВ = 25,6(6) принимаем ССВ =26, что даёт ошибку 1,3 %. При N = 1 и вычисленном ССВ = 212,3(3) принимаем ССВ = 212, чем уменьшаем ошибку до 0,15%. Выбираем последний вариант и составляем программу:
Пример 2. Настроить таймер-счётчик на генерацию широтно-модулированной импульсной последовательности в режиме двунаправленного счёта (условие обновления — CNT=0) с двойной буферизацией, разрешающей способностью 6 разрядов и частотой 62,5 кГц. Вывести сигнал на вывод РС4.
Для формирования этого сигнала следует использовать канал захвата-сравнения А (регистр ССА) таймера-счётчика ТСС1. При двунаправленном счёте действуют следующие соотношения [3].
—требуемое значение модуля счёта, хранимое в регистре периода
где m — разрешающая способность, разрядов. Для m = 6 получаем PER = 63;
— частота следования импульсов
где N — коэффициент предварительного деления частоты (см. регистр CTRLA). Зная значение PER, легко подсчитать. что N = 4.
Осталось разобраться с двойной буферизацией. В рассмотренной выше информации о структуре программнодоступных регистров отсутствуют какие-либо сведения о том, как включить этот режим. Не предусмотрены соответствующие параметры и в директивах конфигурации таймера-счётчика. Как быть? Всё просто — двойная буферизация будет автоматически включена, если вместо регистра PER загрузить значение периода в регистр PERBUF.
Теперь можно приступать к программированию;
На этом настройка таймера-счётчика закончена. Теперь значением в регистре ССА можно задавать требуемый коэф- II фициент заполнения импульсов. Сле- I дующая строка установит его равным приблизительно 50 %:
Необходимо лишь следить, чтобы в процессе работы программы число в регистре ССА не превысило значения в регистре PER.
ЛИТЕРАТУРА
1. Евстифеев А. В. Микроконтроллеры AVR семейств Tiny и Меда фирмы At.nel. — М.: "Додэка-ХХГ, 2008.
2. Xmega A. Manual. — URL:
http://www. atmel.com/lmages/doc8077.pdf (28.03.15).
3. Руководство по 8-битным AVR-микроконтроллерам XMEGA А. — URL:
http://www. gaw.ru/html.cgi/txt/aoc/micros/avr/arh_x mega a (28.03.15).
4. Савченко А. Система событий микроконтроллеров ATxmega. — Радио, 20'5, № 2, с. 24-27.
5. Савченко А. Система синхронизации микроконтроллера ATxmega и её настройка средствами BASCOM AVR. — Радио, 2015, № 7, с. 27-29.