Разные данные при подключении Arduino UNO R3 через USB/Внешнее питание

TheVampire
TheVampire аватар
Offline
Зарегистрирован: 23.11.2013

Доброго времени суток.

Делаю проект по колесному роботу на базе роутера TP-Link MR-3020 и Arduino UNO R3.

Для питания использовал Li Po Rider Pro. Выход с него идет в 5V и идет на Vin Arduino.

Плюс аккумулятора ( до  li po rider'a ) идет на A0 Arduino (для считывания заряда).

AnalogReference стоит в DEFAULT.

При подключении через USB все работает как надо. При отключении USB и питании с li po rider'a идут другие данные с A0.

От чего такое может быть ?

com
Offline
Зарегистрирован: 06.09.2013

судя по вашему описанию, плюс зарядника у вас подан на А0. так и задумывалось? и что вы считываете?

TheVampire
TheVampire аватар
Offline
Зарегистрирован: 23.11.2013

+ не с зарядника, а с аккумулятора ( одна банка LiPo ).

При подключенном USB - выдает напряжение на аккумуляторе ( 3,89 ). Если отключени и считать через UART на роутере - 4,67

maksim
Offline
Зарегистрирован: 12.02.2012

TheVampire пишет:

От чего такое может быть ?

Вы читали это analogReference()

В стандартной конфигурации платформ Arduino вывод AREF (вывод 21 Atmega) не задействован. В этом случае при настройке DEFAULT к выводу подключается внутреннее напряжение AVCC.

Что означает что вывод AREF подключен к питанию МК.

Напряжение, подключенное к выводу AREF, конвертируется АЦП и, затем, определяется значение напряжения, при котором АЦП выдает самое высокое цифровое значение, т.е 1023. Другие значения напряжения, поступающие в АЦП, конвертируются пропорционально. Таким образом, при настройке DEFAULT 5 В значение напряжения 2.5 В в АЦП будет конвертироваться в 512.

Это означает что напряжение на аналоговых входах измеряется относительно питания МК.

После того как дуина у вас начинает питаться не от УСБ (где 5 вольт), а от от того же аккумулятора, на котором вы и пытаетесь померить напряжение что вы фактически пытаетесь сделать? Правильно, это.

Есть два варианта решения этой задачи:

1. Мерить напряжение на самом МК, что реализовано аппаратно.
2. Настраивать AREF на внутренний источник (INTERNAL) и ставить делитель напряжения в цепь аккумулятора.

TheVampire
TheVampire аватар
Offline
Зарегистрирован: 23.11.2013

Ок, спасибо.

Разобрался.

В итоге, быть может кому интересно будет: 

отсюда взял код readVcc и далее для получения верного значения:

int val = analogRead(A0);
float Vcc = (float)readVcc()*1000.0;
float valf = ((float)val/1024.0)*Vcc;