АЦП микроконтроллера AVR

АЦП

АЦП (аналого-цифровой преобразователь) является наиболее широко используемым устройством во встроенных системах, разработанный специально для сбора данных с аналоговых датчиков. В AVR серии ATmega обычно 10-битный АЦП встроен в контроллер.

Давайте посмотрим, как использовать АЦП AVR на примере микроконтроллеров серии ATmega16 / ATmega32.

Микроконтроллеры ATmega16/32 поддерживают восемь каналов АЦП, это означает, что мы можем подключить восемь аналоговых датчиков одновременно. Каналы АЦП с 0 по 7 присутствуют на PORTA. т. е. контакты № 33–40.

Контакты микроконтроллеров ATMega16/32, которые поддерживают АЦП
Пины АЦП микроконтроллеров ATMega16/32

Контроллер имеет 10-битный АЦП, это означает, что мы получим цифровой выход от 0 до 1023. Т. е. когда на входе , на цифровом выходе будет значение 0, а когда на входе (и Vref = 5 В), мы получим самое высокое цифровое значение, соответствующий 1023 шагам.

Исходя из выше описанного получается, что АЦП контроллера имеет 1023 шага. В зависимости от выбранного Vref меняется и количество мВ на один шаг:

Размер шага при Vref = 5В:

\[Шаг = {5 \over 1023}=4.88мВ\]

Размер шага при Vref = 2,56В:

\[Шаг = {2.56 \over 1023}=2.5мВ\]

Таким образом,  цифровое значение будет равняться:

\[D_{out} = {V_{in} \over шаг}\]

АЦП в ATmega16/32

  • Это 10-битный АЦП.
  • Преобразованные выходные двоичные данные хранятся в двух специальных функциях 8-битного регистра ADCL (Low — младшие биты) и ADCH (High — старшие биты).
  • АЦП выдает 10-битный код, поэтому (ADCH и ADCL) полезны только 10-бит из 16-ти.
  • У нас есть варианты использовать эти 10 бит как старшие или младшие биты.
  • В микроконтроллерах AVR предусмотрена возможность подключения Vref тремя различными вариантами.
    1. AVcc — подключение к напряжению питания (аналог Vcc)
    2. Внутренний Vref, который имеет напряжение 2.56 В.
    3. Внешний Aref. Подключается к выводу микроконтроллера.
  • Общее время преобразования зависит от частоты кристалла и ADPS: содержит коэффициент деления частоты.
  • Выбрав в качестве опорного напряжения  AVcc или Aref необходимо подключить конденсатор, данное действие позволит убрать часть шумов, сигнл будет более стабильным и повысится точность измерения. Конденсатор подключается между этим выводом  и GND.

Регистры АЦП в AVR

В AVR для настройки АЦП нам нужно знать четыре основных регистра:

  • ADCH: содержит старший байт цифровых преобразованных данных.
  • ADCL: Содержит младший байт цифровых преобразованных данных.
  • ADMUX: регистр выбора мультиплексора АЦП.
  • ADCSRA: регистр управления и состояния ADC.

Регистры ADCH:ADCL

Эти два регистра содержат данные цифрового преобразования, которые являются 10-битными.

Регистр ADMUX

Регистр ADMUX AVR
Регистр ADMUX AVR

Бит 7:6REFS1:0: настройка опорного напряжения для работы АЦП.

Соответствие вида опорного напряжения и битов REFS1:0 представлена на рисунке ниже.

Опорное напряжение микроконтроллера AVR при определенных состояних битов REFS1 и REFS0

Бит 5ADLAR: регулировка представления результата преобразования.

Результат преобразования принимает либо левосторонний формат либо правосторонний формат.  Настройка  применяется сразу после установки бита в 0 или 1.

Регистр ADLAR микроконтроллера AVR Atmega16/32
Регистр ADLAR микроконтроллера AVR Atmega16/32

Биты 4:0MUX4:0: Биты выбора аналогового канала и усиления.

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

Выбрать канал очень просто, просто введите номер канала в MUX4: 0.

  • Предположим, вы подключаете вход к каналу 2 АЦП. Тогда биты MUX4:0 необходимо установить в 00010.
  • Предположим, вы подключаете вход к каналу 5 АЦП. Тогда биты MUX4:0 необходимо установить в 00101.

Регистр ADCSRA

Регистр ADCSRA микроконтроллеров Atmega 16/32
Регистр ADCSRA микроконтроллеров Atmega 16/32

Бит 7ADEN: включение АЦП.

Запись единицы в этот бит включает АЦП. Записав его в ноль, АЦП отключается. Если отключить АЦП во время преобразования, это преобразование будет прекращено.

Бит 6ADSC: запуск преобразования АЦП.

Запись единицы в этот бит запускает преобразование.

Бит 5ADATE: включение автоматического запуска АЦП.

Запись единицы в этот бит приводит к включению автоматического запуска АЦП. Это значит, что установив этот бит в единицу, не нужно запускать следующее преобразование, установкой бита ADSC в единицу.

Бит 4ADIF: флаг прерывания АЦП.

Флаг завершения преобразования. Когда ADIF равен единице, это означает что данные в регистрах обновились и мы можем их считать.

Бит 3ADIE: разрешение прерывания АЦП.

Записав единицу в этот бит мы включаем работу прерывания по завершению преобразования.

Биты 2:0ADPS2:0: Биты выбора предварительного делителя АЦП.

Установкой данных битов мы выбираем делитель частоты XTAL, чтобы настроить тактирование АЦП на необходимую частоту.

Биты ADPS выбора предварительного делителя АЦП микроконтроллеров Atmega 16/32

Мы можем выбрать любой делитель и установить частоту Fosc/2, Fosc/4 и т. д., но в микроконтроллерах AVR для корректной работы АЦП требуется чтобы тактовая частота не превышала 200 кГц.

Предположим, тактовая частота вашего микроконтроллера AVR составляет 8 МГц, тогда мы должны использовать делитель 64 или 128. Поскольку он дает 8 МГц/64 = 125 кГц, что меньше 200 кГц.

Пример электрической схемы использования АЦП в AVR

В данном примере LCD16x2 используется для отображения значений цифрового преобразования из канала 0.

Пример подключения дисплея 16 на 2 и потенциометра к Атмега 16/32

Пошаговая инструкция использования АЦП в 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

Скачать ZIP-архив с проектом

#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 видов)
5 3 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии