Учебный курс AVR. Аналоговый компаратор

22/10/2013 - 09:02 Павел Бобков

Введение

Один из самых простых модулей микроконтроллеров AVR - это аналоговый компаратор. Он сравнивает между собой два напряжения и запоминает результат сравнения в регистре. Также он может вызывать прерывания, если результат сравнения изменился, и управлять схемой захвата таймера Т1 (конечно если он есть).

Обычно аналоговый компаратор используется как однобитный АЦП. Например, компаратором можно отслеживать уровень заряда батареи или момент перехода переменного напряжения через ноль. Еще он может быть задействован для измерения длительности аналоговых сигналов и в ряде извращений нестандартных решений. Таких как многоразрядный АЦП последовательного приближения.

В этой статье мы разберемся, как пользоваться аналоговым компаратором на примере atmega16.

Входы компаратора

Принцип работы компаратора AVR ничем не отличается от дискретного аналогового компаратора. У него есть два входа: неинвертирующий - AIN0 и инвертирующий - AIN1. Если напряжение на выводе AIN0 больше напряжения на AIN1 - на выходе компаратора будет единица. Если напряжение на AIN0 меньше напряжения на AIN1, на выходе будет ноль.

AIN0 можно подключать к выводу общего назначения PB2 или к внутреннему источнику опорного напряжения на 1.2 В. AIN1 - к выводу PB3 или к одному из 8-и входов модуля АЦП. Если входы компаратора подключают к выводам общего назначения, то эти выводы нужно настроить на вход и отключить подтягивающие резисторы.

Регистры компаратора

Основной регистр управления компаратором - это ACSR (Analog Comparator
Control and Status Register). Он задает конфигурацию компаратора и хранит статусные флаги.

 


ACD (Analog Comparator Disable) - включение компаратора. 1 - запрещает работу аналогового компаратора, 0 - разрешает. По умолчанию компаратор всегда включен. Для уменьшения энергопотребления в спящих режимах, его рекомендуется отключать. При изменении бита ACD нужно запрещать прерывания компаратора, сбрасывая бит ACIE. В противном случае может произойти прерывание. 

ACBG (Analog Comparator Bandgap Select) - подключение внутреннего источника опорного напряжения (ИОН) на 1.23 В к положительному входу компаратора (AIN0). 1 - подключает ИОН, 0 - отключает.

ACO (Analog Comparator Output) - этот бит хранит состояние выхода аналогового компаратора, то есть результат сравнения входных напряжений.

ACI (Analog Comparator Interrupt Flag) - флаг прерывания. Он устанавливается аппаратно, когда происходит событие определенное битами ACIS1 и ACIS0. Если прерывания компаратора разрешены, то вызывается обработчик. Флаг ACI сбрасывается аппаратно при выполнении обработчика. Также он может быть очищен программно, если записать в него 1.

ACIE (Analog Comparator Interrupt Enable) - разрешение прерываний компаратора. Когда этот бит установлен в 1 и прерывания разрешены глобально ( установлен флаг I регистра SREG), компаратор генерирует запрос на прерывание при изменении состояния его выхода.

ACIC (Analog Comparator Input Capture Enable) - подключает выход компаратора к схеме захвата таймера Т1. 1 - выход компаратора подключен к схеме захвата, 0 - не подключен.

ACIS1, ACIS0 (Analog Comparator Interrupt Mode Select) - эти биты определяют событие, по которому будет вызываться прерывание компаратора. Все варианты перечислены в таблице.

 


Блок схема ниже поясняет работу компаратора и назначение конфигурационных битов регистра ACSR.



Если инвертирующий выход компаратора нужно подключить к выходу мультиплексора АЦП, то задействуются еще два регистра - SFIOR и ADMUX

Когда бит ACME регистра SFIOR установлен в 1 и модуль АЦП выключен (бит ADEN регистра ADCSRA сброшен), то отрицательный вход компаратора подключается к выходу мультиплексора АЦП. Если бит ACME сброшен, то вход компаратора подключается к выводу AIN1. С помощью регистра ADMUX можно выбирать, какой из восьми выводов ADC7 - ADC0 будет подключен к отрицательному входу компаратора.

 

Пример использования аналогового компаратора

В качестве примера сделал проект измеряющий длительность сигнала (время от положительного фронта до отрицательного). В проекте задействован компаратор и 16-и разрядный таймер Т1.

Принцип работы программы следующий. Неинвертирующий вход компаратора подключен к внутреннему опорному источнику, а на инвертирующий вход подается аналоговый сигнал. Прерывания компаратора настроены на срабатывание по отрицательному фронту сигнала на его выходе. Таймер Т1 ведет непрерывный счет на максимальной частот (с прескалером = 1), прерывания и схема захвата не используется.

