Микроконтроллеры Atmega, используемые в Arduino, содержат шестиканальный
аналого-цифровой преобразователь (АЦП). Разрешение преобразователя составляет
10 бит, что позволяет на выходе АЦП получать значения от 0 до 1023. Основным
применением аналоговых входов большинства платформ Arduino является чтение
аналоговых датчиком, но в тоже время они имеют функциональность вводов/выводов
широкого применения (GPIO) (то же, что и цифровые порты ввода/вывода 0 - 13).
Поэтому, при необходимости применения дополнительных портов ввода/вывода имеется
возможность сконфигурировать неиспользуемые аналоговые входы.
На плате Arduino UNO R3 аналоговые пины имеют названия: A0-A5 (14 - 19).
Аналоговые входы могут использоваться как цифровые выводы.
Например, уже знакомая нам программа Blink, но со светодиодом подключенным
к выводу A0:
void setup() { pinMode(A0, OUTPUT); } void loop() { digitalWrite(A0, HIGH); delay(1000); // Wait for 1000 millisecond(s) digitalWrite(A0, LOW); delay(1000); // Wait for 1000 millisecond(s) }
void setup() { pinMode(14, OUTPUT); } void loop() { digitalWrite(14, HIGH); delay(1000); // Wait for 1000 millisecond(s) digitalWrite(14, LOW); delay(1000); // Wait for 1000 millisecond(s) }
Рассмотрим работу аналоговых портов как в режиме аналогового входа, т.е. если
мы запрограммируем аналоговый пин, например A0 как вход, то подавай на него
некоторое напряжение - то сможем получить его цифровое значение.
Считывание значение с аналогового входа занимает примерно 100 микросекунд
(0.0001 сек), т.е. максимальная частота считывания приблизительно 10,000 раз
в секунду.
Соберём следующую схему:
void setup() { Serial.begin (9600); pinMode(14, INPUT); } void loop() { int x; // вводим переменную x, типа int x = analogRead(14); // переменной x присваиваем значение считанной с ввода A0 (14) Serial.print(x); // выводим значение x в монитор порта Serial.println(""); delay(1000); // просто подождем секундочку :) }Запустив моделирование и устанавливая различные значения напряжения ан выходе источника питания мы будем видеть в мониторе порта различные значения:
void setup() { Serial.begin (9600); pinMode(14, INPUT); } void loop() { float x; // вводим переменную x, типа float (переменная с плавающей точкой) x = float (analogRead(14))/(1023/5); // делим считанное значение на (1023/5), и преобразуем в тип float Serial.print(x); // выводим измеренное напряжение в монитор порта Serial.println("V"); // выводим букву V, чтобы было понятно, что это напряжение delay(1000); // просто подождем секундочку :) }Попробуем теперь измерять напряжение на резисторном делителе напряжения:
void setup() { Serial.begin (9600); pinMode(14, INPUT); } void loop() { float x; // вводим переменную x, типа float (переменная с плавающей точкой) digitalWrite(14, HIGH); // !!!!!!!! x = float (analogRead(14))/(1023/5); // делим считанное значение на (1023/5), и преобразуем в тип float Serial.print(x); // выводим измеренное напряжение в монитор порта Serial.println("V"); // выводим букву V, чтобы было понятно, что это напряжение delay(1000); // просто подождем секундочку :) }то вольтметр опять начнет измерять!
digitalWrite(14, HIGH);Разброс напряжений и шаг может быть изменен функцией analogReference()
При этом, нужно помнить, что напряжение соответствующее или превышающее опорное
будет конвертироваться АЦП в 1023. Другие значения напряжения конвертируются
пропорционально.