«Умная» батарейка
В данной статье речь пойдет о создании счетчика расхода энергии батарейки.
Раньше я уже писал, что сталкивался с подобной задачей и тогда её удалось решить малой кровью. На "рынке" была микросхема кулоновского счетчика, которая подходила под потребление разрабатываемого устройства.
Но время шло и устройство, которое запитывалось от данной батарейки было выпущено в новой модификации и одним из улучшений стало увеличение дальности работы беспроводной связи. В следствии чего пиковое потребление выросло с 50 мА до 160 мА и чудесный кулоновский счетчик работать перестал, так как его верхний диапазон 100 мА.
Как итог, стала задача разработать новую плату отвечающую следующим требованиям
Организовать подсчет потребляемой энергии от батарейки
Отслеживать уровень напряжения элемента питания
Вписаться в старые габариты печатных плат
Потребление разрабатываемого счетчика не должно превышать 2 мА в рабочем режиме и 5 мкА во сне
В качестве интерфейса обмена с "материнской платой" должен быть использован интерфейс I2C
Обеспечение искрозащиты
Минимизировать повышение стоимости готового изделия
Для подсчета затрачиваемой энергии было решено использовать "классическую" схему с АЦП и шунтом, а для ее реализации был выбран МК STM32l031G6U6TR. Он решает сразу несколько задач.
Во первых - потребление. Данная серия МК выпущена специально для приложений в которых требуется пониженное энергопотребление, что от нас и просили. Заглядывая вперед, потребление во сне меньше 1 мкА, а в рабочем режиме порядка 1 мА.
Интерфейс. Как и все современные МК, мы имеем на борту I2C, а еще, мы умеем по нему выходить из сна, как раз то что надо.
Габариты. Данный МК выпускается в корпусе UFQFPN28, который имеет весьма скромные размеры, что позволяет нам спокойно влезть в старые габариты платы.
Cхема работы изделия будет выглядеть примерно следующим образом: Материнская плата просыпается и сразу будит "батареечную плату", та в свою очередь начинает измерять потребляемый ток и записывает его в так называемый "банк" потраченной энергии. Перед уходом в "сон", материнская плата запрашивает данные из батарейки. Это если коротко.
Начинаем разрабатывать схему, тут все прям очень просто.
Микроконтроллер питается напрямую от батарейки, тактируется от внутренней цепочки. В качестве шунта используются те же резисторы, что и для искробезопасной цепи (R7 в дальнейшем заменил на 100 Ом, а то возникли ожидаемые неприятности).
Как видно из документации на элемент питания, его характеристики сильно зависят от потребляемого тока и температуры окружающей среды, ну а если точнее, температуры самого элемента питания.
Температура будет отслеживаться при помощи сенсора имеющегося в микроконтроллере, точности сенсора, для решения данной задачи, хватает с лихвой ±3°C.
Стараюсь во всех проектах, в которых принимаю участие, дать доступ к как можно большему числу пинов МК, поэтому использую test point-ы, ну и как-то исторически сложилось, что для отладки изделий использую UART, просто подключаю его к преобразователю USB/UART и кидаю данные в терминальную программу(я использую hTerm, прям нравится).
АЦП
У данного МК, в выбранном корпусе, отсутствуют контакты для опорного напряжения аналоговой периферии и в качестве опорного напряжения используется напряжение питания. Естественно, напряжение питания будет меняться в зависимости от тока потребления, температуры и вообще деградации элемента питания. На этот случай в данном МК есть внутреннее референсное напряжение, оно подается на один из каналов АЦП. И вот это не совсем «классическая» схема (я столкнулся впервые). Тут получается следующий алгоритм, мы знаем, что на входе канала АЦП, подключенного к внутреннему референсному напряжению, всегда присутствует 1.224 В (значение хранится в определенном регистре), дальше все как всегда, составляется пропорция и узнаем напряжение питания МК, а заодно и напряжение элемента питания, так как питаю на прямую. Теперь данные поступающие из АЦП будут преобразованы верно, несмотря на изменяющееся напряжение питания.
Данные из температурного сенсора также поступают на вход канала АЦП.
Перед испытаниями
Проанализировав графики в документации на батарейку, можно вывести формулу зависимости емкости от температуры. График не имеет сильных отклонений, поэтому аппроксимировав его по двум конечным точкам, критической потери в точности данных не произойдет. В итоге формула зависимости емкости от температуры примет вид линейной функции:
Вычислив значения коэффициентов k и b, а в качестве x подставляя температуру, по этой функции будет выводиться остаточная емкость элемента питания зависимая от температуры.
Профиль потребления конечного изделия, которое запитывается от данного элемента питания, имеет импульсный характер (что не удивительно, так как это система беспроводной связи питающаяся от батарейки).
Поэтому, для большей чистоты испытаний, необходимо приблизить профиль тестовой нагрузки к реальному изделию. И сделать это не сложно, достаточно собрать токовую нагрузку на ОУ и управлять ей используя генератор сигналов. В итоге получается, что-то подобное.
Во время испытаний, батарейки и платы, будут анализироваться следующие параметры:
Температура
Текущее потребление тока
Использованная энергия
Оставшаяся расчетная емкость батарейки без учета температуры
Оставшаяся расчетная емкость батарейки с учетом температуры
Напряжение питания МК (напряжение элемента питания)
Для наглядной визуализации данных, было желание найти софт, который будет просто принимать по COM-порту данные и строить по ним графики. Желательно, чтобы данные передавались только в одну сторону, то есть от компьютера никакие запросы не приходили, я кидаю пачку данных, а софт на компьютере уже сам разбирает эту пачку.
Сначала я наткнулся на интересную программу, но что-то не срослось, настроек оказалось слишком мало. Программа умеет сроить несколько графиков, но только настройка одна на всех, а как вы понимаете, у меня будут графики и с большими числами, и с небольшими но отрицательными, плюс нужно сохранять архив, чтобы его анализировать не в реальном времени, все это она потянуть не смогла. Ну и тут меня осенило - да я же в Matlab умею, всяко Simulink легко справится с моими пожеланиями. Собственно, я не ошибся, в итоге получилась следующая программа.
Испытания
Испытания проводились в климатической камере. Критическими и самыми интересными температурами являлись, естественно, отрицательные. Элемент питания не плохо себя показывает на отрицательных температурах до -50°C, дальше напряжение на нем при нагрузке опускается ниже 1.5V и тут уже отваливается сам МК. При температуре в -45°C ЭП держит напряжение 2.4V, которых как раз достаточно и необходимо, для работы модуля беспроводной связи. Во время дальнейшего повышения температуры до +25°C, а в дальнейшем и +85°C, стабилизируют напряжение "свежего" ЭП до 3.4V под нагрузкой. При этом емкость на критической отрицательной температуре разряжалась практически до нуля процентов, заявленных в документации производителя, то есть порядка 2 А*ч. При возвращении в плюсовые температуры, батарейка показывала стабильное напряжение еще порядка 10 А*ч.
Испытания показали, что работа изделия при отрицательных температурах может быть нестабильной из-за сильного падения напряжения, хотя оставшейся энергии в ЭП еще достаточное кол-во и потребуются какие-то решения для уменьшения потребляемого тока (уменьшение мощности радиопередатчика). В любом случае, конечный пользователь, как мне кажется, должен быть осведомлен, что новенькая батарейка в комнатной температуре не то же самое, что эта же батарейка в морозе.