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