CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

Arduino. Работа с АЦП. Подключение переменного резистора

Очень полезный модуль в составе микроконтроллера — аналого-цифровой преобразователь. Он позволяет микроконтроллеру измерять произвольное напряжение.
В прошлой статье мы описывали, как можно считать логическое состояние входа, то есть "0" или "1". Аналого-цифровой преобразователь считывает величину напряжения на выводах A0-A5. Это дает возможность считать данные с датчика освещенности, измерить напряжение питания и т.д.

Подготовка к работе

На нашем TutorShield для освоения работы с АЦП есть три переменных резистора. Для их подключения к выводам A0-A2 установите перемычке так, как показано на рисунке:

Подключение переменных резисторов

Подключение переменных резисторов

К выводу A0 подключен подстроечный резистор, расположенный в левом верхнем углу платы и у него есть удобная ручка. Два других меньше и подключены к выводам A1, A2.

Первый пример

Для начала попробуем просто считать напряжение на выводе микроконтроллера A0 и отправить его в COM-порт.
Делается это при помощи функции analogRead(). Этой функции нужно передать номер вывода, напряжение на котором должно быть измерено и она вернет текущее значение.
Загрузите на плату следующий пример:

int val;

void setup() {
    Serial.begin(9600);
}

void loop() {
    val = analogRead(A0);
    Serial.println(val);
    delay(1000);
}

В микроконтроллере Atmega8A, который используется на нашей плате EduBoard, есть модуль АЦП с разрешением 10 бит и возможностью мультиплексирования шести входов. Эти входы пронумерованы A0-A6 (или 14-19).
Измерение производится относительно напряжения питания. Ни в коем случае нельзя подавать на вход отрицательное напряжение или напряжение, превышающее питание! Мы подключили ко входу переменный резистор и наше входное напряжение точно не выйдет за рамки питания.
Теперь разберемся с тем, что нам будет присылать плата. Раз разрешение 10 бит — в десятичном виде значение будет меняться от 0 до 1023. Измерение производится относительно 5-ти вольт, поэтому изменение показаний на 1 соответствует фактическому напряжению 5/1023=4.9мВ. То есть средствами встроенного АЦП микроконтроллера можно измерить напряжение с точностью до 4.9мВ.
Вернемся к скетчу. В результате выполнения строчки …

val = analogRead(A0);

… в переменную val будет записано оцифрованное напряжение, считанное на выводе A0. Откройте монитор порта (Ctrl+Shift+M) и посмотрите, как меняются показания АЦП при вращении вала переменного резистора. Обратите внимание, что нет нужды настраивать вывод при этом на вход.
Теперь пора немного улучшить работу с модулем аналого-цифрового преобразователя. На практике младшие разряды АЦП могут сильно флуктуировать из-за шумов и их обычно отбрасывают, причем сразу два разряда. При этом остается 8ми-битное число с которым гораздо удобнее работать. Точность при этом получается 5/255=19.6мВ, чего вполне достаточно для большинства ситуаций.
Измените код так, чтобы он присылал 8ми-битное значение. Замените строку с чтением состояния АЦП на это:

val = analogRead(A0)>>2;

Теперь переменной val мы присваиваем значение считанное из АЦП сдвинутое на два бита вправо. Остальные биты просто отбрасываются.

Второй пример

Теперь мы можем плавно изменять яркость светодиода при помощи ШИМ-модуляции, задавая ее переменным резистором. Установите перемычку "color" так, как описано в этой статье. Этим самым вы подключены к 9му, 10му и 11му выводу сегменты трехцветного светодиода.
Для начала попробуем изменять яркость только одного светодиода:

#define BLUE 9

int val;

void setup() {
    pinMode(BLUE, OUTPUT);
}

void loop() {
    analogWrite(BLUE, (analogRead(A0)>>2));
}

Довольно простой код, если вы помните, как работает функция analogWrite(). При вращении вала переменного резистора светодиод будет менять свою яркость от минимума до максимума.
Кстати, если вы уберете сдвиг на два бита, при выполнении функции analogWrite() будет наступать переполнение, так как она может принимать только значения от 0 до 255. Попробуйте убрать этот сдвиг и посмотрите, что получится.
И в заключении добавим управление всеми тремя светодиодами. Остается только найти отвертку, чтобы покрутить двумя остальными подстроечными резисторами.

#define BLUE 9
#define ORANGE 10
#define GREEN 11

int val;

void setup() {
    pinMode(BLUE, OUTPUT);
    pinMode(ORANGE, OUTPUT);
    pinMode(GREEN, OUTPUT);
}

void loop() {
    analogWrite(BLUE, (analogRead(A0)>>2));
    analogWrite(ORANGE, (analogRead(A1)>>2));
    analogWrite(GREEN, (analogRead(A2)>>2));
}

Индивидуальные задания

  1. Оставьте на шилде только перемычку от резистора на выводе A0 и подключите пьезоизлучатель также, как этой статье. Напишите программу, которая будет изменять частоту воспроизводимого звука, в зависимости от установки положения резистора.
  2. Подключите сегментный индикатор, так как это было описано ранее и, используя примеры из той же статьи, сделайте простейший вольтметр. На индикатор должны выводится цифры от 0 до 5.0В (хоть на индикаторе нашего шилда и нет разрядной точки), совпадающие с крайними положениями резистора, подключенного к выводу А0.

Остальные статьи цикла можно найти здесь.

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , , , , , , Просмотров: 14900