Меню

Контроль напряжения аккумулятора ардуино

Уровень заряда аккумулятора 18650 на arduino

Для каждого устройства, которое работает от автономного источника питания, основным показателем времени «жизни» до следующей подзарядки является уровень заряда аккумулятора. Без этой информации не представляется возможным ни одно электронное устройство. Много кто любит сюрпризы, но неожиданное прекращение работы девайса вряд ли кому-то понравится. Вот и я не отношусь к числу мазохистов, которые получают удовольствие от неожиданно переставшего работать устройства. Поэтому в новом проекте, который должен будет работать по 3-4 месяца автономно, было решено добавить контроль уровня заряда аккумулятора. Уровень заряда будет измеряться в процентном соотношении и периодически отправляться по сети интернет или в смс. В этой статье будет рассмотрено только определение уровня заряда аккумулятора и вывод информации на дисплей, чтобы не загружать текст лишней информацией.

Аккумулятор 18650 и arduino

Для питания электронных устройств можно использовать множество различных источников питания, но в данной статье будет использоваться аккумулятор 18650. Максимальный заряд такого аккумулятора 4.25 вольта, а минимальное напряжение, при котором аккумулятор не пострадает и сможет без проблем зарядиться – 2.75 вольта. Батареи 18650 имеют довольно большую емкость, до 3000 мАч, что позволяет питать устройства большое количество времени. Но, тем не менее, такие источники питания не вечные и необходимо следить за уровнем заряда. Если заряд будет ниже, чем 2.75 вольта, то реанимировать аккумулятор будет сложно, а иногда и невозможно.

Измерение уровня заряда аккумулятора с помощью arduino

Чтобы максимально точно измерить уровень аккумулятора с помощью arduino, нужно воспользоваться опорным напряжением микроконтроллера и сравнивать его с напряжением источника питания. Но тут появляется небольшая сложность, напряжение опорного питания составляет 1.1 вольт, а максимальное напряжение 18650 — 4.25 вольта. Чтобы замерить напряжение аккумулятора необходимо использовать простой делитель напряжения, который легко собрать с помощью двух резисторов. В данном примере, я использовал резисторы сопротивлением 1 и 10 кОм, в итоге получилось понизить уровень напряжения примерно в 10 раз.
Для расчета напряжения, которое получится на выходе делителя, используется формула: U(out) = U(in)*(R2/(R1+R2)). Получается, что при напряжении 4 вольта, на выходе делителя напряжение будет равно 0.36 вольт. Такое напряжение уже можно без проблем сравнивать с опорным. Это основная логика работы, остальное уже дело техники. Ниже будет приведена схема подключения аккумулятора и делителя напряжения к ардуино. Хочу только обратить внимание, что для более точного расчета делителя необходимо замерить сопротивление каждого резистора, поскольку их реальное сопротивление может немного отличаться от маркировки. В моем случае резисторы с маркировкой 1 и 10 кОм, на деле имели сопротивление 0.99 и 9.88 кОм.

Скетч arduino для определения уровня заряда аккумулятора

Чтобы установить опорное напряжение на аналоговых входах arduino на уровне 1.1В необходимо воспользоваться функцией analogReference и передать ей параметр INTERNAL. Работать с опорным напряжением 1.1В умеют микроконтроллеры ATmega168 и ATmega328, если будет использоваться ATmega8, то при вызове этой же функции, опорным напряжением будет 2.56В.
Для вывода уровня заряда аккумулятора будет использоваться 7-мегментный 4-х разрядный индикатор TM1637, как его использовать, можно почитать в более ранней статье: индикатор TM1637.
Ниже приведен код с подробными комментариями.

Что использовалось в проекте:

  • Arduino (я использовал arduino nano, но можно любую другую). Покупал тут: arduino nano
  • Аккумулятор 18650. Покупал тут: Аккумуляторы 18650 4 шт
  • Индикатор TM1637. Покупал тут: 7-сегментный 4-разрядный индикатор TM1637
  • Резисторы сопротивлением 1 кОм и 10 кОм. Покупал тут:набор резисторов 700 шт. От 10 Ом до 1 МОм

Послесловие

Использовать, приведенный в статье, код можно для любых аккумуляторов, не обязательно 18650. Достаточно только в коде скетча подправить переменные для максимального и минимального напряжения аккумулятора. А также можно использовать резисторы любого другого наминала, только не забыть подправить уравнение в коде: float del = 0.091; // R2/(R1+R2) 0.99кОм / (9.88кОм + 0.99кОм)

