ATmega16 — ADC (Arduino)

Аналого-цифровой преобразователь (ADC) микроконтроллера ATmega16 содержит 8 однополярных каналов , 7 дифференциальных каналов и дифференциальных канала  усилением на 10 и 200. Все каналы имеют разрешение 10 бит. Так же имеется внутренний ИОН который имеет два опорных напряжения: напряжение питания микроконтроллера и 2.56 В. К выходу AREF даже при использовании внутреннего ИОН на 2.56 В рекомендуется подключать электролитический конденсатор.

Выбор однополярного или дифференциального входа осуществляется при помощи регистра ADMUX путем записи битов MUX4…MUX0. Однополярный вход можно выбрать из входов ADC0…ADC7. В режиме дифференциального ввода имеется возможность выбора инвертирующего и неинвертирующего входа дифференциального усилителя.

Register – ADMUX

MUX4:0 — Биты выбора аналогового канала и коэффициента усиления

ADLAR — Бит управления представлением результата преобразования, если ADLAR = 1, то результат преобразования будет иметь левосторонний формат, в противном случае — правосторонний.

Работа ADC определяется состоянием битов регистра ADCSRA

ADEN — Бит разрешения работы ADC, если бит записана 1, то работа ADC разрешена, если 0, то запрещена.

ADSC — Бит запуска преобразования ADC.

ADATE — Бит включения режима автоматического запуска ADC, если установлена 1, то ADC переходит в режим автоматического перезапуска, в этом режиме DAC автоматически запускает преобразование по положительному фронту запускающего сигнала. Источник запуска определяется в регистре SFIOR.

ADIF —  Флаг прерывания ADC. Флаг ADIF сбрасывается путем записи в него лог. 1.

ADIE — Бит разрешения прерывания ADC.

ADPS2:0 —  Биты управления предделителем ADC, бит определяет на какое значение тактовая частота ЦПУ будет отличаться от частоты входной синхронизации ADC.

Результат преобразования помещается в два регистра ADCL и ADCH. В зависимости от состояния бита ADLAR регистра ADMUX, регистры ADCL и ADCH могут иметь следующую структуры данных:

В качестве примера подадим напряжение 1.2 В на недифференциальный  вход ADC1 и выведем результат измерения в мВ на LCD1602 c I2C подключением. Используем внутренний ИОН на 2.56 В.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

long u;

void setup() {
   lcd.init();                     
   lcd.backlight();// Включаем подсветку дисплея
   ADMUX |= (1<<MUX0)|(1<<REFS0)|(1<<REFS1);
   ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE);
   ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);// Division Factor 128
}

void loop() {
  while((ADCSRA & (1 << ADIF)) == 0);
   u = (ADCL|ADCH << 8);
   lcd.setCursor(0, 0);lcd.print(2560*u/1023);lcd.print(" mV        ");
   delay(500);  
}

Как видно из данного примера, измеренное напряжение преобразовано в 10 битное значение (0…1023), для преобразования этого числа в напряжение нужно полученное значение умножить на опорное напряжение (мВ) и разделить на 1023.

Далее подадим напряжение на дифференциальный вход ADC0 ADC1.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

long u;
byte minus;

void setup() {
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  
   Serial.begin(9600);
   ADMUX |= (1<<MUX4);
   ADMUX |= (1<<REFS0)|(1<<REFS1);
   ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE);
   ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);// Division Factor 128
}

void loop() {
  while((ADCSRA & (1 << ADIF)) == 0);
   u = (ADCL|ADCH << 8);
   if((u>>9)==1){minus=1;}else{minus=0;}
   if(minus==1){lcd.setCursor(0, 0);lcd.print("-");lcd.print(2560*(u-511)/511);lcd.print(" mV      ");}
    else{lcd.setCursor(0, 0);lcd.print(2560*u/511);lcd.print(" mV      ");}

   delay(1000);  
}

Измеренное значение напряжения при использовании дифференциального входа так же 10-и битное, но старший бит используется для определения полярности, а значение положительного и отрицательного напряжения измеряется с разрешением 9 бит (0…511).

Как получить поддержку микроконтроллера ATmrga16  в Arduino IDE и прошить микроконтроллер можно узнать в http://rcl-radio.ru/?p=100721

Добавить комментарий

Войти с помощью: