Измерение напряжения через делитель

AntonM
Offline
Зарегистрирован: 22.10.2015

Всем Доброго Времени суток!

В рамках проекта имею часть программы - простенькая задача измерения напряжения на аккумуляторе 12В. Напряжение от аккумулятора подается на делитель на двух резисторах - 5.1 кОм и 10 кОм, затем подается на аналоговый порт А0 Ардуинки. Затем значение с АЦП переводим в шестнадцатиричную систему и посылаем по UDP на сервер.

В итоге, на делителе при напряжении аккумулятора 12 В на делителе имеем 4.01 В. А на сервер приходит почему-то 3ff, что на десятичной - 1023. Идет зашкал. Вырезку из программы представил ниже.

 

Посоветуйте пожалуйста, куда копать?

Заранее спасибо! 

 

01int analogInput = 0;                                      // объявляем пин для аккума
02 
03void setup() {
04pinMode(analogInput, INPUT);
05}
06 
07void loop() {
08       String batchar=String(analogRead(analogInput),HEX);
09       Serial.println("BC"+batchar);
10}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

99.9% за то, что ты перепутал резисторы. Нарисуй, а лучше сфотографируй то, что сделал.

Если сразу не сообразишь - положи фотку сюда.

(вставить картинку, выбор на сервере, загрузить)

AntonM
Offline
Зарегистрирован: 22.10.2015

Ну вы уж меня не за того держите =)))

Пожалуйста, измерение между "нулем" и А0.

a5021
Offline
Зарегистрирован: 07.07.2013

От какой опоры делает прербразование ардуина?

AntonM
Offline
Зарегистрирован: 22.10.2015

Ну вообще AREF висит в воздухе. А зачем оно, если analogReference() не применяется?

SLKH
Offline
Зарегистрирован: 17.08.2015

AntonM пишет:

Ну вообще AREF висит в воздухе. А зачем оно, если analogReference() не применяется?

тем не менее...

подай на вход 0,5 - 2 вольта с какого-нибудь потенциометра.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А если на A1 поправить, была у меня nano моросила по A0

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И строку 4 выбросьте. Не думаю, чтобы мешала, но не помогает точно.

AntonM
Offline
Зарегистрирован: 22.10.2015

ЕвгенийП пишет:

И строку 4 выбросьте. Не думаю, чтобы мешала, но не помогает точно.

 

 

Это не помогло, увы

 

SLKH пишет:

AntonM пишет:

Ну вообще AREF висит в воздухе. А зачем оно, если analogReference() не применяется?

тем не менее...

подай на вход 0,5 - 2 вольта с какого-нибудь потенциометра.

Ради интереса, подал 5 В с dc-dc преобразователя и - о чудо, он выдал 382! Очень странная логика замера у Ардуино, очень....

 

SLKH
Offline
Зарегистрирован: 17.08.2015

AntonM пишет:

Ради интереса, подал 5 В с dc-dc преобразователя и - о чудо, он выдал 382! Очень странная логика замера у Ардуино, очень....

 

Странная логика - это когда на вход АЦП подают неизвестно что (а импульсные преобразователи именно это и выдают).

1. подай на вход 0,5 - 2 вольта с какого-нибудь потенциометра/делителя, прицепленного к 5в или 3,3в ардуины. хотя бы свой делитель вместо аккумулятора перецепи на ардуину.

2. отправь в сериал результат int analogRead без предварительных извращений со строками.

3. попробуй то же на других аналоговых входах.

Добавлено: измерь сопротивления резисторов своего делителя.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

SLKH, дополню. Если после подачи собственной напруги через делитель на А0 обнаружится фигня, то порт не рабочий. У меня такая же фигня (видимо непропай лапки в МК) на А3 у одной из нанок. Что хошь подавай, на выходе имеем все что угодно, кроме настоящих значений. При этом все остальные ноги работают как надо.

a5021
Offline
Зарегистрирован: 07.07.2013

AntonM пишет:
Ну вообще AREF висит в воздухе. А зачем оно, если analogReference() не применяется?

А невозможно отсюда судить о том, что у вас применяется, а что нет, т.к. "иллюстрирующий" код вы писали явно "от фонаря". Об этом свидетельствует хотя бы

pinMode(analogInput, INPUT);

и

