Аналоговый компаратор Xmega

    Данная статья посвящена особенностям использования аналогового компаратора микропроцессоров Xmega.
    Аналоговый компаратор (англ. analog comparator – сравнивающее устройство) – устройство принимающие на свои входы два аналоговых сигнала и выдающие логическую «1», если сигнал на прямом входе (положительном) больше чем на инверсном входе (отрицательном), и логический «0», если сигнал на прямом входе меньше, чем на инверсном входе.
    Аналоговый компаратор (англ. сокр. AC) семейства микропроцессоров Xmega является быстродействующим двухканальным модулем с гибкими настройками мультиплексора (MUX) и имеет встроенный регулируемый делитель опорного напряжения. Также имеется возможность выбора комбинировать или сравнивать внутренние выходы компаратора при осуществлении оконного режима.
    Структурная схема аналогового компаратора Xmega показана на следующем рисунке:
    Принцип работы компаратора
    У каждого блока компаратора есть свои регистры для настройки управления и выбора MUX, которые позволяют управлять блоками (каналами) компаратора независимо друг от друга.
    Основным принципом работы компаратора является – выдача логической единицы, если входной сигнал положительного входа больше входного сигнала на отрицательном входе и логического нуля, если это не так.
    Каждый компаратор имеет регистр управления MUX (ACnMUXCTRL), который служит для выбора сигналов используемых для положительного и отрицательного входов. Положительный вход может быть подключен к аналоговому входу ножек AC1, AC2, AC4, AC5 или AC6. Отрицательный вход может быть подключен к аналоговому входу ножек AC1, AC3, AC5 или AC7.
    Кроме того, на входы могут подаваться следующие внутренние сигналы: выход 12-битного ЦАП, опорный источник или напряжение с внутреннего делителя модуля аналогового компаратора.
    Быстродействие и электропотребление
    Каждый компаратор может быть настроен на работу с высоким быстродействием или низким электропотреблением. При установке бита режима высокого быстродействия (HSMODE) в регистре управления компаратором (ACnCTRL) переведет компаратор в быстродействующий режим. Стирание данного бита увеличит в компараторе задержку на распространение, но уменьшит электропотребление. Быстродействие каждого из блоков компаратора может настраиваться независимо.
    Выбираемый входной гистерезис
    Каждый компаратор может быть настроен на низкий, средний или высокий уровень гистерезиса. Для применений, где расхождение между сравниваемыми сигналами не велико увеличение гистерезиса позволяет избежать чрезмерно частых переключений, если сигналы имеют «шумы».
    Уровень гистерезиса настраивается битовом полем (HYSMODE) в регистре управления компаратором (ACnCTRL) для каждого блока отдельно. Следующий рисунок иллюстрирует разные настройки гистерезиса:
    Общий регистр статуса
    Регистр статуса (STATUS) модуля аналогового компаратора отображает текущие состояние и флаги прерываний обоих блоков компаратора.
    Два бита состояний компаратора (ACnSTATE) непосредственно связаны с выходами блоков компаратора и отображает текущие состояние каждого из них.
    Два бита флагов прерываний (AcnIF) устанавливаются в логическую единицу, когда прерывание произошло, в не зависимости от того, разрешено оно или нет. Каждый компаратор может быть настроен на генерацию прерывания каждый раз, когда его выход переключается (меняет состояние), по нарастающему или убывающему фронтам. Это настраивается битовым полем режима прерываний (INTMODE) в регистре управления (ACnCTRL) для каждого блока отдельно.
    Аналогичными битам состояний и прерываний являются биты состояний и прерываний для оконного режима (WSTATE) и (WIF), расположенные в регистре статуса (STATUS).
    Делитель напряжения
    Аналоговый компаратор позволяет выбирать внутренний делитель напряжения, соединенный с напряжением питания VCC, который является 6-битным ЦАП-ом встроенным в модуль компаратора.
    6-битный ЦАП может генерировать напряжение в 64 различные ступени от 0В до 63/64 * VCC. Следующий рисунок показывает подключение делителя:
    Коэффициент делителя выбирается в битовом поле (SCALEFAC) в регистре управления B.
    Оконный режим
   Оконный режим предназначен для контроля сигнала в определенном диапазоне напряжений или, если сказать по-другому, в окне. В обычном режиме выход компаратора отображает выше или ниже один сигнал другого, а в оконном режиме выход отображает, находится ли сигнал выше, ниже или внутри диапазона напряжения.
    Прерывание может быть сгенерировано по условию, когда сигнал внутри или снаружи, выше или ниже диапазона напряжения. Оконный режим включается установкой бита включения оконного режима (WEN) в регистре управления оконным режимом (WINCTRL). Условия прерывания настраиваются в битовом поле прерываний оконного режима (WINTMODE) в регистре управления оконным режимом (WINCTRL).
    Положительный и отрицательный входы для обоих компараторов выбираются на использование мультиплексоров, также как в обычном режиме работы. Для использования оконного режима необходимо внешнее соединение положительных входов компараторов или прямое подключение обоих MUX к тому же входу. Это соединение также подключается к контролируемому сигналу.
    Текущие состояние окна и флаг прерывания можно посмотреть (как описано выше) в регистре статуса.
    Выдача выхода компаратора на ножку
    Установка бита включения выхода компаратора 0 (AC0OUT) в регистре управления A (CTRLA) подключает выход компаратора блока 0 к аналоговому выходу ножки AC0OUT, при этом компаратор должен быть сконфигурирован и включен. Выход является цифровым и выдает логическую единицу, если положительный вход больше отрицательного и наоборот.
    С чего начать
    Для настройки и включения компаратора достаточно сделать несколько шагов:
    Сконфигурировать настройки MUX для компараторов которые Вы желаете использовать.
    Сконфигурировать требуемые условия прерываний для каждого компаратора.
    Сконфигурировать уровень прерываний, если Вы желаете использовать процедуры их обработки.
    Разрешить работу требуемых компараторов.
    Ну и как обычно, напоследок рабочий пример.
    Пример.
    Задача: Написать программу защиты, срабатывающая по превышению определенного порога (защита от превышения напряжения).
   Решим поставленную задачу двумя способами: 1) с использованием прерывания по компаратору – для иллюстрации их использования; 2) без использования прерываний по компаратору.
    Первый способ. Будем сравнивать два внешних сигнала один, из которых является контролируемым, а второй пороговым (для случаев, когда порог может подстраиваться в процессе работы, его уровень можно задавать программно и выдавать на ЦАП). В качестве индикации срабатывания защиты будим использовать выход ножки 4 порта K, на которую, например, можно повесить светодиод. Более подробную информацию о настройке ножек портов ввода-вывода можно найти в уроке «Настройка и использование ножек Xmega A». Также установим задержку на срабатывание защиты для исключения ложных срабатываний в 0,5мс. Для организации задержки будем использовать прерывания по таймеру 0 настроенному на частоту 10 кГц. Более подробную информацию о настройке таймера можно найти в уроке «Использование таймера на Xmega A». В качестве опорной частоты процессора возьмем частоту по умолчанию – 2 МГц. В качестве флага отображающего работу компаратора будем использовать ножку 3 порта B настроенную на выход, который будет устанавливаться и сбрасываться по прерыванию от аналогового компаратора. Будем использовать блок 0 компаратора A с маленьким гистерезисом для исключения дребезга при близких уровнях сигналов, а также настроенным выходом на ножку 7 порта A для наглядности его работы. Положительный вход компаратора подключим к ножке 3, а отрицательный к ножке 5 порта
