Прибор для измерения емкости аккумулятора. Основные способы

Эта конструкция подключается как приставка к зарядному устройству, разнообразных схем которых в интернете уже описано немало. Она выводит на жидкокристаллический дисплей значение входного напряжения, величину тока зарядки аккумулятора, время зарядки и ёмкость зарядного тока(которая может быть или в Ампер-часах или в миллиампер-часах - зависит только от прошивки контроллера и применённого шунта). (См. Рис.1 и Рис.2 )

Рис.1

Рис.2

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

Основу устройства составляет микроконтроллер PIC16F676 и жидкокристаллический 2-строчный индикатор SC 1602 ASLB-XH-HS-G.

Максимальная зарядная ёмкость составляет 5500 ма/ч и 95,0 А/ч соответственно.

Принципиальная схема приведена на Рис 3.

Рис.3. Принципиальная схема приставки для измерения ёмкости зарядки

Подключение к зарядному устройству - на Рис 4 .


Рис.4 Схема подключения приставки к зарядному устройству

При включении микроконтроллер сначала запрашивает требуемую ёмкость зарядки.
Устанавливается кнопкой SB1. Сброс - кнопкой SB2.
На выводе 2 (RA5)устанавливается высокий уровень, который включает реле P1, которое в свою очередь включает зарядное устройство (Рис.5 ).
Если кнопку не нажимать более 5 секунд - контроллер автоматически переходит в режим измерений.

Алгоритм подсчёта ёмкости в данной приставке следующий:
1 раз в секунду микроконтроллер измеряет напряжение на входе приставки и ток, и если величина тока больше единицы младшего разряда - увеличивает счётчик секунд на 1. Таким образом часы показывают только время зарядки.

Далее микроконтроллер высчитывает средний ток за минуту. Для этого показания зарядного тока делятся на 60. Целое число записываются в счётчик, а остаток от деления потом прибавляется к следующему измеренному значению тока,и уже потом эта сумма делится на 60. Сделав, таким образом, 60 измерений за 1 минуту в счётчике будет число среднего значения тока за минуту.
При переходе показаний секунд через ноль среднее значение тока в свою очередь делится на 60(по такому же алгоритму). Таким образом счётчик ёмкости увеличивается 1 раз в минуту на величину одна шестидесятая от величины среднего тока за минуту. После этого счётчик среднего значения тока обнуляется и подсчёт начинается сначала. Каждый раз, после подсчёта ёмкости зарядки, производится сравнение измеренной ёмкости и заданной, и при их равенстве на дисплей выдаётся сообщение - "Зарядка завершена", а во второй строке - значение этой ёмкости зарядки и напряжение. На выводе 2 микроконтроллера (RA5) появляется низкий уровень, что приводит к отключению реле. Зарядное устройство отключится от сети.


Рис.5

Наладка устройства сводится только к установке правильных показаний зарядного тока (R1 R5) и входного напряжения (R4) с помощью эталонного амперметра и вольтметра.

Теперь о шунтах.
Для зарядного устройства на ток до 1000 мА можно использовать блок питания на 15 в, в качестве шунта резистор на 0.5-10 Ом мощностью 5Вт (меньшее значение сопротивления будет вносить меньшую погрешность в измерение, но затруднит точную настройку тока при калибровки прибора), и последовательно с заряжаемым аккумулятором переменное сопротивление на 20-100 Ом, которым и будет выставляться величина зарядного тока.
Для зарядного тока до 10А потребуется изготовить шунт из высокоомной проволоки подходящего сечения на сопротивление 0,1 Ом. Проведённые испытания показали, что даже при сигнале с токового шунта равным 0,1 вольт настроечными резисторами R1 и R3 можно легко установить показания тока в 10 А.

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

Перед первым включением подстроечные резисторы установить в среднее положение.

В качестве шунта для варианта прошивки на малые токи можно применить 2 параллельно соединенных резистора млт-2 1 Ом.

В приставке можно применить индикатор WH1602D , но придется поменять местами выводы 1 и 2. А вообще- лучше свериться с документацией на индикатор.

Индикаторы фирмы МЭЛТ не будут работать, из-за несовместимости работы по 4-х битному интерфейсу.

