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

Введение

Один из самых простых модулей микроконтроллеров 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

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

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