КОРЗИНА
магазина
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 / АЦП.

В действительности напряжение ИОН 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.
}                                      // 

Ссылки:




Обсуждение

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