AVR400: Недорогой аналого-цифровой преобразователь
Здесь находятся подпрограммы описанные в документе, а также программа примера, на ассемблере. (можно просматривать блокнотом)
AVR400: Недорогой аналого-цифровой преобразователь
Оригинал: Application Note AVR400 фирмы ATMEL
перевел: Sinbad г.Самара. 20.10.2000 г
Особенности
- Выполняется по прерыванию
- Размер кода: 23 слова
- Маленькое число внешних компонентов
- Разрешение: 6 бит
- Диапазон измерения: 0 – 2 В
- Работает на всех AVR устройствах с 8-битным таймером/счетчиком и аналоговым компаратором
Целью этого приложения являются устройства, нуждающиеся в недорогом и малогабаритном АЦП. Ниже описывается изготовление простого АЦП всего лишь с двумя внешними компонентами, резистором и конденсатором.
Теория преобразования
Особенность почти всех AVR микроконтроллеров это аналоговый компаратор, который позволяет просто реализовать АЦП. Измеряемый сигнал подается на инвертирующий вход, а образцовый сигнал на не инвертирующий. Образцовый сигнал формируется при зарядке конденсатора через резистор. При зарядке конденсатора, напряжение на нем изменяется по экспоненциальному закону. Если измеряемый диапазон напряжений ограничить 2/5 Vcc, экспонента хорошо аппроксимируется прямой. Напряжение измеряемого сигнала UIN находим, измеряя время необходимое для того, чтобы напряжение на конденсатор превысило измеряемое. Используя один вывод порта В для контроля зарядки и разрядки конденсатора, всего используется только три вывода. Принципиальная схема представлена на рисунке 1.
Рисунок 1. Принципиальная схема Постоянная времени R/C цепи должна быть выбрана так, чтобы удовлетворять следующему равенству:
512/f = - R C ln(1 - 2/5) , то есть R C = 1002/f
Номиналы элементов для некоторых типичных частот генератора приведены в таблице 1. Если постоянная времени отличается от этого, это приведет к ошибке в результате.
Поэтому в RC цепи необходимо использовать компоненты с высокой точностью. График напряжения на конденсаторе вместе с прямой линией приведен на рисунке 2. Так как напряжение питания используется как опорное, то оно должно быть стабильным в течение преобразования.
Рисунок 2. Линейность АЦП
Таблица 1. Значения элементов R/C цепочки
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 |
Реализация
АЦП использует прерывания таймера/счетчика 0 и аналогового компаратора. Это освобождает ресурсы MCU в течение преобразования. Подпрограмма “convert_init” – инициализация АЦП
Эта подпрограмма вызывается для инициализации АЦП. Она должна быть выполнена перед использованием АЦП. Вызов этой подпрограммы разрешает прерывания компаратора и таймера и устанавливает управляющий вывод как выход. Затем должна быть выполнена инструкция 'SEI', которая разрешает глобальные прерывания, для включения АЦП. Выполнением инструкции 'CLI' , АЦП выключается. Таблица 2. Параметры подпрограммы “convert_init”
ПАРАМЕТР |
ЗНАЧЕНИЕ |
Размер кода |
6 слов |
Выполняемые циклы |
10 циклов, в том числе инструкция RET |
Используемые регистры |
|
b> Таблица 3. Регистры используемые “convert_init”
РЕГИСТР |
НА ВХОДЕ |
ВНУТРИ |
НА ВЫХОДЕ |
R16 |
"result" – рабочий регистр |
“AD_convert” – старт А/Ц преобразования
Эта подпрограмма используется для запуска А/Ц преобразования. Она загружает в счетчик значение 256 – 64 и запускает счет с частотой XTAL/8. Флаг завершения преобразования ( Т – флаг в регистре статуса) очищается и начинается зарядка конденсатора. Таблица 4. Параметры подпрограммы “AD_convert”
ПАРАМЕТР |
ЗНАЧЕНИЕ |
Размер кода |
7 слов |
Выполняемые циклы |
10 циклов, в том числе инструкция RET |
Используемые регистры |
|
РЕГИСТР |
НА ВХОДЕ |
ВНУТРИ |
НА ВЫХОДЕ |
R16 |
"result" – рабочий регистр |
||
SREG |
T – флаг. Этот флаг показывает, что идет преобразование |
“ANA_COMP” подпрограмма обработки прерывания
Эта подпрограмма выполняется когда преобразование закончено. Она загружает значение Таймера/счетчика 0, останавливает таймер и устанавливает флаг завершения преобразования (Т – флаг в SREG). Затем смещение вычитается из значения таймера. Необходимо вычесть на единицу больше чем смещение, так как обработка прерывания требует минимум 7 циклов. Таблица 6. Параметры подпрограммы “ANA_COMP”
ПАРАМЕТР |
ЗНАЧЕНИЕ |
Размер кода |
7 слов |
Выполняемые циклы |
11 циклов, в том числе инструкция RET |
Используемые регистры |
|
Используемые прерывания |
Прерывания таймера/счетчика 0 и аналогового компаратора |
РЕГИСТР |
НА ВХОДЕ |
ВНУТРИ |
НА ВЫХОДЕ |
R16 |
"result" – хранит значение таймера |
"result" – содержит результат преобразования | |
R17 |
"temp"– рабочий регистр |
||
SREG |
T – флаг. Этот флаг показывает, что идет преобразование |
Рисунок 5. Блок схема "ANA_COMP"
Пример программы
Пример программы включенный в данное приложение, выполняет последовательное преобразование и выдает данные в виде двоичного значения на порт В.
Таблица 8. Общая характеристика программы примера
ПАРАМЕТР |
ЗНАЧЕНИЕ |
Размер кода |
23 слова – только процедура А/Ц преобразования 37 слов – полностью вся программа |
Используемые регистры |
|
Используемые прерывания | Прерывание переполнения таймера/счетчика 0 Прерывание аналогового компаратора |
Используемая периферия | Таймер/Счетчик 0 Аналоговый компаратор (порт B выводы 0 и 1) Порт В вывод 2 Порт В (только в примере программы) |