
АЦП (аналого-цифровой преобразователь) является наиболее широко используемым устройством во встроенных системах, разработанный специально для сбора данных с аналоговых датчиков. В AVR серии ATmega обычно 10-битный АЦП встроен в контроллер.
Давайте посмотрим, как использовать АЦП AVR на примере микроконтроллеров серии ATmega16 / ATmega32.
Микроконтроллеры ATmega16/32 поддерживают восемь каналов АЦП, это означает, что мы можем подключить восемь аналоговых датчиков одновременно. Каналы АЦП с 0 по 7 присутствуют на PORTA. т. е. контакты № 33–40.
Контроллер имеет 10-битный АЦП, это означает, что мы получим цифровой выход от 0 до 1023. Т. е. когда на входе 0В, на цифровом выходе будет значение 0, а когда на входе 5В (и Vref = 5 В), мы получим самое высокое цифровое значение, соответствующий 1023 шагам.
Исходя из выше описанного получается, что АЦП контроллера имеет 1023 шага. В зависимости от выбранного Vref меняется и количество мВ на один шаг:
Размер шага при Vref = 5В:
Размер шага при Vref = 2,56В:
Таким образом, цифровое значение будет равняться:
АЦП в ATmega16/32
- Это 10-битный АЦП.
- Преобразованные выходные двоичные данные хранятся в двух специальных функциях 8-битного регистра ADCL (Low — младшие биты) и ADCH (High — старшие биты).
- АЦП выдает 10-битный код, поэтому (ADCH и ADCL) полезны только 10-бит из 16-ти.
- У нас есть варианты использовать эти 10 бит как старшие или младшие биты.
- В микроконтроллерах AVR предусмотрена возможность подключения Vref тремя различными вариантами.
- AVcc — подключение к напряжению питания (аналог Vcc)
- Внутренний Vref, который имеет напряжение 2.56 В.
- Внешний Aref. Подключается к выводу микроконтроллера.
- Общее время преобразования зависит от частоты кристалла и ADPS: содержит коэффициент деления частоты.
- Выбрав в качестве опорного напряжения AVcc или Aref необходимо подключить конденсатор, данное действие позволит убрать часть шумов, сигнл будет более стабильным и повысится точность измерения. Конденсатор подключается между этим выводом и GND.
Регистры АЦП в AVR
В AVR для настройки АЦП нам нужно знать четыре основных регистра:
- ADCH: содержит старший байт цифровых преобразованных данных.
- ADCL: Содержит младший байт цифровых преобразованных данных.
- ADMUX: регистр выбора мультиплексора АЦП.
- ADCSRA: регистр управления и состояния ADC.
Регистры ADCH:ADCL
Эти два регистра содержат данные цифрового преобразования, которые являются 10-битными.
Регистр ADMUX
Биты 4:0 – MUX4:0: Биты выбора аналогового канала и усиления.
Мы можем выбрать входной канал от ADC0 до ADC7, используя эти биты. Эти биты также используются для выбора входов компаратора (встроенного в AVR) с различным коэффициентом усиления. Мы рассмотрим эти операции в другой статье.
Выбрать канал очень просто, просто введите номер канала в MUX4: 0.
- Предположим, вы подключаете вход к каналу 2 АЦП. Тогда биты MUX4:0 необходимо установить в 00010.
- Предположим, вы подключаете вход к каналу 5 АЦП. Тогда биты MUX4:0 необходимо установить в 00101.
Регистр ADCSRA
Бит 7 — ADEN: включение АЦП.
Запись единицы в этот бит включает АЦП. Записав его в ноль, АЦП отключается. Если отключить АЦП во время преобразования, это преобразование будет прекращено.
Бит 6 — ADSC: запуск преобразования АЦП.
Запись единицы в этот бит запускает преобразование.
Бит 5 — ADATE: включение автоматического запуска АЦП.
Запись единицы в этот бит приводит к включению автоматического запуска АЦП. Это значит, что установив этот бит в единицу, не нужно запускать следующее преобразование, установкой бита ADSC в единицу.
Бит 4 — ADIF: флаг прерывания АЦП.
Флаг завершения преобразования. Когда ADIF равен единице, это означает что данные в регистрах обновились и мы можем их считать.
Бит 3 — ADIE: разрешение прерывания АЦП.
Записав единицу в этот бит мы включаем работу прерывания по завершению преобразования.
Биты 2:0 – ADPS2:0: Биты выбора предварительного делителя АЦП.
Установкой данных битов мы выбираем делитель частоты XTAL, чтобы настроить тактирование АЦП на необходимую частоту.
Мы можем выбрать любой делитель и установить частоту Fosc/2, Fosc/4 и т. д., но в микроконтроллерах AVR для корректной работы АЦП требуется чтобы тактовая частота не превышала 200 кГц.
Предположим, тактовая частота вашего микроконтроллера AVR составляет 8 МГц, тогда мы должны использовать делитель 64 или 128. Поскольку он дает 8 МГц/64 = 125 кГц, что меньше 200 кГц.
Пример электрической схемы использования АЦП в AVR
В данном примере LCD16x2 используется для отображения значений цифрового преобразования из канала 0.
Пошаговая инструкция использования АЦП в AVR
- Укажите входной канал АЦП.
- Установите бит включения ADEN в ADCSRA, выберите скорость преобразования с помощью ADPS2:0. В примере у нас будет делитель 128.
- Далее необходимо выбрать один из трех вариантов опорного напряжения, используя REFS1:REFS0 в регистре ADMUX. В данном примере мы будем использовать AVcc в качестве опорного напряжения.
- Выберите входной канал АЦП, используя MUX4:0 в ADMUX, например, мы будем использовать канал 0.
- Итак, наше значение в регистре ADCSRA = 0x87 и ADMUX = 0x40.
- Начните преобразование, установив бит ADSC в ADCSRA. Например, ADCSRA |= (1<<ADSC).
- Дождитесь завершения преобразования. Для этого необходимо опрашивать ADIF. Бит установиться в единицу после завершения преобразования. Данный бит содержится в регистре ADCSRA.
- После того, как бит ADIF станет равным единице, необходимо считать содержимое регистров ADCL и ADCH, чтобы получить цифровое значение преобразования.
Важно!
Во время чтения каналов АЦП первым делом необходимо считать результат преобразования в регистре ADCL, после этого в регистре ADCH; если этого не сделать результат преобразования будет не верным.
Пример программы использования АЦП в AVR
#include <util/delay.h> #include <stdlib.h> #include "LCD_16x2_H.h" void ADC_Init() { DDRA = 0x0; /* Порт АЦП как вход */ ADCSRA = 0x87; /* Включаем АЦП. делитель 128 */ ADMUX = 0x40; /* выбираем опорное напряжение и 0 канал */ } int ADC_Read(char channel) { int Ain, AinLow; ADMUX = ADMUX | (channel & 0x0f); /* выбор канала для чтения*/ ADCSRA |= (1 << ADSC); /* начало преобразования */ while((ADCSRA & (1 << ADIF)) == 0); /* Ждем окончания преобразования */ _delay_us(10); AinLow = (int) ADCL; /* Читаем младший байт*/ Ain = (int) ADCH * 256; /* читаем старший байт и соединяем в одно двух байтное число */ Ain = Ain + AinLow; return(Ain); /* Возвращаем цифровой код } int main() { char String[5]; int value; ADC_Init(); LCD_Init(); /* инизиализация LCD */ LCD_String("ADC value"); /* Запись первой строки LCD */ while(1) { LCD_Command(0xc4); /* LCD16x2 позиция курсора*/ value = ADC_Read(0); /* Чтение канала 0 АЦП */ itoa(value, String,10); /* переводим число в строку */ LCD_String(String); LCD_String(" "); } return 0; }
Загрузки
Где купить
- ATMEGA16 DIP-40
- ATMEGA32 DIP-40
- LCD 1602
- Набор выводных резисторов
- Набор подстроечных резисторов
- Набор керамических конденсаторов (180 штук)
- Набор кнопок (10 видов)