почему плавает напряжение на аналоговом порту.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Помогите разобраться в чем проблема пож.

собрал 4 балансира для свинцовых батарей.

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

Через неделю работы напряжение начало читаться некорректно как будто бы поменялись сопротивления резисторов.

Поправил коэффициент пересчета. Через неделю опять поплыли показания.

в плечах резисторы 4,7  и 10 кОм. конденсаторы 47 мФд 65 вольт.



// These constants won't change. They're used to give names to the pins used:
const int analogInPin = A3;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 3; // Analog output pin that the LED is attached to
const float  k = 0.0;
float sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // read the analog in value:
 for (int i=0; i<100; i++)
 {if (i==0) {sensorValue=0;}
//    delay(5);
  sensorValue = sensorValue + analogRead(analogInPin);}
//  sensorValue = sensorValue*0.05;
// sensorValue = (sensorValue*0.01)+k;
  sensorValue = (sensorValue*0.0158350*0.01)+k;
  
  // map it to the range of the analog out:
//  outputValue <= map(sensorValue, 0, 1023, 0, 255);
if (sensorValue<=13.6                      ){outputValue = 0;}
if (sensorValue>=13.6  && sensorValue<13.7 ){outputValue = 50;}
if (sensorValue>=13.7  && sensorValue<13.8 ){outputValue = 100;}
if (sensorValue>=13.8  && sensorValue<13.85){outputValue = 150;}
if (sensorValue>=13.85 && sensorValue<13.9 ){outputValue = 200;}
if (sensorValue>=13.9                      ){outputValue = 250;}


//   change the analog out value:
  analogWrite(analogOutPin, outputValue);

  // print the results to the Serial Monitor:
  Serial.print("sensor = ");
 Serial.print(sensorValue);
  Serial.print("\t output = ");
  Serial.print(outputValue);
  Serial.println ("  0.0158350");
  
//
//  // wait 2 milliseconds before the next loop for the analog-to-digital
//  // converter to settle after the last reading:
//  delay(1000);
}

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Потому что у резисторов плавает сопротивление. Особенно у дешевых, не предназначенных для метрологии. Как и выход у дешевых китайских регуляторов напряжения.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Потому что АЦП измеряет сравнивая с опорным напряжением.
А у вас что им является?

daniilguz
Offline
Зарегистрирован: 13.01.2020

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

1 что сделаю наверно заменю резисторы и конденсаторы, может керамические или пленочные поставлю маленькой емкости.

rkit
Offline
Зарегистрирован: 23.11.2016

Что бы ни делать, лишь бы не учиться на чужом опыте, давно изложенном и систематизированном.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Я искал по поиску, похожих тем нет

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

daniilguz пишет:

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

Вы ошиблись. По умолчанию сравнивает с напряжением питания. Чтобы сравнивал с внутренним ИОН, это нужно явно прописать в коде, у Вас это не прописано.

Но с внутренним ИОН свои грабли. Во-первых он всего 1.1В, а во-вторых точность 10%. Правда воторое решаемо - можно замерить реальное напряжение у конкретного чипа и использовать, оно почти не плавает.

Ну, или (если не хочется до 1.1 опускаться) можно при каждом измерении, сначала измерять свое питание (через внутренний ИОН), а потом измерять напряжение от питания.

Сделайте как Вам удобнее.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Как я понял у вас несколько устройств. По одному на канал. Изменяется одинаково на всех?

Еще интересно - на сколько конкретно"плывет". На сколько изменилось через первую неделю, через вторую.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

daniilguz, сама идея делать балансир на ардуино мягко говоря не  очень хорошая.  В простейшем варианте балансир состоит из управляемого стабилитрона tl431 и мощного транзистора, который рассеивает излишек энергии. Схем в инете полным полно.

Если уж делать на микроконтроллере, то есть смысл добавить монитор тока типа ina226, и получить на пару порядков  более точные измерения. Попутно измеряя ток, мощность, и даже внутреннее сопротивление батареи.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Изменилось на 3 десятых начал балансировать на 13,9 вместо 13,6

daniilguz
Offline
Зарегистрирован: 13.01.2020

Спасибо большое, буду вникать.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Спасибо посмотрю в сторону ina раз уже все собрано.