analogRead(analogInput)

Вы в курсе, что эти две функции выполняют действия с разными пинами?

ВН
Offline
Зарегистрирован: 25.02.2016

раз тут такая бестолковая задача, может напряжение питание проца  стоит измерить ?

AntonM
Offline
Зарегистрирован: 22.10.2015

a5021 пишет:

AntonM пишет:
Ну вообще AREF висит в воздухе. А зачем оно, если analogReference() не применяется?

А невозможно отсюда судить о том, что у вас применяется, а что нет, т.к. "иллюстрирующий" код вы писали явно "от фонаря". Об этом свидетельствует хотя бы

pinMode(analogInput, INPUT);

и

analogRead(analogInput)

Вы в курсе, что эти две функции выполняют действия с разными пинами?

 

Эту ошибку я понимаю. А все-таки, в некоторых примерах ПинМод присутствует... Например тут - http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:%D1%81%D0%B2%D0%B5%D1%82%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA-%D1%81-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%D0%BE%D0%B9-%D1%8F%D1%80%D0%BA%D0%BE%D1%81%D1%82%D1%8C%D1%8E.

Насчёт наскоро накиданного исходника - вот вам вырезки из него.

01#include <Wire.h>
02#include <SoftwareSerial.h>
03 
04<...>
05 
06 
07SoftwareSerial dbgSerial(3, 2); /* RX:D3, TX:D2 */      // объявляем пины для UART
08char inputString[5];                                    // объявляем массив для приёма
09int n, receive;
10char inChar;
11 
12int i, z=0;                                             // повторение посылки если не принято ничего
13int z0, z10 ;
14String logger[10];
15 
16const int analogInput = 0;                              // объявляем пин для аккума
17 
18void setup() {
19<...>
20}
21 
22 
23String addZeroes(const String& src, byte pad)
24{
25 if(src.length() >= pad)
26 return src;
27 
28String result;
29 byte add = pad - src.length();
30while(add--)
31 result += "0";
32 
33result += src;
34return result;
35}
36 
37void loop() {
38String time_ev0=String(time_ev,HEX);                    // добавление нулей к времени пересечения
39String str = addZeroes(time_ev0,8); //
40 
41}
42 
43<...>
44 
45void serialEvent() {
46if (Serial.available()) { // если есть принятый символ,
47receive = Serial.read(); // то читаем его и сохраняем в val
48if (receive == 'B') { // если принят символ 'B' (Battery)...
49String z10=String(z, DEC);
50String z0=addZeroes(z10,3);
51String batchar=String(analogRead(analogInput),HEX);
52String batchar0=addZeroes(batchar,8);
53Serial.println("BC"+batchar0);
54}
55<...>
56}

Теперь вопрос - сейчас у меня нет "AnalogReference", но на пин AREF подается 5В. Посылки более менее нормальные (приходит 820, 822, 825), но иногда проскакивают нереальные значения (только что например, 401 и 425). Вопрос - откуда? И как правильно вообще устроить измерение напряжения с делителя?

При этом, при отключении питания с AREF и присваивании "AnalogReference(DEFAULT)" измеритель уходит в зашкал (прилетает 1023).

SLKH
Offline
Зарегистрирован: 17.08.2015

AntonM пишет:

 

Теперь вопрос - сейчас у меня нет "AnalogReference", но на пин AREF подается 5В. Посылки более менее нормальные (приходит 820, 822, 825), но иногда проскакивают нереальные значения (только что например, 401 и 425). Вопрос - откуда? И как правильно вообще устроить измерение напряжения с делителя?

При этом, при отключении питания с AREF и присваивании "AnalogReference(DEFAULT)" измеритель уходит в зашкал (прилетает 1023).

С этим стоит обратиться к Клапауцию. А он уже пошлет, куда следует.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Подавать на аналоговый вход напряжение выше напряжения питания не стоит

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

SLKH, дополню. Если после подачи собственной напруги через делитель на А0 обнаружится фигня, то порт не рабочий. У меня такая же фигня (видимо непропай лапки в МК) на А3 у одной из нанок. Что хошь подавай, на выходе имеем все что угодно, кроме настоящих значений. При этом все остальные ноги работают как надо.

Так предлагал товарисчу это, молчит... у меня кстати тоже такое было...

AntonM
Offline
Зарегистрирован: 22.10.2015

ua6em пишет:

Arhat109-2 пишет:

SLKH, дополню. Если после подачи собственной напруги через делитель на А0 обнаружится фигня, то порт не рабочий. У меня такая же фигня (видимо непропай лапки в МК) на А3 у одной из нанок. Что хошь подавай, на выходе имеем все что угодно, кроме настоящих значений. При этом все остальные ноги работают как надо.

Так предлагал товарисчу это, молчит... у меня кстати тоже такое было...

К сожалению не имею возможности - плата уже разведена...

ua6em пишет:

Подавать на аналоговый вход напряжение выше напряжения питания не стоит

Так я и не подаю!

Uпит = 5 В

Uдел <= 4.1 В

 

renoshnik
Offline
Зарегистрирован: 11.04.2013

1 - какое значение Vcc ?  (может оно 4.1В, тогда все правильно выдает)

2 - поставь "делай" в "лупе"...  (мне такое когда-то помогло с глюками при измерении напряжения)

AntonM
Offline
Зарегистрирован: 22.10.2015

1. 5.01-5.09 В (идет с DC-DC преобразователя)

2. Спасибо за совет! Вечером попробую

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AntonM пишет:

ua6em пишет:

Arhat109-2 пишет:

SLKH, дополню. Если после подачи собственной напруги через делитель на А0 обнаружится фигня, то порт не рабочий. У меня такая же фигня (видимо непропай лапки в МК) на А3 у одной из нанок. Что хошь подавай, на выходе имеем все что угодно, кроме настоящих значений. При этом все остальные ноги работают как надо.

Так предлагал товарисчу это, молчит... у меня кстати тоже такое было...

К сожалению не имею возможности - плата уже разведена...

ua6em пишет:

Подавать на аналоговый вход напряжение выше напряжения питания не стоит

Так я и не подаю!

Uпит = 5 В

Uдел <= 4.1 В

 

14,5 *5,1 /15.1 = 4,8973

AntonM
Offline
Зарегистрирован: 22.10.2015

ua6em пишет:

14,5 *5,1 /15.1 = 4,8973

Откуда вы взяли значение 14.5В? =)

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AntonM пишет:

