Этот апноут предназначен для очень дешевых и критичных к занимаемому месту приложений, которым нужна функция измерения уровня напряжения. Здесь описывается, как сделать простой АЦП, состоящий только из микроконтроллера AVR с двумя внешними компонентами - резистором и конденсатором (перевод AVR400 [1]).
Параметры демонстрационного проекта:
• Функционирует на основе прерываний переполнения таймера и компаратора. • Реализовано на ассемблере, размер кода: 23 слова. • Очень малое количество внешних деталей. • Разрешающая способность 6 бит. • Диапазон измеряемого напряжения: 0V .. 2V. • Может работать на любом микроконтроллере AVR, у которого есть 8-битный таймер/счетчик и аналоговый компаратор.
[Принцип работы]
Почти во всех микроконтроллерах AVR есть встроенный аналоговый компаратор, на котором можно просто реализовать функцию аналого-цифрового преобразования (ADC). Измеряемый сигнал подключается к инвертирующему входу компаратора, и опорный уровень подключается к не инвертирующему входу. Опорный сигнал генерируется путем зарядки конденсатора через резистор. Когда конденсатор заряжается, напряжение на нем изменяется по экспоненциальной кривой. Если диапазон измеряемого уровня ограничить значением 0.4 * VCC, то кривая экспоненты довольно хорошо приближена к прямой линии. Напряжение входного сигнала UIN определяется по измеренному времени, когда напряжение на конденсаторе станет выше этого входного напряжения. При использовании одной ножки порта B для управления зарядом и разрядом конденсатора, всего используется три вывода микроконтроллера, см. схему на рис. 1.
Рис. 1. Схема АЦП на основе компаратора AVR.
Примечание: вместо указанного на схеме AVR AT90S1200 может использоваться его аналог ATtiny2313.
Постоянная времени RC цепочки должна быть подобрана так, чтобы она удовлетворяла следующему уравнению:
512 / f = - R · C · ln (1 - 0.4)
Отсюда выводится простая формула:
R · C = 1002 / f
Здесь f это тактовая частота AVR в Гц, R и C соответственно в Омах и Фарадах. Значения R и C для типовых частот кварца показаны в таблице 1.
Таблица 1. Подобранные значения RC для некоторых тактовых частот AVR.
XTAL (МГц) |
1 |
2 |
4 |
6 |
8 |
10 |
12 |
14 |
16 |
R (кОм) |
100 |
33 |
30 |
30 |
27 |
100 |
56 |
47 |
160 |
C (нФ) |
10 |
15 |
8.2 |
5.6 |
4.7 |
1 |
1.5 |
1.5 |
0.39 |
Если постоянная времени будет отличаться, то это приведет к ошибке в результатах измерения. Поэтому для RC-цепочки необходимо использовать компоненты с высокой точностью. Кривая изменения напряжения на конденсаторе вместе с аппроксимируемой прямой линией показана на рис. 2. Так как напряжение питания VCC используется в качестве опорного напряжения, оно во время преобразования должно быть стабильным.
Рис. 2. Линейность аналого-цифрового преобразователя на компараторе.
Чтобы гарантировать правильную работу, конденсатор должен быть разряжен между преобразованиями в течение как минимум 200 мкс. Если конденсатор не будет достаточно разряжен, то нельзя будет измерить малые значения напряжения. Если напряжение на входе превысит 0.4 * VCC, то преобразователь возвратит максимальное значение напряжения. Это реализовано загрузкой значения смещения в регистр Timer/Counter0 перед запуском преобразования. Прерывание переполнения таймера произойдет после 512 тактов (64*8). За это время напряжение на конденсаторе возрастает до 0.4 * VCC. Если измеряемое напряжение находится в рабочем диапазоне, то произойдет срабатывание прерывания компаратора. Смещение вычитается из измеренного значения.
[Реализация]
АЦП использует прерывания Timer/Counter0 и Analog Comparator. Это освобождает вычислительные ресурсы AVR во время преобразования.
Инициализация АЦП. Подпрограмма convert_init вызывается для инициализации АЦП. Это должно быть сделано перед использованием АЦП. В этой подпрограмме разрешаются прерывания компаратора и таймера, и порт управления зарядом конденсатора настраивается как выход. После этого для разрешения преобразования АЦП должна быть вызвана инструкция SEI, которая разрешает все настроенные прерывания. Вызовом инструкции CLI (глобальный запрет прерываний) преобразование АЦП запрещается.
Рис. 3. Алгоритм convert_init.
Подпрограмма convert_init занимает 6 слов инструкций, выполняется за 10 тактов (включая инструкцию возврата), и использует только регистр R16.
Преобразование АЦП. Подпрограмма AD_convert используется для запуска преобразования АЦП. Она загружает в счетчик таймера значение (256-64), и запускает счет таймера на частоте XTAL/8. Флаг завершения преобразования (флаг T в регистре состояния SREG) очищается, и начинается заряд конденсатора.
Рис. 4. Алгоритм AD_convert.
Подпрограмма convert_init занимает 7 слов инструкций, выполняется за 10 тактов (включая инструкцию возврата), и использует регистры R16 и SREG.
ISR компаратора. Обработчик прерывания (ISR) компаратора ANA_COMP выполняется, когда преобразование завершено. Он загружает значение Timer/Counter0, останавливает счет таймера и устанавливает флаг T в регистре SREG (флаг завершения преобразования). Из значения таймера вычитается смещение. Нужно вычесть смещение+1, потому что обработка прерывания занимает минимум 7 тактов системной частоты.
Рис. 5. Алгоритм ISR ANA_COMP.
Размер кода обработчика ANA_COMP составляет 7 слов, выполняемое время 11 тактов (включая инструкцию возврата из прерывания RETI), используются регистры R16 и R17, а также T-флаг в регистре SREG. В регистре R16 возвращается результат преобразования, регистр R17 используется как временная переменная. Флаг T сигнализирует о завершении преобразования.
Пример программы. Приведенный в этом апноуте пример программы [2] циклически выполняет преобразования АЦП, и выводит двоичный код результата преобразования в порт B. В таблице ниже приведена информация по использованию ресурсов AVR.
Параметр |
Значение |
Размер кода |
23 слова - только подпрограммы реализации АЦП. 37 слов - полный код вместе с тест-программой. |
Использование регистров |
Младшие регистры не используются. Используется 2 старших регистра. Указатели не используются. Используется один флаг статуса. |
Использование прерываний |
Timer/Counter0 Overflow Interrupt Analog Comparator Interrupt |
Использование периферийных устройств |
Timer/Counter0 Analog Comparator (ножки портов PB0 и PB1) PB2 для управления зарядом конденсатора Порт D (только в тест-программе) |
[Ссылки]
1. AVR400: Low Cost A/D Converter site:microchip.net. 2. 181228AVR400.zip - документация, исходный код. 3. AVR401: 8-битный АЦП на компараторе. |