Аналоговый ввод/вывод
Рассмотрим функции аналогового ввода/вывода:
analogRead();
analogReference();
analogWrite().
Функция analogRead()
Функция считывает значение с указанного аналогового входа. Большинство плат Arduino имеют 6 каналов (8 каналов у платы Mini и Nano, 16 — у Mega) c 10-битным аналого-цифровым преобразователем (АЦП). Напряжение, поданное на аналоговый вход (обычно от 0 до 5 вольт), будет преобразовано в значение от 0 до 1023 — это 1024 шага с разрешением 0,0049 вольт. Разброс напряжения и шаг может быть изменен функцией analogReference(). Считывание значения с аналогового входа занимает примерно 100 микросекунд (0,0001 сек), т. е. максимальная частота считывания приблизительно 10 000 раз в секунду.
Синтаксис:
analogRead(pin);
Параметр: pin — номер порта аналогового входа, с которого будет производиться считывание: 0..5 для большинства плат, 0..7 для Mini и Nano и 0..15 для Mega.
Возвращаемое значение int (0 to 1023).
ЗАМЕЧАНИЕ
Если аналоговый вход не подключен, то значения, возвращаемые функцией analogRead(), могут принимать случайные значения.
Пример .
int analogPin = 3; // номер порта, к которому подключен потенциометр
int val = 0; // переменная для хранения считываемого значения
void setup()
{
Serial.begin(9600); // установка связи по serial
}
void loop()
{
val = analogRead(analogPin); // считываем значение
Serial.println(val); // выводим полученное значение
}
Функция analogReference()
Функция определяет опорное напряжение, относительно которого происходят аналоговые измерения. Функция analogRead() возвращает значение с разрешением 8 битов (1024) пропорционально входному напряжению на аналоговом входе и в зависимости от опорного напряжения.
Возможные настройки:
❒ DEFAULT — стандартное опорное напряжение 5 В (на платформах с напряжением питания 5 В) или 3,3 В (на платформах с напряжением питания 3,3 В);
❒ INTERNAL — встроенное опорное напряжение 1,1 В на микроконтроллерах ATmega168 и ATmega328 и 2,56 В на ATmega8;
❒ EXTERNAL — внешний источник опорного напряжения, подключенный к выводу AREF.
Синтаксис:
analogReference(type);
Параметр: type — определяет используемое опорное напряжение (DEFAULT, INTERNAL или EXTERNAL).
Внешнее напряжение рекомендуется подключать к выводу AREF через резистор 5 кОм.
Рекомендуемой настройкой для вывода AREF является EXTERNAL. При этом происходит отключение обоих внутренних источников, и внешнее напряжение будет являться опорным для АЦП.
Функция analogWrite()
Выдает аналоговую величину (ШИМ-волну) на порт входа/выхода. Функция может быть полезна для управления яркостью подключенного светодиода или скоростью вращения электродвигателя. После вызова analogWrite() на выходе будет генерироваться постоянная прямоугольная волна с заданной шириной импульса до следующего вызова analogWrite (или вызова digitalWrite или digitalRead на том же порту входа/выхода). Частота ШИМ-сигнала приблизительно 490 Гц.
На большинстве плат Arduino (на базе микроконтроллера ATmega168 или ATmega328) ШИМ поддерживают порты 3, 5, 6, 9, 10 и 11, на плате Arduino Mega — порты с 2 по 13. На более ранних версиях плат Arduino analogWrite() ра- ботал только на портах 9, 10 и 11.
Для вызова analogWrite() нет необходимости устанавливать тип входа/выхода функцией pinMode(). Функция analogWrite() никак не связана с аналоговыми входами и с функцией analogRead().
Синтаксис: analogWrite(pin, value);
Параметры:
❒ pin — порт входа/выхода, на который подается ШИМ-сигнал;
❒ value — период рабочего цикла: значение между 0 (полностью выключено) и 255 (сигнал подан постоянно).
ЗАМЕЧАНИЕ
Период ШИМ-сигнала на портах входа/выхода 5 и 6 будет несколько длиннее. Это связано с тем, что таймер для данных выходов также задействован функциями millis() и delay(). Данный эффект более заметен при установке коротких периодов ШИМ-сигнала (0–10).
Пример задания яркости светодиода пропорционально значению, снимаемому с потенциометра, представлен
int ledPin = 9; // Светодиод подключен к выходу 9
int analogPin = 3; // потенциометр подключен к выходу 3
int val = 0; // переменная для хранения значения
void setup()
{
pinMode(ledPin, OUTPUT); // установка порта на выход
}
void loop()
{
val = analogRead(analogPin); // считываем значение с порта,
// подключенного к потенциометру
analogWrite(ledPin, val / 4); // analogRead возвращает значения от 0
// до 1023, analogWrite должно быть
// в диапазоне от 0 до 255
}