Урок 2. Аналоговые входы

Опубликовано 09.07.2014 11:54:00


Продолжим знакомство с платформой Arduino и в данной статье рассмотрим аналоговые входы.

Основным применением аналоговых входов в тематике Arduino является чтение значений аналоговых датчиков. В тоже время стоит не забыть упомянуть, что аналоговые входы могут использоваться как цифровые порты входов/выходов рассмотренные в предыдущем уроке (об этом в конце статьи). 

На плате Arduino UNO их 6 (A0-A5). У других плат количество может отличаться, смотрите в спецификации.

Благодаря встроенному АЦП (аналого-цифровой преобразователь), данные входы могут считывать напряжение подаваемое на них. Микроконтроллеры Atmega 328, используемые в Arduino UNO, содержат шестиканальный АЦП, разрешение которого составляет 10 бит. Это позволяет на выходе получать значения от 0 до 1023 (всего 1024 градации). 

Для того чтобы считать показание на аналоговом входе следует вызвать функцию

  // Производим чтение с аналогового входа A0
   analogRead(0); 
 

 

Данная функция возвращает значение от 0 до 1023 пропорционально напряжению на аналоговом входе

 
Пример на практике

 

Перевод значения аналогового сигнала в вольты

Для перевода получившегося значения в вольты достаточно вычислить шаг и умножить его на получаемое значение.

Для вычисления шага поделим опорное напряжение на 1024 градации

5В / 1024 =  0.0049 Вольт

Т.е. При получаемом аналоговом значении в 500, на порт контроллера приходит ( 500 * 0.0049) 2.45В.

 

пример программного кода:

float Step = 5.0F / 1024; // Вычисляем шаг Uопорн / на градацию 

void setup() 
{ 
Serial.begin(9600); // Задаем скорость работы монитор порта void loop() 
{ 
int analogValue = analogRead(0); // Задаем переменную analogValue для считывания показаний 
float voltageValue = analogValue * Step; // Переводим в вольты (показание * шаг) 
Serial.println(voltageValue); // Выводим значение в вольтах в порт 
delay(500); // Ждем пол секунды 
}

 

Более точная работа аналогового входа 

Для того чтобы добиться более точных показаний с аналогового входа можно использовать 2 варианта:

 

• Функция analogReference()​


Задает опорное напряжение относительно которого происходят аналоговые измерения. 

analogReference(type);

 

Возможные настройки (type):

DEFAULT: установлено по умолчанию. при данной конфигурации опорное напряжение автоматически принимается за напряжение питания платы Arduino. 5В (на платформах с напряжением питания 5 В) или за 3.3 В (на платформах с напряжением питания 3.3В)   

На платформах Arduino "из коробки" вывод AREF не задействован. В этом случае при настройке DEFAULT к выводу подключается внутреннее напряжение AVCC. Соединение является низко-импедансным и любое напряжение подведенное к выводу в этот момент может повредить микросхему ATmega.


INTERNAL: встроенное опорное напряжение 1.1В на микроконтроллерах ATmega168 и ATmega328, и 2.56В на ATmega8.

Это может пригодиться для более точного измерения напряжения лежащего в пределах ниже 1.1В либо 2.56В. Болле точная работа достигается за счет меньшего шага 5/1024 против 1.1/1024. Значения соответствующее или превышающее 1.1В (2.56В) будут конвертироваться АЦП в 1023. 


EXTERNAL: внешний источник опорного напряжения, подключенный к выводу AREF. 

После того как мы задали функцию, происходит отключение обоих внутренних источников. Теперь можно подключить внешнее напряжение, которое и будет являться опорным для АЦП. Внешнее напряжение рекомендуется подключать к выводу AREF через резистор 5 кОм.

 

• Ручная установка опорного напряжения

Актуальна для измерения крайне малого напряжения   

Искажения при работе с аналоговыми входами появляются по причине того, что по дефолту за опорное напряжение принимается 5В, в то время как стабилизаторы напряжения на плате Arduino могут немного отклоняться от эталонного значения и выдавать к примеру 4.85В.   4.85 / 1024 = 0.0047 (при эталонном шаге в 0.0049)

В случае, если под рукой имеется точный мультиметр, то можно попросту замерить питающее напряжение и вбить его в расчет, который рассматривался выше. 

 

float Step = 4.85F / 1024; // Вычисляем шаг Uопорн / на градацию 

 

Использование аналоговых входов в качестве цифровых выводов

Аналоговые входы могут использоваться как цифровые порты входов/выходов рассмотренные в предыдущем уроке

Для этого, для UNO, в коде их нужно записывать как цифровые с 14 по 19. К примеру, для A0 

 

  // Инициализируем аналоговый pin 0 как выход
  pinMode(14, OUTPUT);
  // Инициализируем аналоговый pin 0 как вход   
  pinMode(14, INPUT);

 

Читать ранее:

•  Урок 1. Цифровые выводы


А как же комментарии?