| Ваш IP: 3.239.7.207 | Online(30) - гости: 12, боты: 18 | Загрузка сервера: 1.15 ::::::::::::

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 и прошить микроконтроллер можно узнать в https://rcl-radio.ru/?p=100721

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

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

Случайные статьи

  • Регулятор громкости на полевом транзисторе

    Регулятор громкости на полевом транзисторе

    На рисунке показана схема простого регулятора громкости на полевом транзисторе. Регулировка громкости осуществляется подачей отрицательного напряжения от 0 до -3 В на затвор полевого транзистора. Напряжение 0 В на затворе транзистора соответствует минимальному уровню громкости, а напряжение -3 В — максимальной громкости. Источник — https://freecircuitdiagram.com/4656-voltage-controlled-attenuator-volume-control-using-fet/Подробнее...
  • Выходной каскад (ламповые усилители)

    Однотактовый выходной каскад лампового усилителя содержит минимум деталей и прост в сборке и регулировке. Пентоды в выходном каскаде могут использоваться только ультралинейном включении, триодном или обычном режимах. При триодном включении экранирующая сетка соединяется с анодом через резистор 100…1000Ом. В ультралинейном включении каскад охвачен ОС по экранирующей сетке, что дает снижение …Подробнее...
  • ТЕРМОСТАБИЛЬНЫЙ УСИЛИТЕЛЬ МОЩНОСТИ

    ТЕРМОСТАБИЛЬНЫЙ УСИЛИТЕЛЬ МОЩНОСТИ

    С целью уменьшения нелинейных искажений при малой гром­кости режим работы транзисторов выходного каскада усилителя мощности обычно выбирают таким, чтобы в отсутствие сигнала через них протекал довольно большой ток (нередко до сотен миллиампер). Во избежание теплового пробоя, обусловленного нагреванием переходов из-за большой рассеиваемой на них мощ­ности, транзисторы выходного каскада приходится устанавливать …Подробнее...
  • Светодиодная мигалка

    Светодиодная мигалка

    Светодиодная мигалка состоит из 20 диодов в два ряда. Основа уст-ва — мультивибратор, который поочередно зажигает светодиоды. Схема очень простая, регулировка сводится к подбору С3 и С4 которые входят во время-задающую цепь мультивибратора. Усто-во работает от бестрансформаторного источника питания, который состоит из балластного конденсатора С1, резистора R2, который разряжает конденсатор С1 …Подробнее...
  • Электронный термометр (от 0 до 100°С)

    На рис. приведена принципиальная схема, предлагаемого электронного термометра. Он способен измерять температуру от 0 до 100°С, от 0 до 50°С или от — 50 до +50°С — все зависит от стрелочного индикатора РА1, используемого в приборе. Так, с показанным на схеме микроамперметром на 100 мкА термометр рассчитан на работу в …Подробнее...