При желании, можно подключить подсветку индикатора через токоограничительный резистор 100 Ом

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

Рис.6. Определение емкости заряженного аккумулятора

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

(От автора) Приставка испытывалась с современным импульсным зарядным устройством для автомобильных аккумуляторов,
Данные устройства обеспечивают стабильное напряжение и ток с минимальными пульсациями.
При подсоединении же приставки к старому зарядному устройству (понижающий трансформатор и диодный выпрямитель) мне не удалось настроить показания зарядного тока из-за больших пульсаций.
Поэтому было решено изменить алгоритм измерения зарядного тока контроллером.
В новой редакции контроллер делает 255 измерений тока за 25 милисекунд (при 50Гц - период составляет 20 милисекунд). И из сделанных измерений выбирает самое большое значение.
Также происходит измерение входного напряжения, но выбирается наименьшее значение.
(При нулевом зарядном токе напряжение должно быть равно ЭДС аккумулятора.)
Однако при такой схеме перед стабилизатором 7805 необходимо поставить диод и сглаживающий конденсатор (>200 мкФ)на напряжение не менее выходного напряжения зарядного
устройства. Плохо сглаженное напряжение питания микроконтроллера приводило к сбоям в работе.
Для точной установки показаний приставки рекомендуется использовать многооборотные подстроечные резисторы или ставить дополнительные резисторы последовательно с подстроечными (подобрать экспериментально).
В качестве шунта для приставки на 10 А я пробовал использовать кусок аллюминиевого провода сечением 1,5 мм длиной около 20 см -прекрасно работает.

Этот измеритель емкости может измерять емкость конденсаторов с разрешением 1 пФ в нижнем конце диамазона. Максимальная измеряемая емкость - 10000 мкФ. Реальная точность не известна, но линейная ошибка лежит в пределах максимум 0.5 % , и обычно меньше 0.1% (получено измерением параллельно подключенных нескольких конденсаторов). Наибольшие затруднения возникают при измерении электролитических конденсаторов большой емкости.

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

Измеритель емкости имеет систему меню, которая в том числе позволяет откалибровать нулевое значение и емкость в 1 мкФ. Калибровка сохраняется в EEPROM.

Для проекта был выбран один из самых маленьких чипов - Атмега8. Схема питается от 9-вольтовой батарейки через линейный регулятор 7805.

Прибор может работать в трех режимах: измерение в нижнем диапазоне, в верхнем диапазоне, и в режиме разрядки. Эти режимы определяются состоянием выводов PD5 и PD6 контроллера. Во время разрядки PD6 имеет лог. 0 и кондерсатор разряжается через резистор R7 (220 Ом). В верхнем диапазоне измерений PD5 имеет лог. 1, заряжая конденсатор через R8 (1.8K) и PD6 находится в Z-состоянии чтобы позволить аналоговому компаратору сравнивать напряжение. В нижнем диапазоне измерений PD5 также находится в Z-состоянии, и конденсатор заряжается только через R6 (1.8MОм).

В качестве индикатора может использоваться любой дисплей на контроллере HD44780 размером 16x2 символов. Разводка коннектора дисплея показана на этом рисунке:

Устройство собрано на макетной плате и размещено в простом прямоугольном пластиковом корпусе. В крышке корпуса вырезаны отверстия под индикатор, кнопку и светодиод, которые закреплены термоклеем:

Программа измерителя емкости

В устройстве можно использовать контроллера atmega8 и atmega48/88/168 семейства. При замене контроллера в программе нужно изменить строку, отвечающую за конфигурацию таймера конкретного контроллера.

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

Прибор для измерения емкости аккумулятора

Емкость аккумулятора - это параметр, который определяет объем энергии, отдаваемый батареей при определенном напряжении за один час. Измеряется он в А/ч (Ампер в час), и зависит от которую определяют специальным устройством - ареометром. При покупке новой батареи все технические параметры производитель указывает на корпусе. Но эту величину можно определить и самому. Для этого существуют специальные приборы и методы.

Самый простой способ - это взять специальный тестер, например "Кулон". Это современный прибор для измерения емкости автомобильного аккумулятора, а также его напряжения. В этом случае вы затратите минимальное количество времени и получите достоверный результат. Для проверки необходимо подключить прибор к клеммам батареи и в течение нескольких секунд он определит не только емкость, а также напряжение аккумулятора и состояние пластин. Однако существуют и другие емкости АКБ.

Первый метод (классический)

К примеру, мультиметр можно использовать, как прибор для измерения емкости аккумулятора автомобиля, но с его помощью точных показаний вы не получите. Обязательным условием для данного метода (его называют методом контрольной разрядки) является полный заряд батареи. Для начала необходимо подключить к аккумулятору мощный потребитель (вполне подойдет обычная лампочка мощностью 60Вт).


После необходимо собрать цепь, которая состоит из мультиметра, АКБ, потребителя, и подать нагрузку. Если лампочка в течение 2 минут не меняет своей яркости (в противном случае аккумулятор восстановлению не подлежит), снимаем показания прибора в определенные интервалы времени. Как только показатель упадет ниже стандартного напряжения батареи (под нагрузкой она составляет 12В), начнется ее разряд. Теперь, зная промежуток времени, который потребовался на полное опустошение запаса энергии и ток нагрузки потребителя, необходимо перемножить эти значения. Произведение этих величин и является реальной емкостью АКБ. Если полученные значения отличаются от паспортных данных в меньшую сторону, необходима замена батареи. Этот метод дает возможность определить емкость любой АКБ. Недостатком данного метода являются большие затраты времени.

Второй метод

Также можно воспользоваться методом, при котором аккумулятор разряжают через резистор, применяя специальную схему. Используя секундомер определяем время, затраченное на разряд. Так как энергия будет теряться при напряжении в пределах 1 Вольта, мы с легкостью определим воспользовавшись формулой I=UR, где I - сила тока, U - напряжение, R - сопротивление. При этом необходимо избежать полной разрядки батареи, используя, например, специальное реле.

Как сделать прибор самостоятельно

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

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

В данной модели используется расширенная шкала, благодаря чему достигается высокая точность измерений. Имеется встроенное нагрузочное сопротивление. Шкала разделена на два диапазона (0-10 В и 10-15 В), что дает дополнительное снижение погрешности измерений. Устройство также имеет 3-х вольтовую шкалу и другой вывод измерительного приспособления, давая возможность проверки отдельных банок АКБ. Шкала на 15В достигается благодаря снижению на диоде и стабилитроне напряжения. Величина тока устройства возрастает, если значение напряжения превышает уровень открытия стабилитрона. При подаче напряжения ошибочной полярности защитную функцию выполняет диод.

На схеме: R1- передает стабилитрону требуемый ток; R2 и R3 - резисторы, подобранные для микроамперметра М3240; R4 - определяет ширину узкого диапазона шкалы; R5 - нагрузочное сопротивление, включается тумблером SB1.

Сила тока нагрузки определяется по закону Ома. В расчет принимается нагрузочное сопротивление.

Прибор для измерения емкости аккумулятора АА

Емкость аккумуляторов типа АА измеряется в мА/ч (миллиампер в час). Для измерения таких батарей можно применять специальные зарядные устройства, которые определяют ток, напряжение и емкость батареи. Примером такого устройства является прибор для измерения емкости аккумулятора AccuPower IQ3, который имеет блок питания с диапазоном напряжения от 100 до 240 Вольт. Для измерения потребуется вставить аккумуляторы в устройство, и на дисплее появятся все необходимые параметры.

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

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

Более точные показания можно получить, воспользовавшись еще одним методом, для которого вам потребуется полностью заряженный АКБ, секундомер, мультиметр и потребитель (можно использовать, например, фонарик). Подключаем потребитель к аккумулятору, и при помощи мультиметра определяем ток потребления (чем он меньше, тем более достоверны результаты). Засекаем время, в течение которого светил фонарик, и полученный результат умножаем на ток потребления.

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

Для микроконтроллера ATmega8 в корпусе TQFP32


Для микроконтроллера ATmega8 в корпусе PDIP

Несколько вариантов печатных плат можно .

