Часто в проектах 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 / АЦП.
Библиотека версии 1.0.2 и выше поддерживает работу с платами Arduino UNO R4 напряжение внутреннего ИОН у которых не 1,1В, а 1,45В.
В действительности напряжение внутреннего ИОН микроконтроллеров Arduino может отличаться от заявленных на сотые и даже десятые доли. По этому в библиотеке имеются две дополнительные функции, позволяющие определить и указать точное напряжение внутреннего ИОН.
Основная функция библиотеки:
Функция analogRead_VCC();
- Назначение: Чтение напряжения питания Arduino.
- Синтаксис: analogRead_VCC();
- Параметры: Нет.
- Возвращаемые значения: float - Напряжение питания в Вольтах.
- Примечание:
- Точность показаний до десятых долей вольт, без использования дополнительных функций.
- Пример:
float i = analogRead_VCC(); // Читаем напряжение питания Arduino.
Дополнительные функции библиотеки:
Дополнительные функции библиотеки позволяют увеличить точность чтения напряжения питания Arduino до сотых долей вольт. Если такая точность не требуется, то дополнительными функциями можно не пользоваться.
Функция analogCalc_REF();
- Назначение: Расчёт напряжения внутреннего источника опорного напряжения (ИОН).
- Синтаксис: analogCalc_REF( Uпит );
- Параметры: float Uпит - Напряжение питания Arduino в Вольтах.
- Возвращаемые значения: float - Напряжение внутреннего ИОН в Вольтах.
- Примечание:
- Напряжение внутреннего ИОН используется при чтении напряжения питания Arduino.
- Напряжение внутреннего ИОН у разных микроконтроллеров может отличаться, даже у микроконтроллеров одной серии и одной партии.
- Для получения точного напряжения внутреннего ИОН нужно измерить текущее напряжение питания Arduino (вольтметром) и указать его в качестве параметра функции.
- Полученное напряжение внутреннего ИОН можно получить 1 раз и более не использовать функцию analogCalc_REF() в скетчах для данного микроконтроллера, а сразу указывать функцией analogSave_REF().
- В библиотеках версии < 1.0.2 функция analogCalc_REF() называлась analogCalc_1V1().
- Пример:
float i = analogCalc_REF( 5.07 ); // Определяем точное напряжение внутреннего ИОН микроконтроллера указав измеренное вольтметром напряжение питания Arduino.
Функция analogSave_REF();
- Назначение: Указание напряжения внутреннего ИОН микроконтроллера Arduino.
- Синтаксис: analogSave_REF( Uион );
- Параметры: float Uион - Напряжение внутреннего ИОН микроконтроллера Arduino.
- Возвращаемые значения: Нет.
- Примечание:
- Напряжение внутреннего ИОН используется при чтении напряжения питания Arduino.
- Если напряжение внутреннего ИОН не указано данной функцией, то оно принимается за 1,1 В или 1,45 В (зависит от платы Arduino для которой компилируется ваш скетч).
- Получить точное напряжение внутреннего ИОН можно функцией analogCalc_REF().
- Функцию достаточно вызвать 1 раз в коде setup().
- В библиотеках версии < 1.0.2 функция analogSave_REF() называлась analogSave_1V1().
- Пример:
void setup(){ // analogSave_REF( 1.125f ); // Указываем точное напряжение внутреннего ИОН микроконтроллера. } // void loop(){ // float i = analogRead_VCC(); // Читаем напряжение питания Arduino. } //
Обсуждение