Читайте также:  Число циклов перемены напряжений соответствующее пределу выносливости

Источник



Индикатор уровня заряда батареи на ARDUINO

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

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

Если ваш аккумулятор полный заряда — самый левый светодиод загорается, а если аккумулятор разрядился — светится правый светодиод.

Схема индикатора уровня:

Набор Arduino в схеме является «мозгом» системы, потенциальный делитель, который помогает Arduino для выборки входного напряжения. Предварительно набор резисторов используется для калибровки. Серия из 6 светодиодов покажет уровень заряда батареи.

Таблица уровня заряда батареи:

Светодиод led №1 – 100% до 80%

Светодиод №2 – 80% до 60%

Светодиод №3 – 60% до 40%

Светодиод №4 – 40% до 20%

Светодиод №5 – 20% до 5%

Ардуино измеряет в узком диапазоне напряжения от 12,70 В до 11,90 В. Полностью заряженный аккумулятор должен иметь напряжение выше 12,70 В. (после отключения от зарядного устройства). Напряжение батареи не должно опускаться ниже 11,90 Вольт для 12В свинцово-кислотных аккумуляторов.

Программа:

//———Program developed by R.Girish———//
int analogInput = 0;
int f=2;
int e=3;
int d=4;
int c=5;
int b=6;
int a=7;
int s=13;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000;
float R2 = 10000;
int value = 0;
void setup()
<
Serial.begin(9600);
pinMode(analogInput,INPUT);
pinMode(s,OUTPUT);
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
digitalWrite(s,LOW);
digitalWrite(a,HIGH);
delay(500);
digitalWrite(b,HIGH);
delay(500);
digitalWrite(c,HIGH);
delay(500);
digitalWrite(d,HIGH);
delay(500);
digitalWrite(e,HIGH);
delay(500);
digitalWrite(f,HIGH);
delay(500);
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
>
void loop()
<
value = analogRead(analogInput);
vout = (value * 5.0) / 1024;
vin = vout / (R2/(R1+R2));
Serial.println(«Input Voltage = «);
Serial.println(vin);
if(vin>12.46)
else < digitalWrite(a,LOW);>
if(vin 12.28)
else < digitalWrite(b,LOW);>
if(vin 12.12)
else < digitalWrite(c,LOW);>
if(vin 11.98)
else < digitalWrite(d,LOW);>
if(vin 11.90)
else
if(vin «6 светодиодный индикатор уровня заряда батареи» должна быть выполнена тщательно. Если Вы не правильно откалибруете, схема будет показывать неверный уровень напряжения батареи.

При включении, схема начинает со светодиодного тест. Здесь светодиоды горят последовательно с некоторой задержкой. Это может помочь при отладке ошибок. Далее:

1) Установить напряжение регулируемого источника питания точно 12,50 в.

2) Откройте монитор.

3) Поверните подстроечным резистором по часовой стрелке или против часовой стрелки и выведите показание до 12,50 в.

4) Теперь уменьшите регулируемым источником питания до 12,00 в, показания на серийном мониторе должны показать тоже 12,00 В.

5) Теперь увеличим напряжение до 13,00 В — показания на мониторе должны показать то же самое или очень близко к 13В.

6) При увеличении или уменьшении напряжения, каждый светодиод включается/выключается с разными уровнями напряжения.

Если указанные выше шаги выполнены успешно, Ваш Индикатор уровня заряда батареи настроена!

Источник

Измерение уровня заряда аккумулятора на Ардуино

Измерение уровня заряда Аккумулятора на Ардуино

Отслеживание уровня заряда аккумулятора или батареи является одной из основных задач при разработке автономных устройств. Особенно она актуальна для устройств, которые работают удалённо и сообщают о своём статусе, используя, например, GSM канал*. Даже когда устройство находится рядом с вами, индикация уровня заряда аккумулятора поможет сделать его использование более удобным. В данной статье мы рассмотрим простой способ отслеживания уровня заряда аккумулятора или батареи при помощи Ардуино.

*Знакомые с GSM модулями могут возразить, что в их составе уже присутствуют средства мониторинга заряда аккумулятора, и не нужно изобретать велосипед. Справедливое замечание. Но при условии, что для GSM модуля не используется стабилизация напряжения, скажем, от 12-вольтового аккумулятора. В этом случае модуль не сможет оценить уровень заряда аккумулятора. Таким образом, не стоит преуменьшать актуальность данной темы.

Теория

Предлагаемый способ отслеживания уровня заряда основан на измерении напряжения источника питания. Возьмем, к примеру, литий-ионный аккумулятор. В процессе разрядки его напряжение изменяется от 4.2 В до 3 В. Выполняя периодические замеры напряжения и сопоставляя полученный результат с приведённым диапазоном 4.2. 3 В, мы можем оценить уровень заряда. Но не всё так однозначно. Дело в том, что напряжение аккумулятора при разряде изменяется не линейно. Это видно из графика разряда литий-ионного аккумулятора, который легко найти в google по запросу li-ion discharge graph:

Читайте также:  Реле напряжения для чего применяется

График разряда аккумулятора Panasonic NCR18650B

Данный график позаимствован с сайта batteryuniversity. На нём отражён процесс разряда аккумулятора Panasonic NCR18650B 3200мАч разными токами от 0.2C до 2C. Как видите, напряжение аккумулятора изменяется более-менее линейно лишь при разряде большими токами. Здесь можно вспомнить математику и посчитать процент оставшегося заряда по линейной формуле. Но это, скорее, частный случай. Пожалуй, более актуальны случаи, когда устройство потребляет незначительные токи, поэтому ориентироваться мы будем на красную и синюю кривые.

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

Следующий момент, который я беру во внимание – это то, что высокая детализация уровня заряда (в тех же процентах, которые дают нам 100 значений) бывает нужна крайне редко. В большинстве случаев достаточно понимания: когда уровень заряда находится в «зелёной зоне», когда в «жёлтой», а когда нужно быть готовым к отключению устройства из-за разряда аккумулятора. Поэтому наиболее рациональным представляется подход, когда мы выделяем 3-4 пороговых напряжения и относительно них определяем уровень заряда. Грубо говоря, если напряжение литий-ионного аккумулятора больше 4 В, то заряд высокий; если меньше 3.2 В – аккумулятор вот-вот разрядится, а между этими двумя значениями выделяем еще несколько зон. Если необходимо выразить заряд именно в процентах – пожалуйста: выделяем 10 зон и показываем результат десятками (10%, 20% и т.д.).

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

Реализация

Итак, задача поставлена: необходимо измерять напряжение источника питания нашего устройства. Я бы выделил 2 возможных варианта реализации:

  • измерять напряжение, используя АЦП Ардуино;
  • воспользоваться датчиком напряжения, например, INA219.

Первый вариант хорош тем, что для него ничего не требуется. Разве что пара резисторов. А датчик напряжения – это уже дополнительный компонент. Зато он позволит более точно измерять напряжение. Кроме того INA219 измеряет потребляемый ток и мощность, поэтому имеет потенциал для дальнейшего развития в плане мониторинга питания (с его помощью можно построить ту же кривую разряда аккумулятора, определить его ёмкость, спрогнозировать время работы устройства), но это уже отдельная тема.

Вариант 1. Измерение напряжения при помощи Ардуино.

Все платы Ардуино имеют в своём составе АЦП. У популярных плат (UNO, NANO, MEGA2560) разрядность АЦП составляет 10 бит, у более продвинутых (Due, Zero) – 12 бит. АЦП позволяет измерять напряжение в диапазоне от 0 В до опорного напряжения Vref. Значение Vref в общем случае соответствует напряжению питания платы – 5 В или 3.3 В, но может быть привязано к внутреннему стабилизатору. Для лучшего понимания принципов использования АЦП предлагаю рассмотреть следующий скетч.

Загрузите скетч в Ардуино, соедините A0 с выводом 5V и откройте монитор порта. Вы должны увидеть следующий результат:

Arduino analogRead 1023

Этот скетч измеряет напряжение на входе A0 и выводит результат в монитор порта. Разрешение АЦП используемой мной Ардуино УНО составляет 10 бит, а значит, результатом измерений будет число от 0 до 1023 (2^10 значений). При этом значение 0 будет говорить об отсутствии напряжения, а максимальное значение – 1023 – о его равенстве (а так же превышении, что мы не будем рассматривать) опорному напряжению Vref, каким бы оно ни было. У меня в монитор порта выводится как раз число 1023. Поскольку опорным напряжением АЦП по умолчанию является напряжение питания Ардуино – 5 вольт, выдаваемые USB портом компьютера (разумеется, это не точное значение), можно утверждать, что напряжение на входе A0 тоже составляет 5 вольт.

Читайте также:  Поверочная схема электрического напряжения постоянного тока

Попробуем отсоединить A0 от вывода 5V и подсоединить к 3v3. Теперь у меня в монитор порта выводится значение 687. Зная опорное напряжение, нетрудно вычислить напряжение на A0:

(5 В / 1024) * 687 = 3.35 В

Для получения более точного результата следует измерить напряжение, выдаваемое USB портом.

Если же вывод A0 соединить с «землёй», то в монитор порта будет выводиться значение 0.

Вернёмся к нашей задаче. Питание от аккумулятора не всегда предполагает наличие стабильного напряжения, которое может использоваться как опорное для АЦП. В таких случаях в качестве Vref следует использовать напряжение от внутреннего стабилизатора Ардуино. Для большинства плат, в том числе Ардуино УНО, это напряжение составляет 1.1 В. Это означает, что измеряемое напряжение необходимо понизить при помощи делителя, чтобы оно не превышало 1.1 В. Здесь нам помогут пара резисторов номиналом в несколько десятков-сотен кОм, включенные по следующей схеме:

Делитель напряжения на резисторах

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

Сам коэффициент рассчитывается по следующей формуле:

Остаётся лишь подобрать номиналы резисторов таким образом, чтобы понизить напряжение аккумулятора до нужного нам уровня. Для измерения напряжения аккумулятора 18650 я выбрал номиналы 47k и 10k. Реальное сопротивление будет отличаться, поэтому их нужно обязательно измерить мультиметром. Выбранные мной номиналы дают коэффициент

0.175, что позволяет измерять напряжение до 1.1 В / 0.175 = 6,27 В. Ниже приведены схема, пример скетча, реализующий описанный функционал, и результат его работы. Предполагается, что Ардуино питается от аккумулятора, поэтому результаты выводятся на дисплей 1602, а не в Serial.

Определение уровня заряда аккумулятора. Делитель напряжения

Результат измерения уровня заряда 18650 lcd1602

На фото видно, что результат измерения напряжения при помощи Ардуино и делителя не сильно отличается от того значения, что показывает мультиметр. Это хороший результат.

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

Опорное напряжение, выдаваемое внутренним стабилизатором, не обязательно будет 1.1 В, и может отличаться от одного микроконтроллера к другому. Даташит допускает разброс от 1.0 до 1.2 В. Поэтому для получения более точных измерений можно вычислить значение Vref и использовать его в скетче при расчетах. Его легко найти путём измерения заранее известного напряжения (обозначим его как V(A0)):

Vref = V(A0) * 1024 / analogRead(A0)

Вариант 2. Использование датчика напряжения INA219.

После шаманства со всеми этими делителями и внутренними источниками опорного напряжения преимущество датчиков напряжения на базе специализированных микросхем очевидно. Они позволяют измерять напряжение (а некоторые ещё и потребляемый устройством ток) в широком диапазоне и с высокой точностью. INA219 – хороший пример такого датчика. Он потребляет не более 1мА, а в спящем режиме менее 15мкА, что весьма ценно при создании автономных устройств, в условиях энергосбережения. Подробное описание датчика и используемой далее библиотеки для работы с ним вы найдёте здесь: https://compacttool.ru/datchik-napryazheniya-i-toka-na-chipe-ina219

Для отслеживания уровня заряда аккумулятора 18650 при помощи INA219 и вывода результата на дисплей я соединил компоненты в соответствии со схемой:

Определение уровня заряда аккумулятора. INA219

В этот раз я решил выделить 10 уровней заряда, чтобы отображать его в процентах. Скетч и результат его работы ниже:

Измерение уровня заряда 18650. LCD1602

Заключение

Конечно, предложенный способ не претендует на высокую точность. Существуют специализированные микросхемы мониторинга питания, которые определяют оставшуюся ёмкость аккумулятора с учётом нагрузки и других параметров. Они находят применение в ноутбуках, телефонах и другой портативной технике. Но вряд ли вы найдёте что-то подобное в любительских проектах – не тот уровень. Таким образом, определение уровня заряда аккумулятора по напряжению – приемлемая альтернатива, не требующая серьёзных аппаратных или программных ресурсов.

Источник