Arduino.ru
Функция считывает значение с указанного аналогового входа. Большинство плат Arduino имеют 6 каналов (8 каналов у платы Mini и Nano, 16 у Mega) c 10-битным аналого-цифровым преобразователем (АЦП). Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Разброс напряжение и шаг может быть изменен функцией analogReference().
Считывание значение с аналогового входа занимает примерно 100 микросекунд (0.0001 сек), т.е. максимальная частота считывания приблизительно 10,000 раз в секунду.
Синтаксис
Параметры
pin: номер порта аналогового входа с которого будет производиться считывание (A0..A5 для большинства плат, 0..7 для Mini и Nano и 0..15 для Mega)
Arduino.ru
Доброго времени суток, совсем недавно начал изучать такую материю как «Ардуино» и пока смотрел ролики на ютубе все было крайне просто). Но обзавелся я Arduino uno и первой задачей себе поставил слепить вольтметр постоянного напряжения с выводом значений на дисплей, с этим я вполне справился докупив АЦП ADS1115 для пущей точности. Захотел расширить данное создание до измерения переменного напряжения до 5 В с точностью 1 % (было бы идеально) и понял что набрел на стену. Изучив всевозможные тематические форумы стало понятно что вопрос этот поднимается часто, но решения я не нашел. Пойдя по пути наименьшего сопротивления изначально попробовал использовать данную библиотеку со приложенным примером скетча, но ничего не вышло. Затем пошел по самому ожидаемому пути-использованию диодного моста и нашел данную схему:


Использовал следующий текст программы:
int Volt = A0; // Для входа переменного напряжения void setup() < pinMode(Volt, INPUT); Serial.begin(9600); >//Loop Function Start Here void loop() < int AcVolt = analogRead(Volt); // считывание аналогового входа float AcVoltOut = (AcVolt * (5.098 / 1023)); // преобразование в вольты Serial.println(AcVolt); // отображение в последовательном мониторе //lcd.setCursor(0,0); Serial.print("AC Voltage"); Serial.println(AcVoltOut); // отображение в последовательном мониторе значения в вольтах delay(100); >
Немного отредактировал приложенную к источнику скетч для вывода в серийный порт, а не на дисплей. И снова ничего не вышло. В диапазоне от 0-1 В показания серийного порта в области 0,300 В. С повышением переменного напряжения на выходе моста измеряемые значения не пропорционально растут и вблизи 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 // Подключаем библиотеку для чтения напряжения питания. // 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. >//
Ссылки:
- Библиотека iarduino_VCC.
- Wiki — Установка библиотек в Arduino IDE.
Arduino.ru
Функция определяет опорное напряжение относительно которого происходят аналоговые измерения. Функция analogRead() возвращает значение с разрешением 10 бит пропорционально входному напряжению на аналоговом входе, и в зависимости от опорного напряжения.
- DEFAULT: стандартное опорное напряжение 5 В (на платформах с напряжением питания 5 В) или 3.3 В (на платформах с напряжением питания 3.3 В)
- INTERNAL: встроенное опорное напряжение 1.1 В на микроконтроллерах ATmega168 и ATmega328, и 2.56 В на ATmega8.
- INTERNAL1V1: встроенное опорное напряжение 1.1 В (Arduino Mega)
- INTERNAL2V56: встроенное опорное напряжение 2.56 (Arduino Mega)
- EXTERNAL: внешний источник опорного напряжения, подключенный к выводу AREF
Синтаксис
analogReference(type)
Параметры
type: определяет используемое опорное напряжение (DEFAULT, INTERNAL или EXTERNAL).
Возвращаемое значение
Внимание
Внешнее напряжение рекомендуется подключать к выводу AREF через резистор 5 кОм.
Таким образом уменьшается риск повреждения микросхемы Atmega если настройки analogReference не совпадают с возможностями платформы. Однако при этом произойдет небольшая просадка напряжения, вследствие того, что имеется встроенный резистор 32 кОм, подключенный к выводу AREF. В этом случае оба резистора работают как делитель напряжения. Подсоединение внешнего резистора позволяет быстро переключаться на напряжение 3.3 В вывода AREF с напряжения 5 В DEFAULT без конфигурации аппаратной части и АЦП.
Использование вывода AREF
Напряжение, подключенное к выводу AREF, конвертируется АЦП и, затем, определяется значение напряжения, при котором АЦП выдает самое высокое цифровое значение, т.е 1023. Другие значения напряжения, поступающие в АЦП, конвертируются пропорционально. Таким образом, при настройке DEFAULT 5 В значение напряжения 2.5 В в АЦП будет конвертироваться в 512.
В стандартной конфигурации платформ Arduino вывод AREF (вывод 21 Atmega) не задействован. В этом случае при настройке DEFAULT к выводу подключается внутреннее напряжение AVCC. Соединение является низко-импедансным и любое напряжение подведенное к выводу в этот момент может повредить микросхему ATMEGA.
Настройкой INTERNAL к выводу AREF подключается внутреннее напряжение 1.1 В (или 2.56 микросхемы ATmega8). При этом напряжение соответствующее или превышающее 1.1 В будет конвертироваться АЦП в 1023. Другие значения напряжения конвертируются пропорционально.
Внутреннее подключение источника 1.1 В к выводу является высоко-импедансным, что означает, что для измерение напряжения на выводе может быть произведено только мультиметром с высоким сопротивлением. Ошибочное подключение напряжения к выводу AREF при этой настройке функции analogReference не повредит микросхему, но превысит значение 1.1 В. В этом случае АЦП будет конвертировать напряжение внешнего источника. Во избежание вышеописанных проблем настоятельно рекомендуется подключать внешнее напряжение через резистор 5 кОм.
Рекомендуемой настройкой для вывода AREF является EXTERNAL. При этом происходит отключение обоих внутренних источников, и внешнее напряжение будет являться опорным для АЦП.
Смотрите также
- analogRead()
- Аналоговые входы