===== Эксперимент 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?