А.Код работающей программы на языке C для процессора Xmega128A1 имеет следующий вид:
#define ENABLE_BIT_DEFINITIONS // разрешение использования групповых битовых имен 
// Объявление используемых библиотек
#include <ioxm128a1.h>
#include <ina90.h>
char count=0; // объявление счетчика задержки
void main(void)
{
__disable_interrupt(); // Запрещение прерываний
ACA.AC0CTRL=AC_ENABLE_bm|AC_INTLVL_LO_gc|AC_HYSMODE_SMALL_gc; // Включить ACA0, уровень прерываний low, маленький гистерезис
ACA.CTRLA=AC_AC0OUT_bm; // включить выход ACA0
ACA.AC0MUXCTRL=AC_MUXNEG_PIN5_gc|AC_MUXPOS_PIN3_gc; // Положительный вход AC0 - ножка 3 порта А, Отрицательный вход - ножка 5 порта А
PORTB.DIRSET = 0x08; // Настройка ножки 3 порта B как выход
PORTK.DIRSET = 0x10; // Настройка ножки 4 порта K как выход
TCC0.CTRLA=0x04; // N=8
TCC0.PER=25-1; // частота таймера 10кГц при системной частоте 2МГц
TCC0.INTCTRLA=1; // разрешение прерываний по таймеру c приоритетом low
PMIC.CTRL = 1; // приоритет прерываний уровня low
__enable_interrupt(); // разрешение прерываний
while(1) {} // основной бесконечный цикл
}
#pragma vector=ACA_AC0_vect // обработка прерывания по срабатыванию компаратора ACA0
__interrupt void irqACA_AC0_vect(void)
{
PORTB.OUTTGL = 0x08; // Изменение флага срабатывания защиты
}
#pragma vector=TCC0_OVF_vect // обработка прерываний по переполнению таймера С0
__interrupt void irqTCC0_OVF_vect(void)
{
if (!(PORTB.OUT & 0x08)) // Если флаг срабатывания защиты установлен, то
{
if (count<5) // организация задержки на 0,5 мс
count++;
else
PORTK.OUTSET = 0x10; // по окончанию задержки выдача сигнала об ошибке
}
else // иначе
{
count=0; // сброс задержки
PORTK.OUTCLR = 0x10; // сброс сигнала об ошибке
}
}

  Второй способ. Данный способ более прост и удобен в реализации. Здесь в качестве индикации работы компаратора будем использовать регистр статуса. Остальное аналогично первому способу, за исключением того, что прерывания по компаратору и флаг срабатывания защиты использовать не нужно.
    Код работающей программы на языке C для процессора Xmega128A1 имеет следующий вид:
