Как мы упоминали ранее, количество 16-разрядных таймеров/счетчиков (Т/С) у микроконтроллеров XMEGA для различных подсемейств составляет от 5 до 8 блоков. Разработчики XMEGA взяли базовый, удачно сбалансированный 16-разрядный Т/С от «старших» AVR (например, у mega128 он обозначается Т1), и добавили к нему ряд полезных усовершенствований. В результате получился мощный, функционально насыщенный, гибкий, удобный в конфигурировании и работе таймер/счетчик.
Все Т/С в XMEGA имеют одинаковую структуру и выполняют одинаковые общие функции: формирование интервалов времени, сигналов заданной частоты и сигналов ШИМ; измерение временных параметров цифровых сигналов; синхронизацию с системой событий. Унификация Т/С в XMEGA оказалась очень удобной, так как разработчику теперь не нужно помнить о различиях в инициализации и режимах работы этих периферийных блоков — изменяется лишь количество доступных таймеров на кристалле. Например, даже у «старших» AVR есть и 8-разрядные и 16-разрядные Т/С, причем их инициализация и режимы работы различаются. А у XMEGA теперь все стандартизовано.
Блоки таймеров/счетчиков на кристаллах XMEGA бывают двух типов и обозначаются ТСхО и ТСх1. Символические имена отражают тип блока (0 или 1) и порт ввода/вывода, с которым ассоциирован данный Т/С. Например, TCD0 — таймер/счетчик типа 0, подключенный к PORTD. В микроконтроллерах XMEGA таймеры/счетчики доступны пользователю на портах PORTC, PORTD, PORTE или PORTF. Выходы ТСхО подключены к линиям 0-3 порта, а выходы ТСх1 — к линиям 4 и 5. Таймер/счетчик типа 0 имеет 4 канала захвата/сравнения (ССn), а таймер/счетчик типа 1 — всего 2 канала. На этом различия заканчиваются. Все Т/С для тактирования могут быть присоединены либо к сигналу периферийной тактовой частоты, либо к системе событий.
Поскольку таймеры/счетчики у XMEGA являются улучшенной версией 16-разрядных Т/С «старших» микроконтроллеров megaAVR, то для общего знакомства и описания режимов работы 16-разрядных таймеров/счетчиков мы рекомендуем использовать описание блоков Т1 (ТЗ) у микроконтроллера ATmega128. Общие функции — обращение к 16-разрядным регистрам, режим работы Normal, режим захвата и все режимы формирования ШИМ-сигналов — в настоящей статье рассматриваться не будут. Мы расскажем лишь о нововведениях и отличительных особенностях Т/С у XMEGA.
Структура таймера/счетчика типа 0 с аппаратными расширениями и ассоциированными периферийными модулями (показаны серым цветом) приведена на рисeyrt. Блок Т/С состоит из базового счетчика и набора каналов захвата/сравнения. Базовый счетчик используется для подсчета тактовых циклов или событий; есть возможность изменять непосредственно в ходе работы направление счета (для этой цели предусмотрен специальный бит DIR) и период. Каналы ССn могут использоваться совместно с базовым счетчиком для реализации функций сравнения и генерации различных цифровых последовательностей (FRQ или PWM), либо выполнять функции захвата. Два Т/С могут объединяться для построения 32-разрядного таймера/счетчика. При этом переполнение от младшего таймера в цепи может быть разведено через систему событий на старший таймер и использоваться в качестве тактирующего сигнала для него. Совместно с блоками Т/С могут работать два внешних модуля расширения: модуль высокого разрешения Hi-Res и модуль Advanced Waveform extension (AWeX) для формирования специализированных частотных сигналов для задач управления электродвигателями. Подробную структурную схему Т/С рекомендуется смотреть в технической документации на микроконтроллер.
Начнем с организации тактирования. Все таймеры/счетчики у XMEGA могут тактироваться либо сигналом периферийной тактовой частоты, либо сигналами, которые поступают из системы событий микроконтроллера (см. рисунок).
Периферийный тактовый сигнал сначала поступает на предварительный делитель, который является общим для всех модулей Т/С на кристалле микроконтроллера. Каждый Т/С имеет в регистре CTRLA четыре отдельных бита CLKSEL[3:0] для выбора в качестве источ-ника тактирования для счетного регистра CNT одного из выходов предварительного делителя или одного из каналов системы событий. В режиме тактирования от Event System любое событие (внешний тактовый сигнал или сигнал на линии ввода/вывода) может выступать в качестве источника входных импульсов. События типа «Data» также могут управлять работой Т/С, «заставляя» его осуществлять захват или сравнение, изменять направление счета (вверх или вниз) и работать с квадратурно-кодированными сигналами. Выбор типа реакции Т/С устанавливается битами EVACT в регистре CTRLD.
При старте микроконтроллера тактирование таймера/счетчика отключено (установка «по умолчанию»), он находится в состоянии OFF.
Еще одна полезная особенность таймеров/счетчиков у XMEGA — наличие специального регистра периода PER, который непосредственно связан со счетным регистром CNT. В регистр периода записывается программируемое значение (ТОР), по достижении которой таймер/счетчик должен переходить к очередному циклу работы (в документации на микроконтроллеры XMEGA это аппаратное условие обозначается UPDATE): при счете «вверх» он начинает инкрементировать с нуля, а при счете «вниз» — декрементировать от значения, записанного в регистр PER. Наличие регистра PER предоставляет большое удобство, так как непосредственно в ходе работы можно изменять значение периода таймера, просто записывая новое значение в регистр PER. Операция записи в этот регистр выполняется немедленно.
Еще одно нововведение у XMEGA — дублирующее буферирование (Double Buffering или DBF) части регистров таймера/счетчика. Дублиро-ваны регистр PER и все регистры каналов ССn — для каждого из них добавлен свой буферный регистр PERBUF и CCnBUF соответственно. Каждый буферный регистр имеет собственный ассоциированный флаг BV (Buffer Valid), установка которого сигнализирует о том, что PERBUF или CCnBUF содержит новое значение, готовое к копированию в основной регистр PER или ССn.
Для регистра PER и для регистров ССn при работе таймера/счетчика в режиме сравнения (рисунок) флаг BV устанавливается, когда новые данные записываются в буферный регистр, и сбрасывается, когда содержимое буферного регистра копируется в основной регистр. Буферный регистр мгновенно копирует свое содержимое в основной регистр при достижении счетной последовательностью значения ТОР или BOTTOM в соответствии с работой внутренней логики управления Т/С. Таким образом, записываемое число постоянно хранится в буферном регистре, а обновление основного регистра происходит только при достижении счетчиком верхнего или нижнего порога. Это происходит каждый раз автоматически до момента обновления самого буферного регистра PERBUF (или CCnBUF). Такая синхронизация помогает устранить искажения на выходе таймера/счетчика (переменная длина импульса, ложная частота, случайный выброс) в формируемой временной цифровой последовательности, будь то сигнал заданной частоты или ШИМ-сигнал.
Double Buffering существенно повышает точность работы Т/С. Покажем это применительно к регистру периода PER. На рисунках приведены диаграммы работы Т/С в режиме счетчика без использования функции DBF и с ней. Если дублирующее буферирование не используется, то любое обновление периода путем записи нового значения в регистр PER будет осуществляться немедленно. Это может вызывать незапланированное циклическое обновление таймера (переход от всех «1» ко всем «О») и, следовательно, генерацию «странных» сигналов или ложных частот в спектре формируемого сигнала. Если DBF используется, то значение в буферном регистре может быть изменено в любое время, но основной регистр PER будет обновляться только при наступлении условия UPDATE, которое в данном случае возникает при достижении счетчиком значения BOTTOM. Это позволяет избежать проблем с частотой и формой генерируемого выходного сигнала.
Когда каналы ССn работают в режиме захвата, то используется похожий механизм Double Buffering. Здесь основной регистр ССn и соот-ветствующий ему буферный регистр CCnBUF образуют FIFO (рисунок), в котором захват выполняется регистром CCnBUF, и при этом уста-навливается флаг BV. Но текущее захваченное значение копируется из CCnBUF в основной регистр только в случае, если ССn пустой (флаг IF не установлен). Такая аппаратная организация позволяет сохранять два значения захвата: флаг IF сигнализирует о том, что регистр ССn содержит захваченное значение, которое еще не прочитано, а флаг BV — что в регистре CCnBUF находится текущее (последнее) захваченное значение.
При установке флага IF также могут генерироваться соответствующий запрос на прерывание (если разрешено) или запрос контроллеру DMA на выполнение транзакции. Флаг IF автоматически сбрасывается при считывании содержимого основного регистра ССn, что автоматически разрешает немедленное аппаратное копирование в ССn нового значения захвата, которое до этого сохранялось в буферном регистре.
Таймер/счетчик может определять переполнение буфера на любом из каналов захвата/сравнения. Если случается, что установлены оба флага BV и IF, и в это же время осуществляется новый захват, то сохранить новое значение «метки» счетной последовательности просто негде — возникает ситуация переполнения буфера. В этом случае новое значение захвата игнорируется и нигде не запоминается, но устанавливается специальный флаг ERRIF в регистре INTFLAGS, что может генерировать запрос на прерывание типа «ошибка» (если разрешено).
В микроконтроллерах XMEGA два таймера/счетчика могут использоваться совместно для реализации 32-разрядного захвата. При этом сигнал переполнения «младшего» таймера в цепочке через систему событий подключается на вход тактирования «старшего» таймера. И тут есть одна тонкость. Поскольку все события в XMEGA конвейеризированы, то «старший» таймер будет обновляться спустя 1 период периферийного тактового сигнала после того, как произошло переполнение «младшего» таймера. Это может давать погрешность в определении реального значения захвата. Для компенсации этой «технологической» задержки факт наступления события типа «захват» для «старшего» таймера должен быть задержан на такое же время. Это осуществляется путем установки специального бита EVDLY (Event Delay) в регистре управления CTRLD для выбранного таймера.
И основные регистры всех каналов захвата/сравнения у XMEGA, и соответствующие буферные регистры доступны через общее адресное пространство ввода/вывода микроконтроллера. Это обеспечивает гибкость при работе с таймером/счетчиком, включая эффективное использование дублирующего буферирования. Подробнее структуру организации Double Buffering следует смотреть в технической документации на микроконтроллеры XMEGA.
Таймеры/счетчики могут генерировать и события, и запросы на прерывание. Событие будет сгенерировано при тех же условиях, при которых возможна генерация запросов на прерывание: совпадение кодов в регистре сравнения и в счетном регистре, достижение значения ТОР в регистре PER и обнуление счетного регистра. Каждый канал захвата/сравнения имеет свое отдельное прерывание. В дополнение, Т/С может генерировать запрос на прерывание по сигналу ошибки. Поступаю-щие на Т/С события от Event System также могут интерпретироваться по-разному: инкрементировать или декрементировать счетчик, выполнить функцию захвата, а также обработать информацию, которая поступает в виде квадратурно-кодированных сигналов.
Флаги запросов на прерывание могут быть использованы для инициирования транзакций с помощью модуля DMA. Используемые флаги запросов на прерывание — по переполнению или обнулению, по сигналу ошибки, а также при появлении флага прерывания в любом из каналов захвата/сравнения. Подробнее все это можно посмотреть в технической документации на микроконтроллер.
В микроконтроллерах XMEGA реализована возможность прямого программного управления работой таймера/счетчика — введен набор специальных команд, которые непосредственно управляют аппаратной логикой Т/С. Для генерации этих команд используются два бита CMD[1:0] в статусном регистре CTRLFSET.
Команда «Force update» используется для форсирования наступления условия UPDATE. Буферные регистры при этом немедленно копируются в основные регистры PER и ССn безотносительно к их текущим значениям. Это может быть полезно в случаях, когда необходимо обновить и регистр периода, и регистры сравнения точно в одно и то же время — при формировании программистом условия UPDATE. Для этого следует предварительно установить в регистре CTRLFSET специальный бит блокировки LUPD (Timer Lock Update) — это заблокирует автоматический аппаратный UPDATE из буферных регистров. Затем можно записать все необходимые значения в буферные регистры, снять бит LUPD и инициировать команду «Force update» путем записи в биты CMD[1:0]. Отметим, что в режиме захвата команда «Force update» будет воздейство-вать только на содержимое регистров PERBUF и PER.
Команда «Force restart» предназначена для рестарта текущего периода формирования выходной цифровой последовательности. Она сбрасывает содержимое счетного регистра CNT, бит направления счета DIR и все выходы каналов сравнения к значениям по умолчанию, то есть, попросту обнуляет их. Другая команда «Force hard reset» приводит содержимое всех регистров в выбранном блоке Т/С к их значениям по умолчанию. То есть, для выбранного таймера/счетчика это будет означать его полный индивидуальный сброс. Для устранения нежелательных «последствий» для прикладной программы эта команда может быть выполнена только в случае, если тактирование выбранного Т/С остановлено (состояние OFF). В противном случае команда «Force hard reset» не будет иметь никакого эффекта.
В заключение обзора таймеров/счетчиков расскажем о двух дополнительных аппаратных модулях, которые включены на кристаллы XMEGA и работают в совокупности с таймерами/счетчиками, но являются независимыми. Это модули расширения AWeX и Hi-Res.
Модуль расширения Hi-Res (Hi-Resolution) имеется у всех таймеров/счетчиков XMEGA вне зависимости от их типа. Выходная цифровая последовательность (FRQ или PWM), генерируемая таймером, может быть «пропущена» через этот блок расширения перед тем, как быть подключенной к выходным линиям порта ввода/вывода. Модуль Hi-Res тактируется сигналом, частота которого в 4 раза превышает частоту периферийного тактового сигнала. Это позволяет увеличить разрешение формируемых сигналов ШИМ в 4 раза. Заметим, что данный модуль не повышает значение частоты, а только увеличивает разрешение. Например, можно получить сигнал ШИМ с частотой 31,25 кГц и разрешением 12 бит, или ШИМ-последовательность с частотой 500 кГц и разрешением 8 бит. Все генерируемые частотные сигналы будут синхронизированы с сигналами основной и периферийной тактовых частот. Помимо выигрыша в точности такое решение еще и уменьшает энергопотребление, так как на высокой частоте работают только два младших разряда получающегося «тандемного счетчика». Управление подключением модуля Hi-Res осуществляется установкой соответствующих битов HREN[1:0] в регистре CTRLA модуля Hi-Res.
Отметим, что установка любого или сразу обоих битов HREN подключит модуль расширения Hi-Res ко всему порту ввода/вывода. Это означает, что оба таймера ТСхО и ТСх1, ассоциированные с конкретным портом ввода/ вывода, в случае их одновременной работы на генерацию выходных сигналов FRQ или PWM, должны разрешать функцию Hi-Res.
Более подробно рассмотрим второе аппаратное расширение — Advanced Waveform extension. Это расширение доступно только для таймеров/счетчиков типа «О», которые ассоциированы с портами ввода/вывода PORTC и PORTE. Они имеют обозначения AWEXC и AWEXE соответственно. Модуль AWeX предназначен для работы в двух режимах:
– DTI — генерация верхнего и нижнего интервалов «мертвого времени» для вставки в выходную цифровую последовательность;
– Pattern Generation — генерация цифровых шаблонов (синхронная комбинация битов).
Обе опции необходимы для удобного и надежного управления приводами. В первом случае — для управления инверторами мощных электродвигателей; во втором — для шаговых двигателей, вентильно-индукторных (SRD) двигателей и бесщеточных электродвигателей постоянного тока (BLDC), для управления которыми требуется специальный блок, выполняющий коммутацию обмоток двигателя по определенному алгоритму в зависимости от положения ротора.
Структурная схема модуля расширения AWeX показана на рисунке. Его работа в режиме DTI возможна только в случае, когда таймер/счетчик сконфигурирован на формирование ШИМ-сигналов. Когда работа AWeX разрешена, выход каждого канала ТСхО «расщепляется» на два комплементарных выхода. Эта пара выходных сигналов проходит через блок вставки интервалов «мертвого времени» (DTI), что позволяет генерировать неинвертированный сигнал для нижнего ключа (LS) и инвертированный сигнал для верхнего ключа (HS) со вставками интервалов «мертвого времени» между активными состояниями ключей. Выход блока DTI будет перехватывать управление линиями ассоциированного порта ввода/вывода за исключением функции инверсии выходного сигнала на линиях порта — бит INVEN регистра PINnCTRL всегда будет выполнять свою функцию и может быть использован для инверсии выходного сигнала.
Работа блока DTI гарантирует, что верхний и нижний ключи никогда не будут включены одновременно. Блок DTI состоит из 4-х одинаковых генераторов интервала «мертвого времени» — по одному на каждый канал захвата/сравнения у ТСхО. 8-разрядные регистры «мертвого времени» имеются для обоих типов ключей: верхнего — DTHS и нижнего — DTLS. Оба регистра буферизованы, то есть снабжены дополнительными регистрами DTHSBUF и DTLSBUF.
Регистры «мертвого времени» являются общими для всех четырех каналов DTI и определяют количество тактов сигнала периферийной тактовой частоты, в течение которых должен присутствовать интервал «мертвого времени». Интервалы «мертвого времени» для верхнего и нижнего ключей могут устанавливаться раздельно, тогда они могут иметь разные значения. Допускается одновременная установка интервала «мертвого времени» для обоих ключей, но в этом случае времена будут одинаковыми. Для этого используется еще один байтовый регистр DTBS, запись в который приводит к одновременному обновлению содержимого регистров DTLS и DTHS. Регистр DTBS также буферизован, его бу-ферный регистр обозначается как DTBSBUF. Рисунок поясняет принцип формирования выходной ШИМ-последовательности для инвертора со вставками интервалов «мертвого времени».
Все четыре канала модуля расширения AWeX могут программироваться и работать независимо друг от друга. Но в ряде случаев может потребоваться выдача одинаковой ШИМ-последовательности сразу на все каналы блока DTI. Для этой цели служит бит CWCM в регистре управления CTRLA блока AWeX. Если этот бит установлен, то только выход канала ССА будет использоваться как единый источник сигнала ШИМ сразу для всех четырех каналов DTI. Поступающие на блок DTI выходные сигналы с других каналов захвата/сравнения (В, С и D) будут игнорироваться. Такой режим в микроконтроллерах XMEGA носит название Common Waveform Channel Mode или CWCM.
Когда в AWeX инициализирована подсистема Pattern Generation для аппаратной генерации синхронных цифровых последовательностей (шаблонов) для выдачи сигналов на порт ввода/вывода (режим PGM), то весь модуль расширения работает немного по-другому. Во-первых, требуется установить бит PGM в регистре управления CTRLA блока AWeX. Это заблокирует работу блока DTI и передаст возможность управления линиями ввода/вывода порта блоку Pattern Generation. Затем, чтобы передать управление линией «х» порта ввода/вывода модулю AWeX, необходимо дополнительно установить соответствующий бит «х» в специальном регистре OUTOVEN. Отметим, что направление работы линии порта (на ввод или на вывод информации) автоматически не перехватывается при установке бита OUTOVENx. Программист должен заранее позаботиться о конфигурации линии порта для работы на выход, иначе на выводы микроконтроллера ничего поступать не будет. Буферный регистр DTLSBUF используется в этом режиме для хранения цифрового шаблона, который требуется передавать на выход порта микроконтроллера. Другой буферный регистр DTHSBUF используется в этом режиме для хранения копии установок режимов работы линий ввода/вывода ассоциированного порта микроконтроллера — то есть регистра PINxCTRL Эта копия настроек порта будет использована только в случае, если соответствующий бит в регистре DTLSBUF не установлен (и, следовательно, ему не разрешен перехват управления этой линией порта).
Содержимое обоих буферных регистров копируется в соответствующие им основные регистры каждый раз при наступлении условия UPDATE — подобно всем остальным регистрам Т/С, снабженным функцией дублирующей буферизации. Это обеспечивает полную син-хронизацию с временными параметрами выбранного режима формирования выходной цифровой последовательности. Если синхро-низация не требуется, то программист может непосредственно обновлять содержимое регистров OUTOVEN и PINxCTRL порта. Блок-схему работы модуля расширения AWeX в этом режиме можно посмотреть в технической документации на микроконтроллер.
Модуль AWeX также снабжен быстрым встроенным механизмом защиты от сбоев. Для этого в его состав введен дополнительный аппаратный узел Fault Protection. Этот узел непосредственно подключен к системе событий микроконтроллера. Выбор канала, который подключается к Fault Protection, определяется содержимым регистра FDEMASK: установка бита «n» означает подключение канала «n» системы событий. Если требуется, чтобы входной сигнал на узел защиты от сбоев поступал от нескольких каналов системы событий одновременно, то для этой цели биты в регистре FDEMASK могут объединяться по «ИЛИ», разрешая доступ многочисленным источникам событий к узлу Fault Protection в одно и то же время.
Когда приложение определяет наступление сбоя, то на вход узла поступает событие от Event System микроконтроллера. Сразу же устанавливается флаг ошибки FDF в регистре STATUS модуля AWeX, и после этого активируется соответствующее действие Fault Protection, выбор которого определяется установками битов FDACT[1:0] в регистре FDCTRL:
ничего не делать — игнорировать сбой;
– сбросить регистр OUTOVEN (т.е. запретить перехват управления линиями порта узлом DTI). В результате выход будет сконфигурирован в соответствии с установками порта ввода/вывода;
– сбросить регистр управления направлением передачи данных DIR ассоциированного порта.
В результате линии порта переводятся в высокоимпедансное состояние.
Установка флага FDF автоматически вызывает установку флага ошибки у всего таймера/счетчика. При этом также генерируется запрос на прерывание (если разрешено).
Отметим, что от момента генерации события в периферийном блоке микроконтроллера (сбой) до момента, когда Fault Protection инициирует соответствующее действие, проходит максимум (!) два периода периферийной тактовой частоты. Аппаратный узел Fault Protection полностью независим от работы процессорного ядра и контролера DMA, но для функционирования ему требуется сигнал периферийной тактовой частоты.
Дополнительную информацию об особенностях работы с таймерами/счетчиками и аппаратными модулями расширения в XMEGA можно найти в документации Atmel — Application Note AVR1306 и AVR1311, а также в описании на микроконтроллер.
Аналого-цифровой преобразователь
AVR-микроконтроллеры XMEGA могут иметь один или два восьмиканальных аналоговых порта (PORTA, PORTB), каждый из которых содержит один модуль быстродействующего аналого-цифрового преобразователя (АЦП). Новый модуль АЦП, который создали разра-ботчики XMEGA, является для платформы AVR 8-bit RISC несомненным и значительным шагом вперед. Его параметры и набор функций неплохо смотрятся на фоне многих других встроенных АЦП у 8-разрядных и 16-разрядных микроконтроллеров для встраиваемых приложений.
В АЦП XMEGA используется метод последовательного приближения (SAR), при котором код результата преобразования формируется последовательно бит за битом, начиная со старшего разряда (MSB). Программным способом может устанавливаться один из двух вариантов разрядности АЦП — 8 или 12 бит. Максимальная частота дискретизации АЦП составляет 2 миллиона выборок в секунду. Результаты преобразования могут передаваться через DMA без участия центрального процессора непосредственно в память или в периферийный узел. Начало преобразования может быть инициировано или из программы приложения установкой соответствующих битов в управляющих регистрах, или с приходом на блок АЦП внешнего события от другого периферийного узла микроконтроллера через Event System. Структурная схема АЦП показана на рисунке.
Аналого-цифровой преобразователь у XMEGA имеет встроенный механизм калибровки, который позволяет скорректировать мультипликативную составляющую погрешности АЦП. Калибровка осуществляется на фабрике в процессе изготовления, калибровочные значения хранятся в секции Calibration and Signature Row во Flash-памяти программ микроконтроллера. Пользовательское приложение должно считывать эти значения и записывать их в калибровочный регистр CAL.
Допускается 4 конфигурации входных цепей: несимметричное, дифференциальное, дифференциальное с усилением и измерение сигнала от внутренних источников. Все четыре конфигурации и соответствующие им блок-схемы подробно описаны в документации на XMEGA и здесь рассматриваться не будут. Аналоговые входы портов PORTA и PORTB микроконтроллера могут использоваться как входные каналы для АЦП в несимметричном и дифференциальном включении, в то время как внутренние источники доступны непосредственно внутри кристалла. Для XMEGA с двумя АЦП «на борту» линии PORTA могут быть входами для ADCA и линии PORTB — для ADCB. Некоторые из микроконтроллеров имеют только один блок АЦП, но в качестве аналоговых входов могут использовать линии обоих аналоговых портов. На кристалле XMEGA также есть дополнительный каскад усиления входного аналогового сигнала, который позволяет значительно расширить динамический диапазон измеряемых напряжений в случае, когда входные цепи включены в дифференциальном режиме. Коэффициент усиления может программироваться и принимать ряд целых значений ряда 2n от 1 до 64. Установленное значение коэффициента усиления не должно изменяться во время преобразования.
Собственно АЦП — это дифференциальный узел, который преобразует в цифровой код разность потенциалов между двумя его входами VINP (+) и VINN (-). Для того, чтобы перевести АЦП в несимметричное включение, отрицательный вход VINN подключается внутри кристалла к фиксированному источнику смещения. И тут есть одна особенность: если результат преобразования должен кодироваться со знаком, то VINN подключается к внутренней «земле», а в случае получения беззнакового результата (только в несимметричном включении!), на этот вход АЦП подается небольшое отрицательное смещение. Это необходимо для предотвращения входа в насыщение аналоговой части преобразователя и гарантирует надежную работу АЦП при входном напряжении, близком к нулю. Если АЦП используется в одном из дифференциальных режимов, то выходной результат должен кодироваться только со знаком.
Тактирующий АЦП сигнал формируется из сигнала периферийной тактовой частоты, который перед подачей на АЦП проходит через предварительный делитель (рисунок). Это позволяет регулировать тактовую частоту АЦП (будем обозначать ее fADC) в широких пределах: от максимального значения 2 МГц до минимального 50 кГц. Значения коэффициента деления могут выбираться программистом и составляют 4,8,16,32,64,128,256 или 512.
АЦП может начинать новое преобразование на каждый такт сигнала fADC. Задержка распространения (или время преобразования АЦП типа SAR) зависит от установленного разрешения (8 или 12 разрядов) и будет увеличиваться на 1 дополнительный период сигнала fADC, если используется предварительное усиление входных аналоговых сигналов. Формула для расчета задержки распространения приведена в технической документации на микроконтроллер.
Рассмотрим работу схемы тактирования АЦП на примере самого простого режима — одиночного преобразования без предварительного усиления сигнала (рисунок). Сигнал для начала преобразования (установка бита в управляющем регистре или входящее событие) имеет обозначение START и должен поступать в течение предыдущего периода сигнала периферийной тактовой частоты до начала того периода сигнала fADC, в течение которого начинается преобразование. Входной аналого-вый сигнал «защелкивается» в течение первой половины первого периода сигнала fADC. Отметим, что время выборки и время преобразования одного разряда конечного результата всегда составляют половину периода сигнала тактовой частоты АЦП. Разряд MSB бит результата формируется первым, остальные разряды формируются в течение последующих трех (для 8-разрядных результатов) или пяти (для 12-разрядных результатов) периодов сигнала fADC. В течение последнего периода после формирования LSB преобразованное значение заносится в регистр результата. И толь-ко потом устанавливается флаг запроса на прерывание, сигнализирующий об окончании цикла преобразования и доступности результата. Работу схемы тактирования АЦП в других режимах рекомендуется смотреть в технической документации на микроконтроллер.
Как уже упоминалось, у АЦП в XMEGA есть возможность измерять аналоговые сигналы, приходящие от каких-то внутренних источников на кристалле. Для этой цели предусмотрены 4 внутренних канала, которые могут подключаться ко входу АЦП для преобразования:
– встроенный датчик температуры кристалла;
– прецизионный ИОН;
– линейный выход ЦАП;
– масштабируемое напряжение питания микроконтроллера.
Таким образом, можно оценивать текущую температуру кристалла, контролировать напряжение встроенного точного ИОН или измерять напряжение, выдаваемое ЦАП. Для измерения или контроля напряжения питания микроконтроллера VCC оно перед подачей на вход АЦП проходит через внутренний аттенюатор, который ослабляет его в 10 раз. То есть, если VCC составляет 3,6 В, то оно будет измеряться как 0,36 В. Измерение внутренних сигналов допускается только в несимметричном включении.
Для работы любого АЦП требуется опорное входное напряжение. В микроконтроллерах XMEGA допускается использование как внешнего, так и встроенного источника опорного напряжения. Встроенный прецизионный ИОН с напряжением 1,0 В позволяет осуществлять точные преобразования в диапазоне от 0 до 1 В в несимметричном включении и от -1 до 1 В в дифференциальном включении. Для расширения диапазона измеряемых входных напряжений можно подключить внутреннее напряжение VCC — 0,6 В. Положительное опорное напряжение от внешнего источника может подаваться на выводы AREF аналоговых портов PORTA и PORTB микроконтроллера.
Наиболее интересная особенность АЦП в XMEGA — его конвейерная архитектура. Это означает, что новое входное аналоговое напряжение может быть «защелкнуто» и новое аналого-цифровое преобразование мо-жет быть начато в то время, когда выполняются текущие преобразования. В результате эффективный темп работы АЦП существенно возрастает.
Аналого-цифровой преобразователь в XMEGA содержит четыре конфигурационных регистра CHnMUXCTRL и четыре соответствующих им регистра результата CHnRES. Каждая пара этих регистров MUX/RES в документации Atmel носит название канала преобразования АЦП (CH0…CH3), хотя разработчики XMEGA сначала называли их виртуальными каналами. Каждый канал АЦП полностью независим от других. Все каналы имеют раздельные:
– возможности выбора источника входного сигнала;
– регистры для хранения результата преобразования;
– стартовые биты, установка которых инициирует начало преобразования;
– вектора и программируемые уровни прерываний.
Наличие четырех независимых каналов преобразования значительно повышает эффективность и удобство работы с АЦП, а также увеличивает количество возможных источников прерывания. Все каналы используют один и тот же аппаратный аналого-цифровой преобразователь для осуществления преобразований, но благодаря конвейерной архитектуре новое (очередное) преобразование может быть начато по следующему такту сигнала fADC. Это означает, что многочисленные преобразования АЦП могут осуществляться одновременно и независимо друг от друга. Результат преобразования какого-то канала может храниться в своем регистре результата независимо от частоты обновления регистров результата остальных каналов новыми данными. Такое решение помогает снизить сложность программного обеспечения, так как различные программные модули могут инициировать начало преобразований, а так-же считывать результаты независимо друг от друга. Например, CH0 программируется на несимметричное включение для преобразования сигнала с входной линии аналогового порта, которое запускается внешним входным сигналом через систему событий. В это же время СН1 в дифференциальном включении измеряет другой входной сигнал, причем запуск преобразований инициируют другие события, поступающие от Event System. И одновременно с этим оставшиеся каналы СН2 и СНЗ могут осуществлять преобразования еще каких-то двух внешних или внутренних сигналов, но запускаться на преобразование они могут по команде из программы пользователя.
Все многочисленные комбинации установок режима работы канала АЦП с помощью регистров CHnMUXCTRL подробно описаны в документации на микроконтроллер.
Старт преобразования в канале АЦП может быть инициирован или программно из приложения пользователя, или при поступлении события от Event System. В случае программного управления все достаточно просто — установка бита START в регистре CTRL выбранного канала или одного из битов СН[3:0] START в общем регистре CTRLA запускает АЦП на преобразование. Существует возможность устанавливать программно сразу несколько битов CHnSTART, в этом случае «помеченные» этими битами каналы будут запускаться на преобразование последовательно друг за другом, начиная с канала 0, который имеет самый высокий приоритет в очереди. После начала преобразований биты CHnSTART сбрасываются аппаратно.
При использовании события от Event System для старта АЦП структура управления немного сложнее. В самом простом случае приход события инициирует одиночное преобразование в одном из каналов. Допускается использование одного и того же события для одновременного запуска преобразований на нескольких каналах. В «старших» микро-контроллерах XMEGA с двумя АЦП есть возможность синхронно запустить преобразования в обоих АЦП от одного и того же события. Все многочисленные комбинации использования каналов системы событий для старта АЦП и возможные действия по событию (за это отвечают биты EVSEL и EVACT регистра EVCTRL) подробно рассмотрены в техничес-кой документации на микроконтроллер.
Подобно прочим встраиваемым АЦП в микроконтроллерах общего назначения, аналого-цифровой преобразователь у XMEGA может работать в двух режимах:
– одиночное преобразование в выбранном канале, по завершении которого работа АЦП останавливается;
– циклическое преобразование, при котором каналы АЦП постоянно опрашиваются последовательно в фиксированном циклическом порядке, один за другим.
Выбор режима определяется установкой бита FREERUN регистра CTRLB. Если бит сброшен, то разрешены одиночные преобразования, а если установлен — то циклические. Для одиночного преобразования каждый канал может запускаться индивидуально. Для циклического порядка количество каналов в последовательности программируется. Два бита SWEEP регистра EVCTRL определяют, сколько каналов будут включены в постоянно работающую циклическую последовательность — от одного до четырех. Приоритет опроса каналов фиксирован, канал 0 имеет высший приоритет, канал 3 — низший.
Выходной результат преобразования АЦП может кодироваться как со знаком, так и без знака. Представление результата программируется пользователем путем установки бита CONVMODE в регистре CTRLB, причем эта установка является глобальной для всех каналов АЦП. Для 12-разрядных результатов со знаком диапазон преобразования составляет от -2048 до +2047 (0xF800 — 0x07FF), отрицательные числа представляются в дополнительном коде. Для беззнаковых результатов диапазон преобразования составляет от 0 до 4095 (0 — 0x0FFF). Отметим, что если входные цепи любого из каналов АЦП сконфигурированы на работу в дифференциальном режиме, то результат преобразования АЦП должен кодироваться только со знаком.
Когда программистом выбирается кодировка результатов без знака, вход VINN у АЦП подключается к фиксированной аналоговой «земле» внутри кристалла. Следовательно, становятся возможны только измерения внутренних сигналов или внешних аналоговых сигналов в несимметричном включении. Если же выбирается кодирование результата со знаком, то могут измеряться как положительные, так и отрицательные входные напряжения в обоих включениях — несимметричном и дифференциальном.
Результат аналого-цифрового преобразования записывается в один из регистров результата CHnRES. Все регистры результата 16-разрядные, состоят из старшего и младшего байтов. Если планируется получать только 8-разрядные данные, результат будет принудительно сдвинут вправо в CHnRES (это означает, что все 8 LSB будут находиться в младшем байте). А 12-разрядный результат может по желанию пользователя представляться как сдвинутым влево, так и сдвинутым вправо. Выравнивание по левому краю означает, что 8 MSB результата будут находиться в старшем байте. Программируется установкой битов RESOLUTION в регистре CTRLB.
Когда выходные данные кодируются со знаком, в разряде MSB будет находиться знак результата. Для 12-разрядных данных с выравниванием по правому краю знак (11-й разряд) будет копироваться в разряды 12-15 старшего байта для формирования полного 16-разрядного результата в дополнительном коде. Для 8-разрядных данных знак (7-й разряд) будет копироваться во весь старший байт результата преобразования.
АЦП может генерировать и запросы на прерывание, и события для Event System. Как уже отмечалось, все каналы АЦП имеют индивиду-альные вектора, программируемые уровни и флаги CHnlF прерываний. В регистре INTCTRL два младших бита INTLVL разрешают генерацию запроса на прерывание от канала АЦП и назначают требуемый уровень для этого прерывания. Флаги запросов на прерывание CHnlF автоматически сбрасываются после передачи управления соответствующему обработчику прерывания. Программист также может сбрасывать их программно, записывая «1» в соответствующий бит.
Запрос на прерывание или событие генерируется в двух случаях. В первом случае флаг CHnlF выставляется по завершении преобразования в выбранном канале «n» АЦП. Второй случай — если в результате измерения входного напряжения полученное значение больше (или меньше) заранее выбранного программистом порога. Специальный регистр сравнения СМР в АЦП хранит это пороговое значение, а биты INTMODE регистра INTCTRL определяют, в каком случае должен генерироваться запрос на прерывание: COMPLETE — завершение преобразования, BELOW — результат ниже порога, ABOVE — результат выше порога. Этот интерес-ный регистр сравнения СМР является общим для всех каналов АЦП. В него записывается 12-разрядный цифровой код, соответствующий требуемому пороговому напряжению, с которым постоянно сравниваются результаты текущих преобразований в каналах АЦП. Для пользователя это означает, что сигнал о завершении преобразования (или флаг прерывания CHnlF) не будет устанавливаться аппаратной логикой АЦП, пока результат преобразования не станет выше (или ниже) про-граммируемого порога сравнения. Отметим, что значение в регистре СМР всегда выравнивается по левому краю.
Данная опция очень удобна в задачах, где необходимо лишь проверять, не «ушел» ли в процессе работы измеряемый входной сигнал за установленный порог напряжения. Вместо того чтобы постоянно проводить измерения и программно сравнивать результаты с пороговым значением, приложение теперь может просто ждать сигнала о наступлении выбранного события (выше или ниже порога), а вся «черновая» работа проводится аппаратной логикой АЦП. Это снижает загрузку центрального процессора, уменьшает размер конечного кода и облегчает жизнь программисту.
Для передачи результатов преобразования АЦП в память микроконтроллера или в один из периферийных узлов на кристалле может быть использован контроллер DMA. Когда очередное (новое) преобразование закончено и обновлен регистр результата, это событие может вызывать запрос на транзакцию.
В заключение краткого описания возможностей АЦП в микроконтроллерах XMEGA скажем несколько слов о приоритете каналов и принудительном сбросе. Поскольку частота периферийного тактового сигнала может быть существенно выше выбранной частоты сигнала fADC, то есть все шансы «получить» установленные биты начала преобразования для нескольких каналов АЦП внутри одного и того же периода fADC. Внешние события, поступающие от Event System, также могут инициировать начало преобразования на нескольких каналах АЦП по схожему сценарию. В таких случаях канал АЦП СН0 будет иметь высший приоритет.
Запуск преобразования в канале АЦП по приходу события от Event System может вызывать неизвестную заранее задержку между этим событием и началом преобразования, поскольку в этот момент времени могут осуществляться преобразования по другим каналам в соответствии с установленным приоритетом в очереди. Но если необходимо начать преобразование немедленно при поступлении входящего события, у программиста есть возможность полностью сбросить весь конвейер АЦП для всех преобразований во всех каналах, включая текущую фазу тактовой последовательности fADC. Это заставит АЦП «защелкнуть» новый аналоговый входной сигнал уже на следующем периоде периферийного тактового сигнала, за которым немедленно последует первый период тактовой последовательности системы тактирования АЦП.
Дополнительную информацию об аналого-цифровом преобразователе в XMEGA можно найти в техническом описании на микроконтроллер.
Контроллер прямого доступа к памяти
Этот полезный аппаратный блок, работу которого мы кратко будем рассматривать в завершение, не так часто включается производителями в кристаллы 8-разрядных микроконтроллеров. Разработчики XMEGA приняли удачное решение, добавив контроллер прямого доступа к памяти (DMAC) в состав периферийных блоков нового микроконтроллера Atmel. Его возможности по пересылке массивов данных между областями памяти и периферийными блоками дополняют прогрессивную и развитую периферию XMEGA, что дает разработчику универсальный набор средств для работы.
Структура блока DMAC у XMEGA достаточно типична. Кроме того, его работа подробно описана в технической документации на микро-контроллер и в Application Note AVR1304, поэтому здесь подробно контроллер DMA мы рассматривать не будем.
DMAC может захватывать внутреннюю шину данных микроконтроллера только в те моменты времени, когда центральный процессор ее не использует. Но если процессор занят обменом данными с внешней памятью, то в это же время DMAC может передавать данные между периферийным блоком и областью памяти в пределах кристалла микроконтроллера. Приоритет доступа к внутренней шине данных распределяет арбитражный узел, аппаратно отнесенный к подсистеме управления памятью данных микроконтроллера.
Источник и приемник для обмена данными могут комбинироваться следующим образом:
– RAM RAM (как внутренняя, так и внешняя);
– периферийный блок периферийный блок;
– RAM периферийный блок;
– EEPROM -> RAM;
– EEPROM-> периферийный блок.
Отметим, что DMAC не может записывать данные в область EEPROM, а может только считывать из нее.
Контроллер DMA содержит четыре независимых канала, каждый из которых имеет свои источники и приемники, способ запуска передачи и размеры блока данных, индивидуальные настройки и вектора прерываний. Для источника и приемника предусмотрено несколько режимов адресации. Каждый канал DMA может работать как на прием, так и на передачу. Каналы не могут прерывать друг друга, если передача в каком-либо из них уже начата.
Законченная операция чтения или записи DMA между источником и приемником данных носит название транзакции. Данные в транзакции передаются блоками, которые состоят из пакетов (рисунок). Общая длина передаваемого блока данных программируется и может составлять от 1 байта до 64 кбайт. Имеется возможность программно управлять повторением передачи блока, записывая требуемое число повторов в регистр Repeat Counter — от 1 до 255. Запись нулевого значения в этот регистр приведет к безостановочной циклической передаче блоков, одного за другим. Если режим повторения запрещен, то происходит однократная передача блока данных.
У каналов DMAC можно достаточно гибко программировать приоритет их работы. Если несколько каналов одновременно запрашива-ют доступ к внутренней шине данных микроконтроллера для передачи, схема приоритета определяет, какой канал будет иметь право на передачу первым. Приоритет может быть или фиксированным, или осуществляться по схеме Round Robin (канал, который в последний раз передавал данные, теперь будет иметь наименьший приоритет). По умолчанию при старте микроконтроллера устанавливается приоритет по схеме Round Robin.
Для разрешения «длинных» транзакций два канала DMAC могут быть попарно «связаны» друг с другом — второй начинает передачу, когда первый ее заканчивает, и наоборот. Объединяться в пары могут каналы 0 — 1 или каналы 2-3. В одном из режимов также разрешается одновременная работа двух указанных пар. Другие комбинации сочетаний каналов не допускаются.
У контроллера DMA в XMEGA есть еще один интересный режим работы — Single Shot или пакетный режим передачи. Длина пакета данных программируется и может составлять 1, 2, 4 или 8 байт. Передача пакета, если начата, не может быть прервана процессорным ядром. Это может оказаться полезным при чтении слов данных, например, результатов преобразования АЦП.
Режим Single Shot разрешается из программы пользователя установкой бита SINGLE в регистре CTRLA соответствующего канала DMAC. Если Single Shot разрешен, то в ответ на каждый запрос передачи данных будет передаваться только один пакет.
Контроллер DMA может генерировать запросы на прерывание при завершении передачи данных (Transaction Complete) или в случае детектирования сигнала ошибки (Transfer Error). Флаг завершения передачи TRNFIF выставляется в конце транзакции, а сигнал ошибки (установка флага ERRIF) возникает в следующих случаях:
– если работа канала или всего модуля DMAC программно запрещается в ходе выполнения текущей транзакции;
– при попытке записать данные в EEPROM с помощью DMA;
– при попытке прочитать с помощью DMA данные из EEPROM в то время, когда микроконтроллер находится в спящем режиме.
К сожалению, у XMEGA для каждого канала DMAC есть всего один вектор прерывания, обслуживающий оба флага, поэтому прикладная программа при передаче управления вектору прерывания от канала DMAC всегда должна проверять, какой из флагов был установлен. Каждый флаг может быть сброшен путем записи в него «1». Отметим, что когда в регистр Repeat Counter записано нулевое значение (т.е. разрешена «бесконечная» циклическая передача блоков), флаг TRNFIF будет устанав-ливаться в конце каждого передаваемого блока данных.
Начало процесса передачи в DMAC может быть инициировано либо программно, либо при поступлении события от Event System (например, завершение преобразования АЦП, изменение уровня сигнала на внешнем выводе микроконтроллера, переполнение таймера). Программная установка бита TRFREQ в регистре CTRLA соответствующего канала DMAC вызовет начало передачи, что автоматически сразу же сбросит этот бит.
Типовое приложение, для которого контроллер DMA действительно весьма полезен — это копирование больших блоков данных между памятью и (или) периферийными блоками микроконтроллера без участия центрального процессора. Эта задача подробно описана в Application Note AVR1304, там же есть исходный текст программы, поэтому в статье мы его повторять не будем.
Обсуждаем на форуме https://phreaker.ru/forum/showthread.php?t=690
Материалы подготовил CivicDriver