Аналогово-Цифровой Преобразователь (АЦП) в Bascom-AVR


Сайт - Проекты на микроконтроллерах AVR
 Микроконтроллер - цифровой прибор, который понимает и работает только с цифровыми сигналами (нулями и единицами). Но вокруг нас все сигналы представлены в аналоговой форме - освещение, температура и давление, влажность, звуки - все это непрерывно меняющиеся физические величины. 

 Для того чтобы обрабатывать аналоговые сигналы, в большинство микроконтроллеров AVR встроен АЦП (ADC–analog digital converter) – аналого-цифровой преобразователь.

 Аналогово-Цифровой Преобразователь служит для преобразования аналогового сигнала на входе в цифровую форму, понятную для МК.  Практически во всех современных микроконтроллерах от AVR имеется 10 битный АЦП, позволяющий оцифровывать аналоговый сигнал с дискретностью 1024 значений. Этого достаточно чтобы, например, делать замеры напряжений (в разумных пределах), снимать показания с различных датчиков, таких как фотодиод и термопара, делать анализаторы спектра и многое другое.



 Примерная работа преобразования приведена на рисунке ниже; через равные промежутки времени (ось X) происходит считывание значения напряжения на входе АЦП (ось Y). Так как АЦП имеет ограниченную разрешающую способность, появляется дискретность (дробление) значений.  



  Величина по оХ называется частотой дискретизации, чем больше частота тем точнее может быть полученная информация о сигнале. АЦП в мк AVR может работать на частотах дискретизации от 50 до 200 кГц, это значит что микроконтроллер может до 200-х раз в секунду считывать уровень напряжения на входе АЦП.

  Для того чтобы начать работать с преобразователем его сперва необходимо сконфигурировать. В Bascom-AVR конфигурирование АЦП сводится всего к одной строчке:

Config Adc = SINGLE , Prescaler = 128 , Reference = Avcc

 здесь Adc - режим считывания значения: Single - единичное считывание, также может быть Free (режим постоянной работы преобразователя)
Prescaler = 128 - выбираем частоту дискретизации путем деления частоты кварца на определенное число (также может быть 2,4,8,16,32,64 или Auto). Если выбрать Auto, то компилятор сам выберет подходящую частоту работы АЦП
Reference – выбор источника опорного напряжения, у этого параметра может быть несколько значений:
Aref – внешний источник, Avcc – напряжение питания схемы, Internal – внутренний ИОН на 2,56 вольт или в некоторых микроконтроллерах 1,1 вольт.

 

Для того чтобы посмотреть работу АЦП можно собрать вот такую простую схему на микроконтроллере ATmega8 (или на любом другом камне имеющем на борту цифро-аналоговый преобразователь).





 В качестве опорного напряжения для АЦП будет использоваться встроенный стабилизатор, у Atmega8 этот стабилизатор выдает 2,56 вольт. А для того чтобы этот стабилизатор заработал нужно подать напряжение на ножку AVCC. Для того чтобы уменьшить шумы по питанию и увеличить качество работы стабилизатора, принято подавать питание на эту ножку через дроссель (L1) номиналом 10÷100 мкГн, а так же соединять с землей через керамический конденсатор 100 нанофарад (С1). Но для простого тестирования, конечно можно убрать эти элементы и соединить ножку AVCC напрямую с VCC. 
 Вход АЦП (ADC0) соединим с переменным резистором (потенциометр), таким образом получится делитель напряжения, который позволит менять напряжение на этой ножке. 


тестовый исходник работы с АЦП в Bascom-AVR

$regfile = "m8def.dat"          'микроконтроллер ATmega8
$crystal = 1000000              'частота работы 1МГц
$baud = 1200                    'скорость передачи 1200 бод

'конфигурируем АЦП
Config Adc = Single , Prescaler = 128 , Reference = Internal

Dim R As Word                  'переменная R в которую будем записывать показания с АЦП

Start Adc                      'запускаем пребразователь
'этой командой на преобразователь поступает питание
'работу преобразователя также можно остановить в любой момент
'для этого пишем команду:
'Stop Adc

Do                             'бесконечный цикл

= Getadc(0)                  'считываем нулевой канал АЦП и записываем в переменную
Print R                        'печатаем значение в терминал
Waitms 500                     'ждем полсекунды и повторяем

Loop

End


 Изменяя напряжение на ножке ADC0 с помощью переменного резистора, мы увидим как меняется значение считанное с АЦП. На рисунке ниже показан скрин терминала с данными, которые получил с АЦП




 При вращении ручки потенциометра можно заметить одну странность: если плавно увеличивать напряжение на входе АЦП, то в определенный момент показания перестанут расти, а значение переменной остановится на значении 1023. На самом деле это означает, что АЦП достиг максимального предела измерения. Если в этот момент измерить напряжение на входе АЦП то мы получим значение примерно 2,56 вольт, что равняется выбранному значению опорного напряжения. Отсюда можно сделать вывод, что АЦП измеряет напряжение на входе только в пределах от нуля до значения ИОН


 Так как изменение значения с АЦП меняются пропорционально напряжению на входе, для удобства можно пользоваться вот таким рисунком.


 К примеру, получив значение c АЦП 599 можно примерно прикинуть сколько соответствует этому вольт на входе. А чтобы увеличить диапазон измеряемого напряжения, нужно использовать резисторный делитель.