Измерение напряжения батареи с помощью делителя напряжения
Я использую следующую схему для измерения емкости литий-ионного аккумулятора 3,7 В.
Рисунок 1 – Схема для батарей 3,7 В.
Эта настройка отлично работает для батарей 3,7 В.
Чтобы иметь возможность измерять батареи 9 В, я изменил схему с помощью делителя напряжения, чтобы Arduino видел максимум 5 В на аналоговом входе. Однако Arduino сообщает 0V. Я измерил выход делителя напряжения с помощью DMM, и он показывает 5 В. Интересно, почему Arduino не сообщает правильное напряжение. Не могли бы вы, пожалуйста, помочь мне это исправить?
Рисунок 2 – Измененная схема для батарей 9 В, которая не работает.
Мой код:
#include "LCD5110_Graph.h"
LCD5110 myGLCD(5, 6, 7, 9, 8); // Настройка экрана Nokia 5110 SCLK/CLK=5, DIN/MOSI/DATA=6, DC/CS=7, RST=9 Chip Select/CE/SCE=8,
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
#define gatePin 10
#define highPin A0
#define lowPin A1
boolean finished = false;
int printStart = 0;
int interval = 5000; // Интервал (мс) между измерениями
float mAh = 0.0;
float shuntRes = 1.0; // В Омах – Сопротивление шунтирующего резистора
float voltRef = 4.71; // Опорное напряжение
float current = 0.0;
float battVolt = 0.0;
float shuntVolt = 0.0;
float battLow = 2.9;
unsigned long previousMillis = 0;
unsigned long millisPassed = 0;
void setup()
{
Serial.begin(9600);
Serial.println("Battery Capacity Checker v1.1");
Serial.println("battVolt current mAh");
pinMode(gatePin, OUTPUT);
digitalWrite(gatePin, LOW);
myGLCD.InitLCD(); // инициализировать ЖК-дисплей с контрастностью по умолчанию 70
myGLCD.setContrast(68);
myGLCD.setFont(SmallFont); // Set default font size. tinyFont 4×6, smallFont 6×8, mediumNumber 12×16, bigNumbers 14×24
myGLCD.clrScr();
myGLCD.print("Battery", CENTER, 0);
myGLCD.print("Check", CENTER, 12);
myGLCD.print("Please Wait", CENTER, 24);
myGLCD.print("AdamWelch.Uk", 8, 40);
myGLCD.update();
delay(2000);
myGLCD.clrScr();
}
void loop()
{
battVolt = analogRead(highPin) * voltRef / 1024.0;
shuntVolt = analogRead(lowPin) * voltRef / 1024.0;
if (battVolt >= battLow && finished == false)
{
digitalWrite(gatePin, HIGH);
millisPassed = millis() – previousMillis;
current = (battVolt – shuntVolt) / shuntRes;
mAh = mAh + (current * 1000.0) * (millisPassed / 3600000.0);
previousMillis = millis();
myGLCD.clrScr();
myGLCD.print("Discharge", CENTER, 0);
myGLCD.print("Voltage:", 0, 10);
myGLCD.printNumF(battVolt, 2, 50, 10);
myGLCD.print("v", 77, 10);
myGLCD.print("Current:", 0, 20);
myGLCD.printNumF(current, 2, 50, 20);
myGLCD.print("a", 77, 20);
myGLCD.printNumI(mAh, 30, 30);
myGLCD.print("mAh", 65, 30);
myGLCD.print("Running", CENTER, 40);
myGLCD.update();
Serial.print(battVolt);
Serial.print("\t");
Serial.print(current);
Serial.print("\t");
Serial.println(mAh);
delay(interval);
}
if (battVolt < battLow)
{
digitalWrite(gatePin, LOW);
finished = true;
if (mAh < 10)
{
printStart = 40;
}
else if (mAh < 100)
{
printStart = 30;
}
else if (mAh < 1000)
{
printStart = 24;
}
else if (mAh < 10000)
{
printStart = 14;
}
else
{
printStart = 0;
}
myGLCD.clrScr();
myGLCD.print("Discharge", CENTER, 0);
myGLCD.print("Voltage:", 0, 10);
myGLCD.printNumF(battVolt, 2, 50, 10);
myGLCD.print("v", 77, 10);
myGLCD.setFont(MediumNumbers);
myGLCD.printNumI(mAh, printStart, 21);
myGLCD.setFont(SmallFont);
myGLCD.print("mAh", 65, 30);
myGLCD.print("Complete", CENTER, 40);
myGLCD.update();
delay(interval * 2);
}
}
Схема с модификациями
Рисунок 3 – Схема для батарей 9 В.
@Zaffresky, 👍1
Обсуждение1 ответ
Лучший ответ:
Проблема возникает из-за того, что вы питаете свою нагрузку через делитель напряжения, который вы используете для считывания напряжения батареи.
Вы не можете выполнять такое считывание тока на высокой стороне при напряжении выше напряжения АЦП. Вместо этого вам нужно выполнить измерение тока перед делителем напряжения, а затем снова разделить этот результат.
Ваша схема должна выглядеть примерно так:
Спасибо за объяснение. Я загрузил новую схему и надеюсь, что правильно включил ваше предложение. Не могли бы вы, пожалуйста, взглянуть? :), @Zaffresky
- Как считывать высокое напряжение (40-65В) с блока солнечных батарей
- Питание esp32cam от аккумулятора
- Могу ли я иметь резервное питание для устройства Arduino?
- Блок питания для Seeeduino Xiao
- Аккумуляторное решение Nano 33 IoT
- Как считывать напряжение с помощью ADS1115
- Питание 5В Arduino Pro Mini от 3,3В
- Энергопотребление esp32
Почему такие крошечные значения резисторов?, @Majenko
Извините, что это была неправильная схема. Я обновил сообщение правильным. Я полагаю, вы имели в виду резисторы делителя напряжения?, @Zaffresky
На самом деле, не обращайте на это внимания - я неправильно смотрел на резисторы. Самые маленькие - это датчик тока и нагрузки, а не разделитель батареи., @Majenko
Нагрузка 4,3 Ом на 9-вольтовую батарею потребляет 2 ампера???, @SBF
Да, это действительно высоко, поэтому я планирую использовать Rload = 10 Ом. Моя литий-ионная батарея с номинальным напряжением 9 В имеет максимальное напряжение 8 В, поэтому при общем сопротивлении 11 Ом ток будет ограничен примерно 819 мА. Так как резисторы могут занимать до 10 Вт, так что все должно быть в порядке ., @Zaffresky