Если Вы хотите обучаться программированию микроконтроллеров, но попали, сюда не прочитав предыдущих уроков, то советую начать изучение материала с самого начала.

Программирование микроконтроллеров. Урок 22
(Аналоговый компаратор.)

Урок 22 (Аналоговый компаратор.)

На прошлом уроке мы с вами разобрали энергонезависимую память EEPROM, а здесь быстренько посмотрим на работу аналогового компаратора, который, по-моему, можно найти во всех микроконтроллерах.


Как говорит нам Википедия. Аналоговый компаратор - это электронное сравнивающее устройство принимающая на свои входы два аналоговых сигнала и выдающая сигнал высокого уровня (1), если сигнал на неинвертирующем входе (+) больше, чем на инвертирующем (-), и сигнал низкого уровня (0) если сигнал на неинвертирующем входе меньше, чем на инвертирующем.

Вроде все просто. В зависимости от того, какой нам нужен выходной сигнал, на один из входов компаратора (обычно это неинвертирующий вход) подаем опорное напряжение, а вторым «щупаем» исследуемый сигнал и как только он переходит порог опорного напряжения, то выходной логический сигнал компаратора меняется. Это изменение мы можем увидеть программно или разрешить ему обработку прерывания, а также по этому сигналу можно осуществить захват состояния таймера/счетчика Т1.

У всех компараторов МК есть одна особенность. Они по умолчанию включены. Если вы не используете компаратор в своей схеме, то при запуске МК его необходимо выключить, записав в бит ACD регистра ACSR единицу.

ACSR |= (1<<ACD);

Собственно, регистр ACSR это регистр управления и контроля состояния компаратора:
Бит 7 (ACD) - выключение (1) включение (0) компаратора;
Бит 6 (ACBG) – Подключение к неинветирующему входу (ANI0) компаратора внутреннего ИОНа. Подключен (1) отключен (0);
Бит 5 (ACO) – Выход компаратора (результат сравнения);
Бит 4 (ACI) – Флаг прерывания от компаратора;
Бит 3 (ACIE) - Разрешение прерывания от компаратора. Разрешено (1), запрещено (0);
Бит 2 (ACIC) – Подключение компаратора к схеме захвата таймера/счетчика Т1. Подключен (1), отключен (0);
Бит 1 и 0 (ACIS1 и ACIS0) – Условия возникновения прерывания («0|0» любое изменение, «0|1» резерв, «1|0» с 1 на 0, «1|1» с 0 на 1).

Итак, как я уже писал, компаратор включен изначально. Для того чтобы он заработал правильно необходимо сконфигурировать его выводы на вход и установить необходимые настройки регистра ACSR. Но можно пользоваться компаратором и не используя его выводов. Дело в том, что неинвертирующий вход компаратора ANI0 (+) можно подключить ко внутреннему ИОНу установив (1) в бит ACBG регистра ACSR, а инвертирующий вход ANI1 (-) можно подкоючить к одному из входов АЦП с помощью бит ACME (регистр SFIOR), ADEN (регистр ADCSRA) и MUX (регистр ADMUX) модуля АЦП. Но и здесь есть нюанс. Когда компаратор подключен ко входу АЦП, преобразователь будет выключен.

Для проверки работы компаратора соберем простую схему. К инвертирующему выходу ANI1 подключим резистивный делитель напряжения, а на один из выводов МК повесим светодиод с ограничивающим ток резистором.

Теперь напишем программу, которая будет просматривать выход компаратора и если на нем (1), то светодиод гаснет, а если (0), то светодиод загорается.

	#include 			//appnote
	#define PORT_LED  PORTD		//Порт подключения светодиода  
	#define PIN_LED   PORTD2	//Вывод светодиода

void main(void){ 
	ACSR |= (1<<ACBG);              //Подключить ИОН к ANI0
	DDRD |= (1<<PIN_LED);           //порт светодиода как выход

while (1) {
	if (ACSR &(1<<ACO))  PORT_LED |= (1<<PIN_LED); 	//гасим светодиод
	else PORT_LED &= ~(1<<PIN_LED);			//зажигаем светодиод
	}
} //END void main(void)

В приложенных файлах есть также пример использования прерывания для индикации работы компаратора.

После прошивки и включения, необходимо покрутить потенциометр и добиться чтобы светодиод изменил свое состояние. Выглядит это весьма прозаично.

Вроде не на что смотреть. Ну крутишь резистор, ну моргает светодиод. А на самом деле мы сделали простейший индикатор питания. Если устройство подключено к аккумулятору, то с помощью такой простой схемы можно контролировать питания и в случае снижения напряжения ниже установленной отметки не только сигнализировать об этом, но и программно выключать/включать какие-то функции.


На следующем уроке мы рассмотрим работу таймера / счетчика Т1. К уроку необходимо будет приобрести 5-ти или 12-ти вольтовою светодиодную ленту. Метр, больше не надо. Для длинной ленты будет нужен соответствующий по мощности источник питания. Также необходимо найти блок питания на соответствующее напряжение мощностью 6…8 Ватт, резисторы на 1 кОм – 1шт., 10 кОм – 5 шт., полевой транзистор IRFZ44 (или n канальный аналог) в корпусе ТО-220, а также энкодер и пару конденсаторов на 100n. Если светодиодная лента будет на 12 воль (как в моем случае), то необходимо достать стабилизатор напряжения LM7805 в корпусе ТО-220 и два электролитических конденсатора 100…1000 мкф. на 25 вольт. Будем делать светильник с плавной регулировкой яркости.

И конечно, на сон грядущий, необходимо почитать: Евстифеев А.В. «Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel» 2008г. Страницы 279…300.

А на сегодня всё. Удачи.

09.09.20

Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.

Приложение:
Файлы к уроку 22