Если Вы хотите обучаться программированию микроконтроллеров, но попали, сюда не прочитав предыдущих уроков, то советую начать изучение материала с самого начала.
На прошлом уроке мы с вами разобрали энергонезависимую память 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