КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Узнаем напряжение питания Arduino

Часто в проектах 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.
}                                      // 

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями