Как преобразовать напряжение батареи в процент батареи на литий-ионной батарее 4,15 В в Arduino IDE?(Я делаю какой-то светодиодный индикатор батареи) - PullRequest
1 голос
/ 23 мая 2019

Я знаю, что разряд батареи на литий-ионном аккумуляторе 4,15 В не является линейным, поэтому я хотел бы иметь некоторое уравнение, которое я могу применить в своем коде, чтобы показать правильный процент заряда батареи.

Я не могу найти хороших ресурсов для этого в Arduino IDE. (Помогите с ссылкой, если у вас есть, ребята)

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Я работаю с этой таблицей:

4,2 вольт 100%
4,1 около 90%
4,0 около 80%
3,9 около 60%
3,8 около 40%
3,7 около 20%
3.6 пусто для практических целей.

Это означает, что если бы этот элемент упал до 60% емкости, напряжение упало бы до уровня ниже 3,9 вольт.

Таблица с немецкого сайта, так что, думаю, ссылка не поможет.

Edit: Я нашел эту английскую ссылку: Заряд батареи

1 голос
/ 26 мая 2019

На самом деле, вы не можете ничего сделать с нелинейным поведением, вам просто нужно измерить ваше максимальное и минимальное напряжения и рассчитать процент батареи на основе этого. Ниже я создал функцию, которая возвращает процент уровня заряда батареи. Не забудьте отредактировать battery_max и battery_min в зависимости от уровня напряжения батареи.

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

int battery_pin = A3;

float battery_read()
{
    //read battery voltage per %
    long sum = 0;                   // sum of samples taken
    float voltage = 0.0;            // calculated voltage
    float output = 0.0;             //output value
    const float battery_max = 4.20; //maximum voltage of battery
    const float battery_min = 3.0;  //minimum voltage of battery before shutdown

    for (int i = 0; i < 500; i++)
    {
        sum += analogRead(battery_pin);
        delayMicroseconds(1000);
    }
    // calculate the voltage
    voltage = sum / (float)500;
    // voltage = (voltage * 5.0) / 1023.0; //for default reference voltage
    voltage = (voltage * 1.1) / 1023.0; //for internal 1.1v reference
    //round value by two precision
    voltage = roundf(voltage * 100) / 100;
    Serial.print("voltage: ");
    Serial.println(voltage, 2);
    output = ((voltage - battery_min) / (battery_max - battery_min)) * 100;
    if (output < 100)
        return output;
    else
        return 100.0f;
}

void setup()
{
    analogReference(INTERNAL); //set reference voltage to internal
    Serial.begin(9600);
}

void loop()
{
    Serial.print("Battery Level: ");
    Serial.println(battery_read(), 2);
    delay(1000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...