#define ENABLE_BIT_DEFINITIONS // разрешение использования групповых битовых имен 
// Объявление используемых библиотек
#include <ioxm128a1.h>
#include <ina90.h>
char count=0; // объявление счетчика задержки
void main(void)
{
__disable_interrupt(); // Запрещение прерываний
ACA.AC0CTRL=AC_ENABLE_bm|AC_HYSMODE_SMALL_gc; // Включить ACA0, маленький гистерезис
ACA.CTRLA=AC_AC0OUT_bm; // включить выход ACA0
ACA.AC0MUXCTRL=AC_MUXNEG_PIN5_gc|AC_MUXPOS_PIN3_gc; // Положительный вход AC0 - ножка 3 порта А, Отрицательный вход - ножка 5 порта А
PORTK.DIRSET = 0x10; // Настройка ножки 4 порта K как выход
TCC0.CTRLA=0x04; // N=8
TCC0.PER=25-1; // частота таймера 10кГц при системной частоте 2МГц
TCC0.INTCTRLA=1; // разрешение прерываний по таймеру c приоритетом low
PMIC.CTRL = 1; // приоритет прерываний уровня low
__enable_interrupt(); // разрешение прерываний
while(1) {} // основной бесконечный цикл
}
#pragma vector=TCC0_OVF_vect // обработка прерываний по переполнению таймера С0
__interrupt void irqTCC0_OVF_vect(void)
{
if (ACA.STATUS & AC_AC0STATE_bm) // Если флаг срабатывания защиты установлен, то
{
if (count<5) // организация задержки на 0,5 мс
count++;
else
PORTK.OUTSET = 0x10; // по окончанию задержки выдача сигнала об ошибке
}
else // иначе
{
count=0; // сброс задержки
PORTK.OUTCLR = 0x10; // сброс сигнала об ошибке
}
}
    Blogger Comment
    Facebook Comment

0 коммент.:

Отправить комментарий