Здесь находятся подпрограммы описанные в документе, а также программа примера, на ассемблере. (можно просматривать блокнотом)

  AVR400: Недорогой аналого-цифровой преобразователь


Оригинал: Application Note AVR400 фирмы ATMEL
перевел: Sinbad             г.Самара.             20.10.2000 г

Особенности

Введение
      Целью этого приложения являются устройства, нуждающиеся в недорогом и малогабаритном АЦП. Ниже описывается изготовление простого АЦП всего лишь с двумя внешними компонентами, резистором и конденсатором.

Теория преобразования
      Особенность почти всех 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

     Чтобы гарантировать правильную работу, конденсатор должен быть разряжен как минимум 200 мкс между преобразованиями. Если конденсатор не разрядить правильно, то нельзя будет измерять маленькие напряжения. Если входное напряжение больше чем 2/5 Vcc, преобразователь будет выдавать максимальное значение. Это происходит благодаря загрузке смещения в регистр таймера/счетчика 0 перед началом преобразования. Таймер будет формировать прерывание по переполнению после 512 циклов (64*8). Это время требуется, чтобы напряжение на конденсаторе достигло 2/5 Vcc. Если напряжение находится в пределах рабочего диапазона, будет формироваться прерывание Аналогового компаратора. Смещение же вычитается и измеренного значения.

Реализация
      АЦП использует прерывания таймера/счетчика 0 и аналогового компаратора. Это освобождает ресурсы MCU в течение преобразования.

Подпрограмма “convert_init” – инициализация АЦП
      Эта подпрограмма вызывается для инициализации АЦП. Она должна быть выполнена перед использованием АЦП. Вызов этой подпрограммы разрешает прерывания компаратора и таймера и устанавливает управляющий вывод как выход. Затем должна быть выполнена инструкция 'SEI', которая разрешает глобальные прерывания, для включения АЦП. Выполнением инструкции 'CLI' , АЦП выключается.

Таблица 2. Параметры подпрограммы “convert_init”

ПАРАМЕТР

ЗНАЧЕНИЕ

Размер кода

6 слов

Выполняемые циклы

10 циклов, в том числе инструкция RET

Используемые регистры

  • Младшие регистры :нет
  • Старшие регистры :1
  • Указатели : нет

Таблица 3. Регистры используемые “convert_init”

РЕГИСТР

НА ВХОДЕ

ВНУТРИ

НА ВЫХОДЕ

R16

 

"result" – рабочий регистр

 

Схема

Рисунок 3. Блок схема “convert_init”

“AD_convert” – старт А/Ц преобразования
      Эта подпрограмма используется для запуска А/Ц преобразования. Она загружает в счетчик значение 256 – 64 и запускает счет с частотой XTAL/8. Флаг завершения преобразования ( Т – флаг в регистре статуса) очищается и начинается зарядка конденсатора.

Таблица 4. Параметры подпрограммы “AD_convert”

ПАРАМЕТР

ЗНАЧЕНИЕ

Размер кода

7 слов

Выполняемые циклы

10 циклов, в том числе инструкция RET

Используемые регистры

  • Младшие регистры :нет
  • Старшие регистры :1
  • Указатели : нет
  • Флаги статуса :1

Таблица 5. Регистры используемые “AD_convert”

РЕГИСТР

НА ВХОДЕ

ВНУТРИ

НА ВЫХОДЕ

R16

 

"result" – рабочий регистр

 

SREG

   

T – флаг. Этот флаг показывает, что идет преобразование

Схема

Рисунок 4. Блок схема А/Ц преобразования

“ANA_COMP” подпрограмма обработки прерывания
      Эта подпрограмма выполняется когда преобразование закончено. Она загружает значение Таймера/счетчика 0, останавливает таймер и устанавливает флаг завершения преобразования (Т – флаг в SREG). Затем смещение вычитается из значения таймера. Необходимо вычесть на единицу больше чем смещение, так как обработка прерывания требует минимум 7 циклов.

Таблица 6. Параметры подпрограммы “ANA_COMP”

ПАРАМЕТР

ЗНАЧЕНИЕ

Размер кода

7 слов

Выполняемые циклы

11 циклов, в том числе инструкция RET

Используемые регистры

  • Младшие регистры :нет
  • Старшие регистры :2
  • Указатели : нет
  • Флаги статуса :1

Используемые прерывания

Прерывания таймера/счетчика 0 и аналогового компаратора

Таблица 7. Регистры используемые “ANA_COMP”

РЕГИСТР

НА ВХОДЕ

ВНУТРИ

НА ВЫХОДЕ

R16

 

"result" – хранит значение таймера

"result" – содержит результат преобразования

R17

 

"temp"– рабочий регистр

 

SREG

   

T – флаг. Этот флаг показывает, что идет преобразование

Схема

Рисунок 5. Блок схема "ANA_COMP"

Пример программы
      Пример программы включенный в данное приложение, выполняет последовательное преобразование и выдает данные в виде двоичного значения на порт В.

Таблица 8. Общая характеристика программы примера

ПАРАМЕТР

ЗНАЧЕНИЕ

Размер кода

23 слова – только процедура А/Ц преобразования

37 слов – полностью вся программа

Используемые регистры

  • Младшие регистры : нет
  • Старшие регистры :2
  • Указатели :нет
  • Флаги статуса :1
Используемые прерывания Прерывание переполнения таймера/счетчика 0
Прерывание аналогового компаратора
Используемая периферия Таймер/Счетчик 0
Аналоговый компаратор (порт B выводы 0 и 1)
Порт В вывод 2
Порт В (только в примере программы)

Hosted by uCoz