Микроконтроллеры 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); // просто подождем секундочку :)
}
Запустив моделирование и смещая ползунок переключателя влево, мы будем видеть в мониторе
порта значение 1023, а смещяая его вправо - 0.
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. Другие значения напряжения конвертируются
пропорционально.