Характеристики измерителя А/В

  • измеряемое напряжение: 0 В – 30 В, шаг 10 мВ;

  • измеряемый ток: 0 А – 99 А, шаг 10 мА;
  • возможно отображение измеряемых величин на LCD дисплее (однострочном или двухстрочном).

  • Схема подключения этого универсального измерителя производится согласно рисунка:


    Измерение тока проводится с использованием шунта, который подключен последовательно с нагрузкой в цепи отрицательной (общей) клеммы блока питания. Устройство запитывается от основного БП. Дополнительной функцией, которую выполняет микроконтроллер, является управление вентилятором охлаждения радиатора выходного транзистора блока питания.




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

    Внутреннее разрешение вольтамперметра по диапазону измерения тока рассчитывается согласно выражения:

    Разрешение [мА] = 1/(R[Ом]х3.2)


    Падение напряжения на шунте не должно превышать 2.4 В, поэтому значение сопротивления шунта должно быть меньше 2.4/Imax[A].



    Фуз-биты

    При программировании и установке Fuse-битов необходимо учитывать, что микроконтроллер должен быть настроен на работу от внутреннего RC генератора 1 МГц, а также необходимо установить бит BODEN . Прошивки для .

    Настройка цифрового вольтамперметра



    Кнопка S1 – сброс/установка параметров. Для входа в режим установки измерителя надо удерживая кнопку нажатой, подать питание на схему. Первый параметр для настройки – опорное напряжение для АЦП МК. Оно является основным фактором погрешности измерений. Необходимо измерить опорное напряжение на выводе 20 микроконтроллера (для микроконтроллера в корпусе PDIP – вывод 21). Измеренное значение надо прописать в этом «сервисном меню» при помощи этой же кнопки S1 , иначе, по умолчанию, принимается значение опорного напряжения Vref = 2.56 В (соответственно техническому описанию на микроконтроллер).

    Установка значения сопротивления резистора-шунта. Если номинал шунта известен, то нажатиями на кнопку S1 необходимо добиться отображения на дисплее соответствующего значения и затем не нажимать кнопку в течении 5 с для сохранения значения. Если значение сопротивления шунта неизвестно, то необходимо на выход блока питания подключить амперметр, выставить некоторый ток при помощи регулятора ограничения тока БП и нажать кнопку S1 . Кнопку необходимо нажимать, пока показания амперметра и нашего устройства (с правой стороны на дисплее, с левой стороны отображается значение шунта) не станут равными. Для сохранения параметров кнопку не нажимать в течении 5 секунд. Также S1 используется для сброса значения электрической емкости при зарядке Li аккумуляторов.

    Сопротивление R9 – точная настройка поддиапазона делителя напряжения. Для устранения ошибки преобразования АЦП диапазон измерений разбит на два поддиапазона 0 В – 10 В и 10 В – 30 В. Для настройки необходимо на выход блока питания подключить вольтметр и установить выходное напряжение на уровне около 9 В, и регулируя R9 добиться одинаковых показаний вольтметра и нашего устройства.

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

    Сопротивление R1 – регулировка контрастности LCD. Если после сборки устройства на дисплее ничего не отображается, то сперва необходимо отрегулировать контрастность дисплея.

    Разъём J1 – подключение вентилятора. Коннектор J2 – питание модуля вольтамперметра (+12 В). Если ваш блок питания имеет выход стабилизированного напряжения +12 В, то его можно подключить к этому коннектору, и в таком случае можно не использовать в схеме регулятор напряжения U2. Такое решение имеет свои плюсы т.к. возможно подключить более мощный вентилятор охлаждения. Если выхода +12 В у вашего блока питания нет, то этот коннектор необходимо оставить не подключенным.

    Разъём J3 – питание модуля вольтамперметра. Напряжение питания +35 В подается с диодного моста блока питания. Перед подключением необходимо уточнить параметры используемого регулятора напряжения U2 и уровень напряжения с диодного моста, чтобы не повредить регулятор U2. Но с другой стороны, минимальное напряжение, подаваемое на этот коннектор, не должно быть ниже 9 В или 6.5 В, если используются регуляторы с низким падением напряжения (LDO). Данный коннектор должен быть подключен независимо от того, подключен ли коннектор J2 к питанию +12 В.

    Разъём J4 – подключение линий измерения напряжения и тока.

    В последнее время я начал замечать, что мой смартфон стал разряжаться быстрее. Поиски программного «пожирателя» энергии плодов не принесли, поэтому стал задумываться, не пришло ли время заменить АКБ. Но абсолютной уверенности в том, что причина в батарее не было. Поэтому прежде чем заказывать новый аккумулятор решил попробовать измерить реальную емкость старого. Для этого было решено собрать простой измеритель емкости АКБ, тем более что идея эта вынашивалась уже давно – уж очень много батареек и аккумуляторов окружает нас в повседневной жизни, и было бы неплохо иметь возможность время от времени тестировать их.

    Сама идея, лежащая в основе работы устройства, крайне проста: есть заряженный аккумулятор и нагрузка в виде резистора, нужно лишь измерять ток, напряжение и время в ходе разряда АКБ, и по полученным данным рассчитать его емкость. В принципе, можно обойтись вольтметром и амперметром, но сидеть за приборами несколько часов удовольствие сомнительное, поэтому намного проще и точнее можно сделать это используя регистратор данных. Я в качестве такого регистратора использовал платформу Arduino Uno.

    1. Схема

    С измерением напряжения и времени в Arduino проблем нет – есть АЦП, но чтобы измерить ток нужен шунт. У меня появилась идея использовать сам нагрузочный резистор в качестве шунта. То есть, зная на нем напряжение и предварительно измерив сопротивление, мы всегда можем рассчитать ток. Поэтому простейший вариант схемы будет состоять лишь из нагрузки и АКБ, с подключением к аналоговому входу Arduino. Но было бы неплохо предусмотреть отключение нагрузки по достижению порогового напряжение на батарее (для Li-Ion это обычно 2,5-3В). Поэтому я предусмотрел в схеме реле, управляемое цифровым пином 7 через транзистор. Конечный вариант схемы на рисунке ниже.

    Все элементы схемы я разместил на кусочке макетной платы, которая устанавливается прямо на Uno. В качестве нагрузки использовал спираль из нихромовой проволоки толщиной 0,5мм, имеющей сопротивление около 3 Ом. Это дает расчетное значение тока разряда 0,9-1,2А.

    2. Измерение тока

    Как было сказано выше ток рассчитывается исходя из напряжения на спирали и её сопротивления. Но стоит учесть, что спираль нагревается, а сопротивление нихрома довольно сильно зависит от температуры. Чтобы компенсировать ошибку я просто снял вольт-амперную характеристику спирали, используя лабораторный блок питания и давая ей прогреться перед каждым измерением. Далее вывел в Excel уравнение линии тренда (график ниже), которое дает довольно точную зависимость i(u) с учетом нагрева. Видно, что линия не прямая.

    3. Измерение напряжения

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

    4. Программа

    Код не представляет из себя ничего сложного:

    Текст программы

    #define A_PIN 1 #define NUM_READS 100 #define pinRelay 7 const float typVbg = 1.095; // 1.0 -- 1.2 float Voff = 2.5; // напряжение выключения float I; float cap = 0; float V; float Vcc; float Wh = 0; unsigned long prevMillis; unsigned long testStart; void setup() { Serial.begin(9600); pinMode(pinRelay, OUTPUT); Serial.println("Press any key to start the test..."); while (Serial.available() == 0) { } Serial.println("Test is launched..."); Serial.print("s"); Serial.print(" "); Serial.print("V"); Serial.print(" "); Serial.print("mA"); Serial.print(" "); Serial.print("mAh"); Serial.print(" "); Serial.print("Wh"); Serial.print(" "); Serial.println("Vcc"); digitalWrite(pinRelay, HIGH); testStart = millis(); prevMillis = millis(); } void loop() { Vcc = readVcc(); //считывание опорного напряжения V = (readAnalog(A_PIN) * Vcc) / 1023.000; //считывание напряжения АКБ if (V > 0.01) I = -13.1 * V * V + 344.3 * V + 23.2; //расчет тока по ВАХ спирали else I=0; cap += (I * (millis() - prevMillis) / 3600000); //расчет емкости АКБ в мАч Wh += I * V * (millis() - prevMillis) / 3600000000; //расчет емкости АКБ в ВтЧ prevMillis = millis(); sendData(); // отправка данных в последовательный порт if (V < Voff) { //выключение нагрузки при достижении порогового напряжения digitalWrite(pinRelay, LOW); Serial.println("Test is done"); while (2 > 1) { } } } void sendData() { Serial.print((millis() - testStart) / 1000); Serial.print(" "); Serial.print(V, 3); Serial.print(" "); Serial.print(I, 1); Serial.print(" "); Serial.print(cap, 0); Serial.print(" "); Serial.print(Wh, 2); Serial.print(" "); Serial.println(Vcc, 3); } float readAnalog(int pin) { // read multiple values and sort them to take the mode int sortedValues; for (int i = 0; i < NUM_READS; i++) { delay(25); int value = analogRead(pin); int j; if (value < sortedValues || i == 0) { j = 0; //insert at first position } else { for (j = 1; j < i; j++) { if (sortedValues <= value && sortedValues[j] >= value) { // j is insert position break; } } } for (int k = i; k > < (NUM_READS / 2 + 5); i++) { returnval += sortedValues[i]; } return returnval / 10; } float readVcc() { // read multiple values and sort them to take the mode float sortedValues; for (int i = 0; i < NUM_READS; i++) { float tmp = 0.0; ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); ADCSRA |= _BV(ADSC); // Start conversion delay(25); while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both tmp = (high << 8) | low; float value = (typVbg * 1023.0) / tmp; int j; if (value < sortedValues || i == 0) { j = 0; //insert at first position } else { for (j = 1; j < i; j++) { if (sortedValues <= value && sortedValues[j] >= value) { // j is insert position break; } } } for (int k = i; k > j; k--) { // move all values higher than current reading up one position sortedValues[k] = sortedValues; } sortedValues[j] = value; //insert current reading } //return scaled mode of 10 values float returnval = 0; for (int i = NUM_READS / 2 - 5; i < (NUM_READS / 2 + 5); i++) { returnval += sortedValues[i]; } return returnval / 10; }

    Каждые 5 секунд данные о времени, напряжении батареи, токе разряда, текущей емкости в мАч и ВтЧ, а также напряжении питания передаются в последовательный порт. Ток рассчитывается по полученной в п. 2 функции. По достижении порогового напряжения Voff тест прекращается.
    Единственным, на мой взгляд, интересным моментом в коде я бы выделил использование цифрового фильтра. Дело в том, что при считывании напряжения значения неизбежно «пляшут» вверх-вниз. Сначала я пытался уменьшить этот эффект просто сделав 100 измерений за 5 секунд и взяв среднее. Но результат по-прежнему меня не удовлетворил. В ходе поисков я наткнулся на такой программный фильтр. Работает он похожим образом, но вместо усреднения он сортирует все 100 значений измерений по возрастанию, выбирает центральные 10 и высчитывает среднее из них. Результат меня впечатлил – флуктуации измерений полностью прекратились. Я решил использовать его и для измерения внутреннего опорного напряжения (функция readVcc в коде).

    5. Результаты

    Данные из монитора последовательного порта в несколько кликов импортируются в Excel и выглядят следующим образом:

    В случае с моим Nexus 5 заявленная ёмкость аккумулятора BL-T9 – 2300 мАч. Измеренная мной – 2040 мАч при разряде до 2,5 В. В реальности контроллер вряд ли позволяет сесть батарее до такого низкого напряжения, скорее всего пороговое значение 3В. Ёмкость в этом случае 1960 мАч. Полтора года службы телефона привели к просадке емкости примерно на 15%. С покупкой новой АКБ было решено повременить.
    С помощью данного тестера было разряжено уже несколько других Li-Ion аккумуляторов. Результаты выглядят очень реалистично. Измеренная емкость новых АКБ совпадает с заявленной с отклонением менее 2%.
    Данный тестер подойдет и для металл-гидридных пальчиковых аккумуляторов. Ток разряда в этом случае составит около 400 мА.