При наступлении прерывания компаратора, микроконтроллер сохраняет значение счетного регистра таймера Т1 и переключает прерывание компаратора на срабатывание по положительному фронту (своего выходного сигнала!). В следующее прерывание компаратора микроконтроллер снова сохраняет значение счетного регистра, меняет режим и выставляет флаг. В основном цикле программы, по сигналу этого флага, сохраненные значения таймера Т1 переписываются в буферы, вычисляется длительность импульса и результат выводится на дисплей. Далее цикл повторяется.

Проект учебный и не претендует на точность и широкий диапазон измерений. Программа может замерять длительности от 5 до 2000 us. При меньших длительностях она не успевает обрабатывать входной сигнал, при больших возникает переполнение счетного регистра таймера. Ссылки на проекты внизу. 

Файлы

Comparator-iar.rar
Comparator-AS6.rar
Comparator-Winavr.rar
Comparator-CV.rar
Comparator-proteus.rar

Остальные проекты добавлю позже. 

Comments   

# Peter 2013-10-22 10:29
icr1 = buf1;
icr2 = buf2;

buf1 и buf2 двухбайтовые и изменяются в прерывании. Поэтому надо их читать в критической секции.
# Pashgan 2013-10-22 10:50
Запись блокируется флагом после захвата двух значений, поэтому здесь это не нужно.
# Peter 2013-10-23 08:34
Если я подам сигнал, у которого положительная (ИЗМЕРЯЕМАЯ) часть 5uS, а отрицательная - ну пусть 2.5 uS (необязательно же меандр подаётся, да Вы и не требуете этого), то элементарно собью работу устройства. И не поможет блокировка.
# Saxel 2013-10-23 08:52
Ну не совсем элементарно. Это зависит от частоты работы процессора. например на частоте 1 MHz скорость выполнения 1 команды 2 мкс. если делать хоть какую-то обработку в прерывании, то работа устройства просто собьется.
# Peter 2013-10-23 09:09
Да что там неэлементарного ? Пусть тактовая частота процессора 16МГц как она и есть.
Если во время выполнения
__delay_cycles(1000000);
придет положительный входной фронт, а СРАЗУ после строки в конце main "compFlag = 0;" придет прерывание по отрицательному фронту (обработчик прерывания, судя по листингу, порядка 40 тактов - вот Вам и 2.5 uS) - то, возвратясь из прерывания, мы уже близко к следующему положительному фронту, и прерваться может во время выполнения строки " buf1 = TCNT1;".
И сбой.
# Pashgan 2013-10-23 09:50
Если молотком ударить хорошенько, устройство тоже собьется. Это ж просто пример. Не надо его сбивать всякими сигналами.
Блокировка сделана для атомарности (icr1 = buf1; icr2 = buf2;).
В конце написано, что при длительностях меньше 5 мкс программа не будет успевать обрабатывать сигнал.
# Peter 2013-10-23 18:36
5 uS - указано как замеряемая длительность. Про "незамеряемую" фазу не сказано ничего.
# JoJo 2013-10-24 06:09
Quote:
прерваться может во время выполнения строки " buf1 = TCNT1;".
А как он прервется на этой строке, если она в прерывании?
# Вася 2014-01-09 05:01
Нечего не понятно ...
Зачем LCD прицепили туда...
Я понимаю ,что программа это дана в ознакомительных целях и для новичков. Ппрофи и так всё прекрасно знают как работает компаратор и не создают подобных устройств для отображения 1 или 0 на экране.
Для новичка это слишком сложно.
А проще нельзя написать прогу без LCD ,дефайнов непонятных вложений инклюдов.
В CodeVisionAVR пожалуста.
Нужно только уловить какие нужно регистры и какие биты выставить для настройки Аналгогово Компаратора.
# Pashgan 2014-01-09 05:26
Может мне еще алфавит в каждой статье разбирать, чтобы "всем" было понятно? Когда мне что-то непонятно, я не жалуюсь и не ною, а ищу информацию и разбираюсь с ней.
# Вася 2014-01-10 02:55
Quoting Pashgan:
я не жалуюсь и не ною,

Я не претендую на твоё решение рваться к познаниям и не изученным вещам так рьяно и стремительно
Вопрос поставлю иначе...
Учебный курс AVR. Аналоговый компаратор
Тема не для новичков.
Без LCD понятней было.
Я вот бы уже начал собирать данный девайс ,но не имея базы с дисплеем LCD проект прошёл мимо и всеволиш.
# Alex_92 2014-11-22 10:08
Здравствуйте. Хотел спросить, как можно определить момент перехода напряжения на свободной фазе через нулевую точку с помощью аналогового компаратора?
# Nandan 2015-04-14 08:50
//Короче ребят,мое мнение:я был на других ресурсах,не считая этот,тоже искал как работает компаратор,его регистры и другие,и скажу вам что этой статья получше будет других, просто встречаются статьи,вроде все написано,но не понятно(не связано потому что),а здесь все прочитал и понял

У вас недостаточно прав для комментирования.