- Контроллер батарейного питания для arduino
- Создание зарядного устройства, управляемого Arduino
- Комплектующие
- Как заряжать NiMH AA аккумуляторы
- Цепь заряда
- Датчик температуры
- Измерение уровня заряда аккумулятора на Ардуино
- Теория
- Реализация
- Вариант 1. Измерение напряжения при помощи Ардуино.
- Вариант 2. Использование датчика напряжения INA219.
- Заключение
Контроллер батарейного питания для arduino
В ходе экспериментов и сборок различных устройств на arduino мне часто приходили мысли добавить в них аккумулятор. Однако решения от «китайцев» доступные на рынке мне не сильно нравились. Я решил сделать простой модуль, позволяющий добавить в любое ваше устройство аккумулятор, да и еще и с кучей всевозможных защит. Для построения такого модуля я выбрал микросхему BQ25606 от Texas Instruments. Ссылка на datasheet (https://www.ti.com/lit/ds/symlink/bq25606.pdf). В ней есть все функции, которые могут быть полезны диайвайщику.
Микросхема имеет два режима работы. Первый режим — зарядка. В этом режиме напряжение Vbus используется как входное напряжение для зарядки аккумулятора. При этом, входной ток можно регулировать подбором сопротивления R_Ilim, а ток зарядки сопротивлением R_Ichg. Контроллер мониторит уровень заряда батареи и температуру (сопротивление термистора). Во втором режиме — boost, микросхема умеет генерировать из напряжения батареи 5.1 В на линию Vbus с максимальным током в 1.2 А. То есть, к этой микросхеме можно не добавлять повышающий модуль, она и так умеет повышать напряжение до 5В, чтобы запитать, например, arduino. Ниже привел блок схему BQ25606 из datasheet’а.
Собрал тестовый модуль для проверки всех заявленных возможностей микросхемы. В качестве батареи использовал сборку из 6 литий ионных аккумуляторов подключенных параллельно, каждая батарея емкостью примерно в 3500 мА/ч, т.е. общая емкость около 21000 мА/ч.
Качество изготовления плат мне понравилось, советую. Лак держит нагрев, дорожки не отрываются. Все красиво и четко. В комплекте еще брелок положили)
Для начала, проверим регулировку тока потребления и заряда батареи. Для этого на плате предусмотрены подстроечные резисторы. Если взглянуть на datasheet микросхемы BQ25606, то можно увидеть, что входной ток и ток заряда задается резисторами, которые считаются по простой пропорции: R = K / I, где коэффициент K для входного тока это 478, а для тока зарядки 677. Резистор для входного тока будет использоваться микросхемой только в том случае, если ей не удастcя опознать мощность подключенного по usb блока питания и по сути он ограничивает входной ток потребляемый схемой от источника питания. Ниже я привел таблицу всех возможных вариантов ограничения входного тока.
Резистор в цепи регулирования заряда ограничивает максимальный ток, с которым будет заряжаться батарея. Получается сначала ограничивается входной ток, а дальше уже ток зарядки, т.е. при выставленном токе заряда в 2 ампера, если входной ток будет ограничен на уровне 1 ампер, то и ток зарядки будет не больше 1 ампера (по факту чуть меньше ибо КПД не идеальный).
Я выставил ток заряда в 2.5 ампера и запустил тест зарядки. Микросхема ощутимо нагревается и в определенный момент начинает сбрасывать ток зарядки, чтобы не перегреться. При этом изменяя входное напряжение заряда, которое можно повысить до 13.5 вольт, можно увидеть изменение потребляемого тока.
Я думаю, оптимальным решением станет установка резистора для ограничения входного тока номиналом 470 Ом. При этом входной ток будет ограничен на уровне около 1 А, а ток зарядки 1.44 А. И как я писал выше, ток зарядки поднимется до 1.44 А только когда микросхема задетектит мощный блок питания, во всех остальных случаях зарядка будет также не больше одного ампера.
Вообще, микросхема BQ25606 очень умно заряжает батареи, контролирует нагрев через NTC и способна определять аккумуляторы, которые уже непригодны к работе и сообщать об этом.
После тестирования макета, я модифицировал принципиальную схему и решил привести модуль к более практичному виду.
По схеме, диод D1 предотвращает утечку 5В в блок питания при подключении зарядки с включенным режимом boost в BQ25606 (когда микросхема генерирует 5В). При подключении блока питания к USB разъему, транзистор Q1 притягивает вывод микросхемы OTG к земле и переводит её в режим зарядки вне зависимости от включенного режима с помощью тумблера SW1.
Ну и тестирование на уровень пульсаций по 5В выходу.
Для начала запуск преобразователя, слева без нагрузки, справа с нагрузкой в 1А. Емкость на выходе преобразователя 22 мкФ.
Пульсации при нагрузке в 1А и емкости на выходе 22 мкФ составили 1.5 В, поэтому емкость выхода необходимо увеличить, до 220-470 мкФ. Ниже график пульсаций, слева емкость выхода 22 мкФ, справа 220 мкФ.
Ну и запуск преобразователя с емкостью в 220 мкФ и током потребления в 1А выглядит следующим образом
При работающем boost режиме, если подать питание на схему, то на выходной линии 5В наблюдаются выбросы, связанные с переключением режимов. Слева — запуск зарядки, справа — отключение зарядки, где видно некоторую паузу, которая необходима контроллеру для запуска boost режима, а дальше софт старт. Картинки сняты при подключенной нагрузке в 1А. Эти осциллограммы были сняты с тестового образца без индуктивности на выходе. Тем не менее, видно, что при подключении зарядки к такому модулю произойдет кратковременное отключение , что надо учитывать. Хотя на малых потреблениях, эта просадка напряжения сгладится емкостью питания.
Также стоит отметить, что при значениях емкости на 5В выходе больше 1000 мкФ микросхема не сможет запустить boost режим, так как начальный ток зарядки конденсатора будет триггерить схему защиты по току. При этом будет мигать светодиод подключенный в выводу STAT. Частично для уменьшения этого эффекта в схему была добавлена индуктивность L1.
Печатную плату для итогового устройства развел на стриме: https://youtu.be/zd9VTNEoVy0
В общем, получилась платка, к которой можно подключить аккумулятор, лежащий под руками и получить полноценное батарейное питание для вашего устройства. Плата будет контролировать заряд и разряд, не позволяя аккумулятору переразрядиться, или перезарядиться, или нагреться. Надеюсь проект будет кому-то полезен, если так, то поставьте статье лайк. Вам не сложно, а мне приятно, спасибо!
Хочется сказать большое спасибо Lightning666 за помощь в тестировании проекта.
Пишите ваши вопросы в комментариях. Спасибо за внимание, пока!
Источник
Создание зарядного устройства, управляемого Arduino
Arduino и добавленная к ней схема заряда могут быть использованы для мониторинга и управления зарядкой никель-металл-гидридных аккумуляторов, например, так:
Законченное устройство
Аккумуляторные батареи являются отличным способом для питания вашей портативной электроники. Они могут сэкономить вам много денег при правильной зарядке. Для того, чтобы вы могли получить максимальную отдачу от ваших аккумуляторных батарей, их необходимо правильно заряжать. Это означает, что вам необходимо хорошее зарядное устройство. Вы можете потратить кучу денег, купив готовое зарядное устройство, а можете получить удовольствие, сделав его сами. В данной статье мы рассмотрим, как можно создать зарядное устройство, управляемое Arduino.
Во-первых, важно отметить, что не существует универсального способа зарядки, который подходил бы для всех аккумуляторов. Разные типы аккумуляторов используют разные химические процессы, обеспечивающие их работу. В результате, разные типы аккумуляторов необходимо заряжать по-разному. В этой статье мы не сможем охватить все типы аккумуляторных батарей и методы зарядки. Поэтому для простоты мы сосредоточим внимание на наиболее распространенном типе аккумуляторных батарей размера AA, на никель-металл-гидридных аккумуляторах (NiMH).
Комплектующие
Список комплектующих слева направо:
- контроллер Arduino;
- держатель батареи размера AA;
- NiMH аккумулятор;
- мощный резистор 10 Ом (минимум 5 ватт);
- резистор 1 МОм;
- конденсатор 1 мкФ;
- MOSFET транзистор IRF510;
- датчик температуры TMP36;
- источник питания 5 вольт;
- макетная плата;
- перемычки.
Как заряжать NiMH AA аккумуляторы
Существует много способов зарядки NiMH аккумуляторов. Выбор используемого вами метода главным образом зависит от того, как быстро вы хотите зарядить аккумулятор. Скорость заряда измеряется по отношению к емкости батареи. Если ваша батарея обладает емкостью 2500 мАч, и вы заряжаете ее током 2500 мА, то вы заряжаете ее со скоростью 1C. Если вы заряжаете этот же аккумулятор током 250 мА, то вы заряжаете его со скоростью C/10.
Во время быстрой зарядки аккумулятора (со скоростью выше C/10), вам необходимо тщательно контролировать напряжение на батарее и ее температуру, чтобы не перезарядить ее. Это может серьезно повредить аккумулятор. Тем не менее, когда вы заряжаете аккумулятор медленно (со скоростью ниже C/10), у вас гораздо меньше шансов повредить батарею, если случайно перезарядите ее. Поэтому медленные методы зарядки, как правило, считаются более безопасными и помогут вам увеличить срок службы батареи. Поэтому в нашем самодельном зарядном устройстве мы будем использовать скорость заряда C/10.
Цепь заряда
Для данного зарядного устройства основой является схема для управления источником питания с помощью Arduino. Схема питается от источника напряжения 5 вольт, например, от адаптера переменного тока или компьютерного блока питания. Большинство USB портов не подходит для данного проекта из-за ограничений по току. Источник 5В заряжает батарею через мощный резистор 10 Ом и мощный MOSFET транзистор. MOSFET транзистор устанавливает величину тока, протекающего через батарею. Резистор добавлен как простой способ контроля тока. Контроль величины тока выполняется подключением каждого вывода резистора к аналоговым входным выводам Arduino и измерением напряжения с каждой стороны. MOSFET транзистор управляется выходным ШИМ выводом Arduino. Импульсы сигнала широтно-импульсной модуляции сглаживаются до постоянного напряжения фильтром на резисторе 1 МОм и конденсаторе 1 мкФ. Данная схема позволяет Arduino отслеживать и управлять током, протекающим через батарею.
Датчик температуры
В качестве дополнительной меры предосторожности в зарядное устройство добавлен датчик температуры TMP36 для контроля температуры батареи. Данный датчик выдает напряжение, которое линейно зависит от температуры. Поэтому он, в отличие от термисторов, не требует калибровки или балансировки. Датчик устанавливается в просверленном отверстии в корпусе держателя батареи и приклеивается в отверстии так, чтобы он прижимался к батарее, когда та будет установлена в держатель. Выводы датчика подключаются к шине 5В, к корпусу и к аналоговому входному выводу Arduino.
Держатель AA батареи перед и после установки на макетную плату
Код для данного проекта довольно прост. Переменные в начале исходного кода позволяют настроить зарядное устройство путем ввода значений емкости батареи и точного сопротивления мощного резистора. Также добавлены и переменные безопасных порогов. Максимально допустимое напряжение на батарее устанавливается в значение 1,6 вольта. Максимальная температура батареи установлена на 35 градусов по Цельсию. Максимальное время заряда установлено на 13 часов. Если какой-либо из этих порогов безопасности будет превышен, зарядное устройство выключается.
В теле программы вы можете увидеть, что система постоянно измеряет напряжения на выводах мощного резистора. Это используется для расчета значений напряжения на батарее и протекающего через нее тока. Ток сравнивается с целевым значением, которое составляет C/10. Если рассчитанный ток отличается от целевого значения более, чем на 10 мА, система автоматически подстраивает выходное значение, чтобы подкорректировать его.
Arduino использует последовательный интерфейс для отображения всех текущих данных. Если вы хотите проконтролировать работу вашего зарядного устройства, то можете подключить Arduino к USB порту компьютера, но это необязательно, так как Arduino питается от источника напряжения 5В зарядного устройства.
Скачиваемую версию исходного кода вы можете найти по ссылке, приведенной ниже.
Теперь вы можете создать собственное зарядное устройство. Но обязательно контролируйте скорость заряда и соблюдайте технику безопасности, так как избыточная зарядка аккумулятора может быть опасна.
Источник
Измерение уровня заряда аккумулятора на Ардуино
Отслеживание уровня заряда аккумулятора или батареи является одной из основных задач при разработке автономных устройств. Особенно она актуальна для устройств, которые работают удалённо и сообщают о своём статусе, используя, например, GSM канал*. Даже когда устройство находится рядом с вами, индикация уровня заряда аккумулятора поможет сделать его использование более удобным. В данной статье мы рассмотрим простой способ отслеживания уровня заряда аккумулятора или батареи при помощи Ардуино.
*Знакомые с GSM модулями могут возразить, что в их составе уже присутствуют средства мониторинга заряда аккумулятора, и не нужно изобретать велосипед. Справедливое замечание. Но при условии, что для GSM модуля не используется стабилизация напряжения, скажем, от 12-вольтового аккумулятора. В этом случае модуль не сможет оценить уровень заряда аккумулятора. Таким образом, не стоит преуменьшать актуальность данной темы.
Теория
Предлагаемый способ отслеживания уровня заряда основан на измерении напряжения источника питания. Возьмем, к примеру, литий-ионный аккумулятор. В процессе разрядки его напряжение изменяется от 4.2 В до 3 В. Выполняя периодические замеры напряжения и сопоставляя полученный результат с приведённым диапазоном 4.2. 3 В, мы можем оценить уровень заряда. Но не всё так однозначно. Дело в том, что напряжение аккумулятора при разряде изменяется не линейно. Это видно из графика разряда литий-ионного аккумулятора, который легко найти в google по запросу li-ion discharge graph:
Данный график позаимствован с сайта 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 и откройте монитор порта. Вы должны увидеть следующий результат:
Этот скетч измеряет напряжение на входе 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.
На фото видно, что результат измерения напряжения при помощи Ардуино и делителя не сильно отличается от того значения, что показывает мультиметр. Это хороший результат.
При подключении делителя я отказался от макетной платы в пользу пайки, чтобы избежать увеличения сопротивлений из-за плохого контакта.
Опорное напряжение, выдаваемое внутренним стабилизатором, не обязательно будет 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 и вывода результата на дисплей я соединил компоненты в соответствии со схемой:
В этот раз я решил выделить 10 уровней заряда, чтобы отображать его в процентах. Скетч и результат его работы ниже:
Заключение
Конечно, предложенный способ не претендует на высокую точность. Существуют специализированные микросхемы мониторинга питания, которые определяют оставшуюся ёмкость аккумулятора с учётом нагрузки и других параметров. Они находят применение в ноутбуках, телефонах и другой портативной технике. Но вряд ли вы найдёте что-то подобное в любительских проектах – не тот уровень. Таким образом, определение уровня заряда аккумулятора по напряжению – приемлемая альтернатива, не требующая серьёзных аппаратных или программных ресурсов.
Источник