Часто в проектах c Arduino необходимо получать аналоговые значения с различных аналоговых датчиков, при этом, в большинстве случаев, источники внешнего опорного напряжения для АЦП не используются.
Мы просто читаем значение АЦП функцией analogRead( ВЫВОД )
, получаем число от 0 до 1023, которое преобразуем в напряжение по формуле: U = analogRead( ВЫВОД ) * 5.0 / 1023
где 5.0 - это напряжение питания Arduino в Вольтах, а 1023 - это максимальное значение АЦП.
Ошибки при чтении аналоговых значений:
Если в проекте используются только слаботочные модули или раздельное питание, то все аналоговые данные будут актуальны. Но если имеются модули потребляющие значительные токи (моторы, сервоприводы, соленоиды, осветительные приборы и т.д.) и они подключены к питанию Arduino, то это питание может снизится, и полученные аналоговые данные будут некорректны.
- Пример:
- На аналоговом входе 2.0 В, питание 5.0 В, функция
analogRead()
вернёт значение 409. - На аналоговом входе 2.0 В, питание 4.5 В, функция
analogRead()
вернёт значение 455. - Используя формулу
U = analogRead( ВЫВОД ) * 5.0 / 1023
, мы получим: - в первом случае: U = 409 * 5.0 / 1023 = 2,0 В. - Верно.
- во втором случае: U = 455 * 5.0 / 1023 = 2,2 В. - Ошибка.
- Но если нам известно реальное напряжение питания (Uпит), которое мы будем указывать в формуле пересчёта
U = analogRead( ВЫВОД ) * Uпит / 1023
, то получим:- в первом случае: U = 409 * 5.0 / 1023 = 2,0 В. - Верно.
- во втором случае: U = 455 * 4.5 / 1023 = 2,0 В. - Верно.
Значит для исключения ошибки при чтении напряжений с аналоговых входов, нужно точно знать напряжение питания Arduino.
Контроль за напряжением питания Arduino:
Многие Arduino проекты являются портативными, источником питания которых являются аккумуляторы с DC-DC преобразователями.
Напряжение аккумулятора уменьшается по мере его разряда и DC-DC преобразователь увеличивает потребляемый ток для поддержания стабильного напряжения на выходе. Но рано или поздно, напряжение на выходе DC-DC преобразователя так же начнёт снижаться. Если в схеме питания не предусмотрено отключение при снижении напряжения ниже определённого порога (≈4В), это может привести к нестабильной работе Arduino с непредсказуемым результатом.
Таких последствий можно избежать, если в коде Arduino постоянно контролировать напряжение питания и, например, уходить в спящий режим при снижении питания ниже 4,5 В.
Чтение напряжения питания Arduino:
Для чтения напряжения питания Arduino достаточно подключить разработанную нами библиотеку iarduino_VCC. После чего вам будет доступна функция analogRead_VCC()
, возвращающая напряжение питания в вольтах.
Библиотека не требует создания объектов, подключения внешних деталей, делителей, модулей и т.д. Она не использует ни одного вывода Arduino. Просто у вас появится возможность получать напряжение питания Arduino функцией analogRead_VCC()
.
#include <iarduino_VCC.h> // Подключаем библиотеку для чтения напряжения питания. // void setup(){ // Serial.begin(9600); // Инициируем передачу данных по шине UART на скорости 9600 бит/сек. } // // void loop(){ // float i = analogRead_VCC(); // Читаем напряжение питания Arduino. Serial.println( i ); // Выводим напряжение питания Arduino. delay(1000); // } //
После загрузки данного скетча, в монитор последовательного порта будет выводиться напряжение питания Arduino. Если Arduino получает питание от компьютера по USB кабелю, то указанное напряжение равно напряжению USB порта вашего компьютера.
Принцип работы:
В микроконтроллерах плат Arduino UNO, Mini, Nano, Mega ..., всего один блок АЦП и он может подключаться к любому аналоговому входу. Обращаясь к функции analogRead( ВЫВОД )
, она переключает вход АЦП на указанный вывод, запускает преобразование АЦП и возвращает результат.
Как видно из схемы, вход АЦП может подключаться не только к аналоговым входам, но и к встроенному в микроконтроллер датчику температуры, выводу GND или внутреннему источнику опорного напряжения (ИОН).
Функция analogRead_VCC()
переключает вход АЦП на выход ИОН 1V1, а источником опорного напряжения для АЦП выбирает напряжение питания Uпит. Получается что функция читает напряжение ИОН 1V1, которое заведомо известно Uион = 1,1В. Следовательно по показаниям АЦП можно выяснить точное значение напряжения питания Uпит = Uион * 1023 / АЦП.
В действительности напряжение ИОН 1V1 микроконтроллеров Arduino может отличаться от заявленных 1,1 В на сотые доли. По этому в библиотеке имеются две дополнительные функции, позволяющие определить и указать точное напряжение ИОН 1V1.
Основная функция библиотеки:
Функция analogRead_VCC();
- Назначение: Чтение напряжения питания Arduino.
- Синтаксис: analogRead_VCC();
- Параметры: Нет.
- Возвращаемые значения: float - Напряжение питания в Вольтах.
- Примечание:
- Точность показаний до десятых долей вольт, без использования дополнительных функций.
- Пример:
float i = analogRead_VCC(); // Читаем напряжение питания Arduino.
Дополнительные функции библиотеки:
Дополнительные функции библиотеки позволяют увеличить точность чтения напряжения питания Arduino до сотых долей вольт. Если такая точность не требуется, то дополнительными функциями можно не пользоваться.
Функция analogCalc_1V1();
- Назначение: Определение точного напряжения источника опорного напряжения (ИОН) 1V1.
- Синтаксис: analogCalc_1V1( Uпит );
- Параметры: float Uпит - Напряжение питания Arduino в Вольтах.
- Возвращаемые значения: float - Напряжение ИОН в Вольтах.
- Примечание:
- Напряжение ИОН 1V1 используется при чтении напряжения питания Arduino.
- Напряжение ИОН 1V1 у разных микроконтроллеров может отличаться от 1,1 В.
- Точное напряжение ИОН 1V1 микроконтроллера достаточно определить 1 раз.
- Для получения точного напряжения ИОН 1V1 нужно измерить текущее напряжение питания Arduino (вольтметром) и указать его в качестве единственного параметра функции.
- Полученное напряжение ИОН 1V1 справедливо только для того микроконтроллера, для которого оно было получено. Его можно более не определять, а только указывать функцией analogSave_1V1().
- Пример:
float i = analogCalc_1V1( 5.07 ); // Определяем точное напряжение ИОН 1V1 микроконтроллера указав измеренное вольтметром напряжение питания Arduino.
Функция analogSave_1V1();
- Назначение: Указание точного напряжения ИОН 1V1 микроконтроллера Arduino.
- Синтаксис: analogSave_1V1( Uион );
- Параметры: float Uион - Напряжение ИОН 1V1 микроконтроллера Arduino.
- Возвращаемые значения: Нет.
- Примечание:
- Напряжение ИОН 1V1 используется при чтении напряжения питания Arduino.
- Если напряжение ИОН 1V1 не указано данной функцией, то оно принимается за 1,1 В.
- Получить точное напряжение ИОН 1V1 можно функцией analogCalc_1V1().
- Функцию достаточно вызвать 1 раз в коде setup().
- Пример:
void setup(){ // analogSave_1V1( 1.125f ); // Указываем точное напряжение ИОН 1V1 микроконтроллера. } // void loop(){ // float i = analogRead_VCC(); // Читаем напряжение питания Arduino. } //
Обсуждение