Измерение напряжения батареи с помощью делителя напряжения

battery voltage-divider

Я использую следующую схему для измерения емкости литий-ионного аккумулятора 3,7 В.

Setup for 3.7V Batteries

Рисунок 1 – Схема для батарей 3,7 В.

Эта настройка отлично работает для батарей 3,7 В.

Чтобы иметь возможность измерять батареи 9 В, я изменил схему с помощью делителя напряжения, чтобы Arduino видел максимум 5 В на аналоговом входе. Однако Arduino сообщает 0V. Я измерил выход делителя напряжения с помощью DMM, и он показывает 5 В. Интересно, почему Arduino не сообщает правильное напряжение. Не могли бы вы, пожалуйста, помочь мне это исправить?

Modified schematic for 9 V batteries which doesn't work

Рисунок 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);
    }
}

Схема с модификациями

Schematic for 9 V Batteries

Рисунок 3 – Схема для батарей 9 В.

, 👍1

Обсуждение

Почему такие крошечные значения резисторов?, @Majenko

Извините, что это была неправильная схема. Я обновил сообщение правильным. Я полагаю, вы имели в виду резисторы делителя напряжения?, @Zaffresky

На самом деле, не обращайте на это внимания - я неправильно смотрел на резисторы. Самые маленькие - это датчик тока и нагрузки, а не разделитель батареи., @Majenko

Нагрузка 4,3 Ом на 9-вольтовую батарею потребляет 2 ампера???, @SBF

Да, это действительно высоко, поэтому я планирую использовать Rload = 10 Ом. Моя литий-ионная батарея с номинальным напряжением 9 В имеет максимальное напряжение 8 В, поэтому при общем сопротивлении 11 Ом ток будет ограничен примерно 819 мА. Так как резисторы могут занимать до 10 Вт, так что все должно быть в порядке ., @Zaffresky


1 ответ


Лучший ответ:

3

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

Вы не можете выполнять такое считывание тока на высокой стороне при напряжении выше напряжения АЦП. Вместо этого вам нужно выполнить измерение тока перед делителем напряжения, а затем снова разделить этот результат.

Ваша схема должна выглядеть примерно так:

schematic

,

Спасибо за объяснение. Я загрузил новую схему и надеюсь, что правильно включил ваше предложение. Не могли бы вы, пожалуйста, взглянуть? :), @Zaffresky