ua6em пишет:

14,5 *5,1 /15.1 = 4,8973

Откуда вы взяли значение 14.5В? =)

 

Напряжение на полностью заряженном свинцовом аккумуляторе с загущенным электролитом 14.5 вольта

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

Подавать на аналоговый вход напряжение выше напряжения питания не стоит

Тыкать что попало в AREF - тоже. 

И врать нехорошо:

1. "... AREF висит в воздухе."

2.  "...на пин AREF подается 5В."

AntonM
Offline
Зарегистрирован: 22.10.2015

ua6em пишет:

Напряжение на полностью заряженном свинцовом аккумуляторе с загущенным электролитом 14.5 вольта

Я специально довел до 12 вольт его сейчас для эксперимента.

AntonM
Offline
Зарегистрирован: 22.10.2015

SLKH пишет:

И врать нехорошо:

1. "... AREF висит в воздухе."

2.  "...на пин AREF подается 5В."

Уважаемый, я пробую разные комбинации. Пробую и так и так.

И навесить паяльником перемычку на свободный пин для меня не проблема.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AntonM пишет:

ua6em пишет:

Напряжение на полностью заряженном свинцовом аккумуляторе с загущенным электролитом 14.5 вольта

Я специально довел до 12 вольт его сейчас для эксперимента.

в разряженном аккумуляторе кислота внутри пластин, сожрёт )))

Индийские допускали разряд на одну банку до 1.7 вольта, другие 1.8

AntonM
Offline
Зарегистрирован: 22.10.2015

Arhat109-2 пишет:

SLKH, дополню. Если после подачи собственной напруги через делитель на А0 обнаружится фигня, то порт не рабочий. У меня такая же фигня (видимо непропай лапки в МК) на А3 у одной из нанок. Что хошь подавай, на выходе имеем все что угодно, кроме настоящих значений. При этом все остальные ноги работают как надо.

Все же попробовал ваше решение, хоть и пришлось всё нафиг разобрать, перекинул всё на А3 - и о чудо, приходят верные значения! Спасибо вам большое!