почему плавает напряжение на аналоговом порту.
- Войдите на сайт для отправки комментариев
Сб, 20/06/2020 - 16:30
Помогите разобраться в чем проблема пож.
собрал 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);
}


Потому что у резисторов плавает сопротивление. Особенно у дешевых, не предназначенных для метрологии. Как и выход у дешевых китайских регуляторов напряжения.
Потому что АЦП измеряет сравнивая с опорным напряжением.
А у вас что им является?
я думал сравнивает с внутренним источником опорного напряжения.
1 что сделаю наверно заменю резисторы и конденсаторы, может керамические или пленочные поставлю маленькой емкости.
Что бы ни делать, лишь бы не учиться на чужом опыте, давно изложенном и систематизированном.
Я искал по поиску, похожих тем нет
я думал сравнивает с внутренним источником опорного напряжения.
Вы ошиблись. По умолчанию сравнивает с напряжением питания. Чтобы сравнивал с внутренним ИОН, это нужно явно прописать в коде, у Вас это не прописано.
Но с внутренним ИОН свои грабли. Во-первых он всего 1.1В, а во-вторых точность 10%. Правда воторое решаемо - можно замерить реальное напряжение у конкретного чипа и использовать, оно почти не плавает.
Ну, или (если не хочется до 1.1 опускаться) можно при каждом измерении, сначала измерять свое питание (через внутренний ИОН), а потом измерять напряжение от питания.
Сделайте как Вам удобнее.
Как я понял у вас несколько устройств. По одному на канал. Изменяется одинаково на всех?
Еще интересно - на сколько конкретно"плывет". На сколько изменилось через первую неделю, через вторую.
daniilguz, сама идея делать балансир на ардуино мягко говоря не очень хорошая. В простейшем варианте балансир состоит из управляемого стабилитрона tl431 и мощного транзистора, который рассеивает излишек энергии. Схем в инете полным полно.
Если уж делать на микроконтроллере, то есть смысл добавить монитор тока типа ina226, и получить на пару порядков более точные измерения. Попутно измеряя ток, мощность, и даже внутреннее сопротивление батареи.
Изменилось на 3 десятых начал балансировать на 13,9 вместо 13,6
Спасибо большое, буду вникать.
Спасибо посмотрю в сторону ina раз уже все собрано.