почему плавает напряжение на аналоговом порту.
- Войдите на сайт для отправки комментариев
Сб, 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 раз уже все собрано.