Подписаться YouTube

Как измерить уровень заряда аккумулятора. WeMos, Arduino, ESP8266

В этом видео речь пойдет про то, как измерить уровень заряда аккумулятора. Т.е. как получить процент заряда аккумулятора, зная напряжение на его клеммах.

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

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

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

В качестве примера буду использовать литий-ионный аккумулятор 18650 и АЦП преобразователь на WeMos D1 mini такое сочетание является довольно распространенным. Но при желании полученные здесь данные и методики измерения можно будет использовать и для других схем.

Мой испытательный стенд будет выглядеть вот так.

испытательный стенд

На этой схеме у меня есть микроконтроллер WeMos D1 mini. Он будет считывать информацию, и записывать ее для дальнейшей обработки.

Литий-ионный аккумулятор 18650.

Повышающий DC-DC преобразователь. Он повышает напряжение с аккумулятора до пяти вольт. WeMos D1 mini работает именно от такого напряжения.

Устройство для записи данных на microCD флешку.

Дисплей для отображения информации.

Резистор R1 это нагрузка. Через него аккумулятор будет разряжаться.

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

Полностью этот делитель напряжения выглядит вот так.

делитель напряжения

Контакт A0 уже притянут к земле через резистор на 320 килоом. Этот резистор содержится где-то внутри WeMos D1 mini. В прочем в этом не сложно убедиться, измерив, сопротивление между A0 и землей.

АЦП преобразователь WeMos D1 mini имеет разрядность десять бит. Т.е. максимальное значение на этом преобразователе 1023, а минимальное 0. Максимальное значение 1023 соответствует напряжению 3.3 вольта.

Делитель напряжение расширит измеряемый диапазон напряжений. Так что значению 1023 будет соответствовать не 3.3 вольта, а 4.33 вольта.

Это рассчитывается вот так. Вспоминаем школьные формулы для последовательного соединения.

формулы для последовательного соединения

По сути дела это цифровой вольтметр, собранный на АЦП преобразователе и делителе напряжения.

Прошивку я напишу так, чтобы ровно один раз в минуту, на microCD записывалось время и значение с АЦП преобразователя.

Саму прошивку рассматривать не буду, по-моему, это не очень интересно. Но вот ссылка на нее

Скажу только что минимально необходимый код для получения значения с аналого-цифрового преобразователя выглядит вот так.

#define WEMOS_A0     17

void setup() {
    pinMode(WEMOS_A0, INPUT);
}

void loop() {
    unsigned int x = analogRead(A0);
}

С этим x нужно дальше что-то сделать, чтобы получить из него значение в процентах. Дальше речь пойдет именно об этом.

Это устройство в собранном виде выглядит вот так.

испытательный стенд 2

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

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

данные без обработки

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

Максимальное значение здесь 990. Это соответствует напряжению 4,2 вольта. А минимальное 680 это примерно 2,88 вольта. После этого сработала защита аккумулятора встроенная в саму батарейку, и он выключился.

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

Линейную аппроксимацию сделать очень легко. Максимальное значение АЦП преобразователя 990, а минимальное 680. Нужно сделать так, чтобы когда значение на выходе АЦП преобразователя менялось от 990 до 680. Процент заряда аккумулятора менялся от 100 до 0.

Конечная формула для такого преобразования выглядит вот так.

Линейная аппроксимация 1

На графике это выглядит вот так.

данные без обработки

Красная кривая это линейная аппроксимация, а синяя это идеальная зависимость. Т.е. прямая соединяющая 0 и 100% в заданный промежуток времени.

Если для измерения уровня заряда аккумулятора использовать линейную аппроксимацию, то будет получаться что от 100 до 80 процентов аккумулятор разряжается долго, а от 20 до нуля быстро.

Возможно, у вас есть мобильный телефон, или еще какой-то девайс который так себя ведет. Теперь вы знаете, почему так происходит. Его разработчики поленились сделать более точные расчеты и ограничились линейным приближением.

Дальше я хочу сделать параболическую аппроксимацию. Т.е. найти параболу, которая проходит близко к заданной кривой.

Традиционно уравнение параболы записывают вот так.

уравнение параболы

Но я буду искать решение вот в таком виде. Так промежуточные значения при вычислениях будут меньше, и это будет удобнее вычислять в микроконтроллере.

уравнение параболы 2

Эта парабола должна проходить через три точки. Первые две это значение 100% и 0.

В качестве третьей лучше всего выбрать значение 50%. Т.е. это должна быть средняя точка по времени на реальной зависимости.

У меня всего 629 точек. Средняя точка это точка с номером 315. Значение в ней примерно равно 884.

Дальше нужно составить три уравнения в которых парабола проходит через эти точки и решить их относительно коэффициентов a, b, c.

уравнение параболы 2

Вот так выглядит решение этой системы уравнений.

уравнение параболы 2

В ответ на пожелание подписчика приведу решение в символьном виде. Может быть, оно кому-то пригодиться. Вместо x1, y1, x2, y2, x3, y3 нужно подставить ваши точки, через которые должна проходить парабола.

решение в символьном виде

Этот калькулятор поможет выполнить вам данный расчет.

XY
1
2
3
Ответ: a = 680; b = 548.694; c = 0.000730968;

И конечное уравнение параболы:

уравнение параболы 2

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

данные без обработки

Красная кривая выпрямилась и теперь расположена вдоль идеальной синий, зависимости. Это значит, что квадратичная аппроксимация будет давать точные результаты. И последние 20% заряда батареи будут длиться столько же времени, сколько и первые.

Вычисленные значения в последней формуле должны подходить и для других литий ионных аккумуляторов.

В следующих самоделках буду использовать уже параболическое приближение вместо линейного.

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

Например, в Arduino тоже используется десяти битный АЦП, но уровень логики там 5 вольт, а не 3,3 вольта. Значит делитель напряжения как таковой не нужен. Нужен только подтягивающий резистор. Т.е. схема должна выглядеть вот так:

испытательный стенд

В делители напряжения на WeMos который я использовал значению 1023 соответствовало напряжение 4,33 вольта. В новом 5 вольт. Значит, уравнения должны быть вот такими.

Для линейной аппроксимации:

уравнение линейной аппроксимации 2

Для квадратичной:

уравнение квадратичной аппроксимации 2

Решение этого уравнения

Решение уравнения квадратичной аппроксимации 2

Решение уравнения квадратичной аппроксимации 3

В этих экспериментах я не боялся полностью разрядить аккумулятор потому, что знал, что в нем есть защитная микросхема. Ее часто устанавливают непосредственно внутрь батарейки 18650. Если в ваших аккумуляторах такой микросхемы не будет, то желательно предусмотреть что-то что их будет отключать до того, как они полностью разрядятся и придут в негодность.