===== Эксперимент 14. Измерение напряжения =====
В предыдущей статье мы узнали о том что такое аналого- цифровой преобразователь. Микроконтроллер, на базе которого работает наш электронный конструктор, имеет встроенный аналого- цифровой преобразователь. Попробуем им воспользоваться.
==== Подключение переменного резистора ====
На плате конструктора установлен переменный резистор.
Переменный резистор состоит из полукруглой пластины,
покрытой веществом, имеющим электрическое сопротивление,
и скользящего контакта с ручкой. У переменного резистора
три вывода — по концам пластины и скользящий контакт.
Сопротивление меняется в зависимости от длины отрезка
резистивной пластины от ее начала до скользящего контакта. Чем
больше этот путь, тем выше сопротивление.
{{ :products:esp-iot:varr.png?nolink |}}
//Рисунок 1. Переменный резистор. Внешний вид, устройство и условное обозначение//
Переменный резистор можно представить как схему из двух резисторов
{{ :products:esp-iot:varr.1.png?nolink |}}
==== Делитель напряжения ====
С помощью переменного резистора будем получать аналоговый сигнал.
Используем широко распространенную схему резисторного
делителя напряжения. Резисторный делитель — это два
последовательных участка цепи, называемых плечами, сумма
напряжений на которых равна напряжению питания. Плечо между
минусом питания и средней точкой называют нижним, а другое —
верхним.
{{ :products:esp-iot:varr.2.png?nolink |}}
Резисторный делитель используется для деления напряжения.
Например, если верхнее и нижнее плечи имеют одинаковые
сопротивления, то напряжение на средней точке делителя равно
половине напряжения питания. Такой делитель делит напряжение
на 2.
Подключим нижнее плечо с земле, а верхнее к напряжению питания. Тогда при вращении ручки переменного резистора на его средней точки напряжение будет изменяться от 0 до напряжения питания (3,3в в нашем конструкторе). Подключим среднюю точку ко входу аналого- цифрового преобразователя и будем измерять напряжение на ней.
==== Схема эксперимента ====
{{ :products:esp-iot:varr.3.png?nolink |}}
//Рисунок 2. Электрическая принципиальная схема эксперимента//
{{ :products:esp-iot:adcexp.png?direct&600 |}}
//Рисунок 3. Монтажная схема эксперимента//
==== Программный код эксперимента ====
#define ACD_PIN A0
int value = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
value = analogRead(ACD_PIN);
Serial.println(value);
delay(200);
}
В строке 1 мы задаем псевдоним ''ACD_PIN'' для номера канала АЦП. В нашем микроконтроллере только один канал и он имеет номер A0.
#define ACD_PIN A0
В строке 3 мы объявляем переменную ''value'' с новым для нас типом ''int'' и присваиваем ей значение ''0''. Переменные типа ''int'' могут хранить только целые числа в диапазоне
от -32 768 до 32 767.
int value = 0;
В строке 6 мы с помощью функции ''begin()'' включаем последовательный порт ''Serial'' микроконтроллера для отправки сообщений на компьютер. В качестве параметра функция ''begin()'' принимает число бод (число символов в секунду), определяющее скорость передачи сообщений.
Serial.begin(9600);
В цикле просим АЦП оцифровать текущее напряжение на его входе cпомощью функции ''analogRead()'' и записать полученное значение в переменную ''value''. Результатом является число в диапазоне от 0 до 1023.
value = analogRead(ACD_PIN);
После чего с помощью функции ''println()'' "печатаем" значение в последовательный порт ''Serial''.
Serial.println(value);
Чтобы увидеть "напечатанные" значения включите монитор порта, нажав соответствующую кнопку в правом верхнем углу Arduino IDE. [[products:laboratory_iot_c:arduino_ide_howto|Подробнее про монитор порта.]]
Задержка в строке 13 нужна для того, чтобы сообщения микроконтроллера не "печатались" слишком быстро.
delay(200);
Попробуй изменить значение задержки и посмотреть как изменится скорость вывода сообщений в монитор порта.
В принципе наша программа может обойтись без переменной ''value'', т.к. она только хранит считаное значение с АЦП, при этом изменения значения не происходит. Мы можем удалить строку 3 с объявлением переменной ''value'', а в бесконечном цикле сразу передавать полученное значение функции ''analogRead()'' в качестве аргумента в функцию печати ''Serial.println()''. В итоге тело бесконечной функции ''loop()'' будет выглядеть следующим образом.
Serial.println(analogRead(ACD_PIN));
delay(200)
* [[https://arduino.ru/Reference/Int|Подробнее о типе int в Arduino]]
* [[https://arduino.ru/Reference/Serial|Подробнее последовательном порте Serial в Arduino]]
==== Дополнительное задание ====
* Если наш АЦП при напряжении 0 вольт возвращает результат 0, а при 3.3 вольт — 1023, то какой результат преобразования будет при напряжении 1.65? А если напряжение 1 вольт ровно?
* Какое напряжение соответствует значению 785?