Замеренный пару лет назад литий (по схеме от Бодрого 2014) - 1400 мАч.
Пару лет хранения в полностью заряженном виде - 862 мАч.
Почти вдвое. Пусть устройство Бодрого менее точное. Но все же разница очевидна.
Поэтому хранить надо правильно.
Аккум, замеренный на минимальном и максимальном токе разряда - 81 и 76 мАч.
Добавил разистор.
Пост № 186 дополнил.
Заодно вроде ушел еще один недостаток, устройство при пропадании 5 вольт питания не так активно есть батарею. Дисплей уже не светится и все сбрасывается.
Схему не перирисовывал. Просто на плате внес некоторые исправления.
Что изменено:
Резисторы R2, R7, R9, R12, R16 заменены перемычками. Между базами и эмиттерами всех КТ315 добавлены резисторы подтяжки (можно использовать от 4,7к до 10к).
Добавлены блокирующие конденсаторы по 100 нанофарад (104) в нескольких местах.
Добавлены LC фильтры на питание Ардуино и питание дисплея (развязка по питанию).
Если вы используете импульсный источник питания, то по входу с него надо добавить синфазный фильтр.
Дополняю 03.09.19.
Вчера прогнал пару аккумов небольшой емкости. Все норм. Прибор работает красиво. Мне понравилось.
А сегодня после часа работы кракозяблы и все. При перезапуске шашечки. Замена ардуино привела к такому же эффекту.
Запустить прибор больше так и не удалось.
Выпаял транзисторы. Тестер радиодеталей говорит, что они живые.
Словом я в тупике. С этим прибором у меня не сложилось. В чем дело сказать не могу. Схема не та, либо программа не всегда корректно себя ведет - не знаю. Возможно и транзисторы левые. Может быть мои переделки оказались губительными.
Очень жаль. Прибор в работе мне понравился.
А Ардуинки теперь мне придется проверять. Не выгорели ли порты.
Словом я в тупике. С этим прибором у меня не сложилось. В чем дело сказать не могу. Схема не та, либо программа не всегда корректно себя ведет - не знаю.
с крокозябрами на экране проблема скорее всего программная - надо отлаживать код, а не резисторы методом тыка подбирать.
Кракозябр не видел ни разу, юзаю не меньше года. Несколько повторивших тоже не жаловались на подобное поведение.
Я бы смотрел в сторону замены импульсного бп на трансформаторный с нормальным стабилизатором на 7805 и подпайки ардуины и дисплея на кусочки проводков, а не установки в панельку.
Лекс 59 пишет:
Резисторы R2, R7, R9, R12, R16 заменены перемычками.
А Ардуинки теперь мне придется проверять. Не выгорели ли порты.
Резисторы там стояли как раз на защиту портов, на работу влияния оказывать не должны.
Кракозябр не видел ни разу, юзаю не меньше года. Несколько повторивших тоже не жаловались на подобное поведение.
Я бы смотрел в сторону замены импульсного бп на трансформаторный с нормальным стабилизатором на 7805 и подпайки ардуины и дисплея на кусочки проводков, а не установки в панельку.
Резисторы там стояли как раз на защиту портов, на работу влияния оказывать не должны.
Тоже думал про аналоговый БП. Лень матушка и габариты. Но с фильтрами вход был достаточно чистый. Осциллограф показывал помехи в пределах 10 милливольт. Немного плыл под нагрузкой 5-5,2 вольта. В пределах допустимого для МК по максимуму.
Удаление резисторов по контролирующим входам повышало точность вольтметров. В разных режимах отклонение уменьшилось 0,04 до 0,09 вольта.
С резисторами доходило до 0,15 вольта, если правильно помню.
Сейчас пока остыну. Транзисторы попробую заменить. Возможно на зарубежные аналоги.
Попробую видимо с исходной программой.
Кстати началось все странно еще вчера. Поставил 18650 с разборки. Он заряжался где то до 4,08, а потом напруга начала медленно падать. И пошел нагрев аккума. Хотя заряд подавался вроде нормально (проверял состояние портов тестером). Я решил, что возможно аккум железный и остановил все.
Продолжил уже сегодня в режиме железных. И где-то в середине крыша и съехала.
Возможно аккум был левый. Но тогда таких одинаковых у меня два. Посмотрел по обозначению сегодня - литий-ион.
Да и ардуинки еще не проверил. Запасная есть, но жаба пока мешает. Не хотел на нее ноги распаивать.
На панельки я не грешу. У меня на них довольно много приборов уже. Верой и правдой.
Удаление токоограничительных резисторов на А0 - А4.
При заряде А1 замыкается на +5 вольт через сопротивление открытого транзистора.
При разряде А2, А3 через разрядные резисторы на землю. Через открытые разрядные транзисторы на плюс батареи.
Узкое место пожалуй А1 и А0. Если порты приоткрыты одновременно, то плюс батареи садится на питание через R5.
На практике глюки выглядели как просадки питания аруино. Начинал помаргивать светодиод ардуины и в бузере шел треск.
Словом, резисторы удалять нельзя. Пожалуй кроме R2.
Описать, что происходит внутри ардуино я не могу. Как там открываются-закрываются порты. Возможно дело действительно в неопределенности состояния портов.
Кроме того, еще по Пультоскопу я уяснил, что входное сопротивление АЦП меги 328 (как и других мег) - штука странная. Там на входе кондер малой емкости. И в момент его заряда сопротивление входа равно нулю. Т.е. то ноль, то очень большая величина. Возможно дело в этом.
В принципе, попадание напряжения питания на порты не должно быть опасно для ардуино. Как и на землю. Но возможные сквозные токи при переключениях могут видимо ее и убить.
Проверить эти две ардуинки я не могу простыми средствами. Только если через программатор заливать и пробовать. Почему то у меня не сложилась дружба с ТТЛ переходником для этих ардуин. Но это не вопрос. Откопал в закромах еще пару.
Пока думаю. Если у кого есть соображения по поводу состояний портов ардуино и путей их развязки, буду рад.
Давненько я таких примитивных косяков не допускал. СМД перемычка, соединяющая землю ардуино и землю силовой части, была непропаяна с одной стороны. Т.е. была нестабильная земля. Неудивительно, что у ардуино ехала крыша.
Плата по первому варианту, с резисторами, кроме R2.
Силовая часть и микроконтроллер должны питаться от одного источника, иначе будет показывать среднюю температуру по палате. В качестве опорного при замере берётся напряжение питания ардуины vcc.
Понял. Приму к сведению. Пока стоит на прогоне. Там в принципе разница невелика у меня. На силовую часть идет 5,09, на ардуине 5,05 после стабилизатора.
Кстати разница показаний вольтметра и тестера 0,04 вольта. Оба достаточно стабильны.
Позже переделаю на один стабилизатор. Импульсник по ссылке. Хочется иметь диапазон входных напряжений. Сейчас после этого импульсника около 30 мВ пульсации при зарядке.
подобрать коэффициент 512 в пределах плюс-минус 10. Одно значение - приблизительно 0,005V. Залить скетч с новым коэффициентом и сравнить показания прибора и внешнего вольтметра.
подобрать коэффициент 512 в пределах плюс-минус 10. Одно значение - приблизительно 0,005V. Залить скетч с новым коэффициентом и сравнить показания прибора и внешнего вольтметра.
Классно! Получается, что прибор насквозь настраиваемый. Понял.
Пока внедряю аналоговое питание на плату. На 7805. Общее для всей схемы. С радиатором. Поскольку питаю от Нокиевской зарядки, там 9-10 вольт. На стабилизаторе будет рассеиваться около 2 ватт.
Внедрю питание. Оттестирую на стабильность и буду делать точные настройки.
ТЛ431 у меня в схеме имел 2,47-2,48 вольта. Напряжение прибор показывал на 0,04-0,05 вольта больше образцового тестера. Скомпилировал скетч для коэффициента 505. Разница уменьшилась до 0,00-0,01. Приемлемо.
Некоторые соображения по схеме. Если для расчетов имеет значение лишь опорное на ТЛ431, то в дальнейшем имеет смысл делать опорное с настраиваемого опорного. Т.е. включить ТЛку по полной схеме с подстроечным резистором. В принципе можно подобным образом подгонять и шунты заряда и разряда. Включая параллельно основному резистору другие.
Я это к тому, что компилирование старых скетчей может оказаться проблематичным через несколько лет. Да и забывается все со временем. А Хекс остается хексом.
Да и при реализации прибора не на Ардуино, а на голом камне проще залить хекс. И настраивать прибор уже аппаратно.
А прибор этот, по моему убеждению, из разряда тех, которые должен иметь каждый радиолюбитель, вслед за ЛБП и тестером радиодеталей.
Это не айМакс, конечно. Но вещь весьма полезная.
1. Позволяет заряжать и тестировать литийжелезофасфатные.
2. Определять емкость на разных токах.
3. Оценивать пусть и примерно внутреннее сопротивление.
4. После проверки сразу заряжать аккум до напряжения хранения.
Таким образом tekagi спасибо за великолепную работу.
По реализации. Как я понимаю, питать ардуино все же лучше отдельно. Через внутренний стабилизатор. Он линейный и лучше фильтрует помехи. Дисплей можно цеплять туда же.
Силовую часть можно питать через 7805. Тогда входное напряжение в диапазоне от 8 до 12-15 вольт. Но 7805 нужно цеплять на радиатор. И чем выше входное напряжение, тем больший радиатор понадобится.
Плату можно использовать мою, с предыдущей страницы.
Транзисторы лучше подобрать с коэффициентом усиления не выше 100.
Я это к тому, что компилирование старых скетчей может оказаться проблематичным через несколько лет. Да и забывается все со временем. А Хекс остается хексом.
В скетче всё равно необходимо прописать номиналы резисторов, по возможности точно. ИМХО это в разы проще, чем подбирать номинал железно. Собрать скетч можно скачав старые версии ИДЕ. Ну и основное преимущество ардуины - возможность поправить код под свои хотелки. Можно, конечно, ТЛку настроить на 3 вольта и поставить многооборотный подстроечник для точного выставления опорного, но мне проще один раз поправить коэффициент в коде. Хекс для заливки в голый камень можно экспортировать из ИДЕ.
Лекс 59 пишет:
Силовую часть можно питать через 7805. Тогда входное напряжение в диапазоне от 8 до 12-15 вольт. Но 7805 нужно цеплять на радиатор. И чем выше входное напряжение, тем больший радиатор понадобится.
Силовую можно и через импульсный DC/DC. В принципе у меня схема целиком питается через китайский модуль на LM2596, плюс дополнительный электролит и керамика на плате тестера (на фото видно). На входе преобразователя вольт восемь-девять. Глюков не замечено. Компенсационный стабилизатор я упоминал чтобы исключить вероятность проникновения импульсных помех, когда у Вас девайс работал нестабильно.
Серьёзно к данному прибору относиться не стоит, это первый скетч, с которого я начинал знакомство с ардуиной (если не считать железячный "Helloworld" aka blink). Возможности и точность прибора ограничены, дорабатывать смысла не вижу (хотя просится ещё один пункт для современных аккумуляторов с химией на 4,35V). Есть желание собрать подобный девайс с возможностью плавной задачи тока заряда/разряда, но точно не в ближайшее время.
1. Понятия "Точное значение емкости" не существует. Емкость зависит от всего. Тока заряда, тока разряда, температуры заряда, температуры разряда. Это как минимум.
2. С практическими целями достигнутой уже точности вполне достаточно.
3. Роль зарядника в нем тоже реализована. Правда емкие аккумуляторы будет заряжать достаточно долго.
4. Дает возможность назначить напряжение заряда после тестирования.
Что касается остального.
Можно организовать настройку прибора програмно с записью в ЕЕР. Только насколько помню, в первую ячейку ничего лучше не писать. Баг какой то у AVR с этим делом. Если не путаю. Не программист.
И так же можно вносить поправки значений резисторов.
На счет плавного задания.
На счет разряда - не актуально. Трех достаточно. Если тестить силовые на десяток ампер - то там печка получится.
А вот ток заряда - не все с ним однозначно. Одно дело таблетка на 45 мАч, совсем другое 18650 на 3000 мАч. Заряжать их стоит по разному. Но это уже типа аймакса будет.
Пришло в голову. Вариант плавной зарядки. Ток можно регулировать вручную. Ардуино питать отдельно, а на входе силовой части регулируемый БП вольт от 4 и вольт до 6. На той же ЛМ317. Ток будет разным. Он по любому нужен в пределах 1А.
Силовую часть можно питать через 7805. Тогда входное напряжение в диапазоне от 8 до 12-15 вольт. Но 7805 нужно цеплять на радиатор. И чем выше входное напряжение, тем больший радиатор понадобится.
использовать DC-DC, там и так тепловыделение дай бог.
Я это к тому, что компилирование старых скетчей может оказаться проблематичным через несколько лет. Да и забывается все со временем. А Хекс остается хексом.
Да и при реализации прибора не на Ардуино, а на голом камне проще залить хекс. И настраивать прибор уже аппаратно.
Распространение программ хексом - это наследие "радиолюбительских" сайтов, где программировал лишь один из двадцати, а остальные умели только заливать готовый хекс :) В ардуино сообществе все наоборот, поэтому тут нужен исходник.
Несовместимость с новыми версиями ИДЕ - проблема надуманная, при наличии исходника код всегда можно адаптировать к изменениям софта. Более того, исходник можно собрать и под другой камень и даже портировать на другое семество МК (например, с АВР - на СТМ). С хексом фиг чего сделаешь.
Ну и последнее - к хексу надо подробное описание, что и как работает, команды, используемые пины... С исходником документация, конечно тоже нужна - но в разы меньше, все можно посмотреть в коде.
Это все, конечно, справедливо, когда понимаешь исходный код :) А если нашел программу в инете и она для тебя темный лес - тогда только и остается колхозить переменник на ТЛ-ку :)
Распространение программ хексом - это наследие "радиолюбительских" сайтов, где программировал лишь один из двадцати, а остальные умели только заливать готовый хекс :)....
Несовместимость с новыми версиями ИДЕ - проблема надуманная, при наличии исходника код всегда можно адаптировать к изменениям софта. Более того, исходник можно собрать и под другой камень и даже портировать на другое семество МК (например, с АВР - на СТМ). С хексом фиг чего сделаешь.
Ну и последнее - к хексу надо подробное описание, что и как работает, команды, используемые пины... С исходником документация, конечно тоже нужна - но в разы меньше, все можно посмотреть в коде.
Это все, конечно, справедливо, когда понимаешь исходный код :) А если нашел программу в инете и она для тебя темный лес - тогда только и остается колхозить переменник на ТЛ-ку :)
Ну да. Я именно оттуда. С радиолюбительских сайтов. Логику вы выстроили. Но ведь это не единственный вариант логики.
Осциллограф. Да собственно любая другая конструкция со сравнительно сложной схемой. И все. Это уже не уровень Ардуино. Это уже не только программа. Поэтому извините, но я считаю радиолюбительские сайты следующей ступенью развития.
Но это спор из разряда о "физиках и лириках". Т.е. бесперспективный.
Вы уверены, что через несколько лет сможете сходу восстановить, скомпилировать под другой камень и т.д.?
А с трудностями компиляции старых скетчей я уже столкнулся. Лично и непосредственно. Ну да, разобраться зачастую можно. Потратив кучу времени. А иногда и уперевшись, что например на ХР некоторые хексы не компилируются. И извесные в сети методы с заменой файла компилятора не помогают. И что? Систему срочно переустанавливать?
Поэтому, как было написано на дверях одного заведения: "Каждому свое".
И я, вполне возможно, стану "колхозить" переменник на ТЛку. Именно для того, чтобы любой начинающий мог повторить устройство. И нормально его настроить.
Если вам лично этого не нужно, то я рад за вас. Но лет через несколько вы вспомните этот разговор. Уверен.
извините, но я считаю радиолюбительские сайты следующей ступенью развития.
К сожалению, это не так. Радиолюбительство и программирование до сих пор развиваются параллельно, почти не зная друг о друге. Редко кто из "радиолюбителей" разбирается в программировании - и рекомендованный вами сайт "Радиосхемы" наглядное тому подтверждение. В большинстве проектов при неплохой схемотехнике уровень программирования начальный, причем с явным уклоном в аппаратное решение проблем. Смешно, но уже строя проект на основе МК, люди зачем то вставляют в схему внешние PWM или генераторы сигналов на NE555 , когда логично было бы решить это программно.
Впрочем, этот же подход демонстрируете и вы, когда тратите уйму времени на настройку схемы подбором номиналов компонентов, вместо того чтоб поменять одно число в программе.
Так что извините, назвать это "следующей ступенью" ну никак нельзя :)
Хотя соглашусь, что обратное тоже справедливо - многие из программистов слабо понимают в схемотехнике, что очень видно из их проектов. Так что увы - как уже сказал выше - это два параллельных мира.
Лекс, меня несколько коробит ваше желание взять чужой проект, подправить в нем пару резисторов и выложить его "обзор" на свой сайт, даже не спрашивая разрешения автора. Не знаю, может в среде радиолюбителей это почитается нормой, но в среде программистов на такое смотрят косо.
Вполне возможно, что автор-то не против - но вы хотя бы спросите его об этом? Может он не хочет, чтобы его проект уезжал на чужую площадку, может будет правильнее выложить там не "обзор", а ссылку на эту ветку.
Лекс, меня несколько коробит ваше желание взять чужой проект, подправить в нем пару резисторов и выложить его "обзор" на свой сайт, даже не спрашивая разрешения автора. Не знаю, может в среде радиолюбителей это почитается нормой, но в среде программистов на такое смотрят косо.
Вполне возможно, что автор-то не против - но вы хотя бы спросите его об этом? Может он не хочет, чтобы его проект уезжал на чужую площадку, может будет правильнее выложить там не "обзор", а ссылку на эту ветку.
Простите, а я уже выложил? Разве я давал основания полагать, что не буду спрашивать разрешения у Автора?
И, как минимум я сразу предупредил о планах. Но, как можете наблюдать, развиваю тему здесь и у себя на Радиосхемах даже нигде не упоминал о такой работе.
Теперь о смысле выкладывать там обзор.
Схему явно можно изменить. И пожалуй даже стоит. Но я самоучка. Некоторые вещи я знаю очень хорошо, но далеко не все.
Например стоит изменить параметры заряда. Вот у меня сейчас стоит на прогоне литий емкостью около 200 и уже пару часов медленно ползет от 3,9 вольта. А когда я питал устройство от 5,2 вольта (сейчас 5,09) заряд шел куда шустрее. Сейчас 4,09 и ток всего 48 мА. А что будет когда 2000-3000?
Имеет смысл сделать регулируемый ток заряда?
Но! Если Автор схемы и прошивки своего разрешения не даст, то я точно не стану выкладывать обзор где-либо. За других, естественно, поручиться не могу.
Так как, вы действительно убеждены, что устройство с хорошим потенциалом развития должно тихо скончаться здесь? Или стоит толкнуть его в широкую практику?
И вы, фактически, обвинили меня в непорядочности.
У автора я пока прямо не спрашивал. Но и предварительную работу пока не считаю законченной.
Например для себя точно буду модернизировать скетч под другие диапазоны (3,0-4,1 и 3,0-4,2). Пока не решил, но может снова переделаю под раздельное питание и с регулируемым входом.
Не будет разрешения, ну будет у меня лично устройство и все.
Разве я давал основания полагать, что не буду спрашивать разрешения у Автора?
Ну вообще-то да :) в сообщении #180 вы говорите об этом как о решенном "я планирую выложить обзор на сайте... где мне удобнее". Даже без оговорки "если автор не против".
Добавлю, ваши постоянные замечния, что вот сейчас вы всех осчастливите своими доработками - и тогда проект можно будет выкладывать - выглядят тоже евсьма невежливо. Особенно с учетом того, что многие из этих "доработок" вызваны тем, что вы просто не разобрались в проекте.
Ну вообще-то да :) в сообщении #180 вы говорите об этом как о решенном "я планирую выложить обзор на сайте... где мне удобнее". Даже без оговорки "если автор не против".
Добавлю, ваши постоянные замечния, что вот сейчас вы всех осчастливите своими доработками - и тогда проект можно будет выкладывать - выглядят тоже евсьма невежливо. Особенно с учетом того, что многие из этих "доработок" вызваны тем, что вы просто не разобрались в проекте.
Мда. Вы, разумеется имеете право относиться ко мне как угодно. Как впрочем и я к вам.
Ваши слова: "Особенно с учетом того, что многие из этих "доработок" вызваны тем, что вы просто не разобрались в проекте." говорят лишь о том, что это вы не разобрались в том, что мной движет.
Видимо вы органически не в состоянии представить, что человек может заботиться не только о себе. И никак не готовы признать неправоту и будете выкручиваться дальше.
Не знаю, какое такое "решенное дело" вы мне приписываете. Планирую, это еще вовсе не означает, что непременно собрался. Потому как сделать публикацию нормально это тоже труд. И еще не факт, что я на себя это возьму.
Но все. Вас лично в дальнейшем игнорирую.
Для информации такой нюанс: человек, как правило, судит об окружающих по себе. Т.е. то, что вы меня в ней обвиняете, говорит о том, что вы сами на такое готовы.
Ну а общаться с людьми непорядочными я не обязан.
Будет что сказать по делу - пообщаемся. По остальным поводам - нет.
Не знаю, какое такое "решенное дело" вы мне приписываете. Планирую, это еще вовсе не означает, что непременно собрался. Потому как сделать публикацию нормально это тоже труд. И еще не факт, что я на себя это возьму.
вот оно даже как... То есть вы остаетесь в полной уверенности, что ваша публикация на чужом сайте - это прям счастье для автора? И вы еще не решили, достоин ли он этого? :)))
Как я понял, все же вполне возможно питать силовую часть отдельно. И своим напряжением.
Сегодня сделал грубый прикидочный рассчет.
При питании силовой части 5,0 вольт максимальный ток зарядки при 2,9 вольтах будет составлять около 260 мА.
При питании 6 вольт максимальный ток будет около 460 мА. При этом на R5 будет рассеиваться около 1,1 вт.
Дальше увеличивать напряжение скорее всего не стоит. Печка получится. Да и вряд ли целесообразно.
Т.е. при 5 вольтах достаточно безопасно можно заряжать батареи емкостью примерно от 250 мАч.
Пока весь в сомнениях делать/не делать регулируемое питание. Надо ли мне это. Наиболее частый диапазон у меня в р-не 500-1000 мАч. Но при проверке емких батарей (2000-3000) время заряда сильно растянуто. Посмотрю, покатаюсь пока так. Там решу.
Падение напряжение на силовых транзисторах оказалось около 0,7 вольт для импортных (Т2, Т4 у меня) и около 1 вольта на КТ814. Но это так, для информации.
Вопрос.
Как я понимаю, точное значение сопротивления силовых балластных резисторов (они же шунты) оказывает значительное влияние на точность расчета тока (что не столь важно) и, главное, на точность расчета внутреннего сопротивления батареи.
Как по вашему мнению, с какой точностью имеет смысл указывать это сопротивление в скетче? Скажем два знака после запятой.
Конечно, вычислить сопротивление с такой точностью это отдельная дополнительная процедура. Но вполне возможная. Если пропустить ток в р-не 1 А и измерить падение напряжения. Имеет смысл заморачиваться, или достаточно "из-под тестера" (т.е плюс-минус 0,05 ома)? Т.е. суть вопроса в том, какие разряды Ардуино (или программа) берет в расчет?
Вопрос задаю чисто с познавательными целями. Т.к. вполне сознаю, что точное значение сопротивления батареи измеряется не так и достаточно проблематично. Да и не является столь уж необходимым. Спрашиваю потому, что скорее всего вы сами при разработке прибора задавались подобным вопросом. Если нет, то и ладно, удовлетворюсь прикидочным.
Пока планирую переделать Ваш скетч под свои нужды.
В частности выбор типа батареи:
1. Литий ион. Рабочий диапазон, практический. 3,0-4,1 вольта. (Стандартная зарядка ТП4056 обычно заряжает до 4,14-4,17 вольт).
Там нет рабочих и максимальных режимов. Литиевых элементов сейчас несколько видов, с разными граничными напряжениями заряда-разряда, указываемыми на этикетках или в даташитах. Что для одних недозаряд, то для других уже сильный перезаряд с уменьшением количества жизненных циклов, а то и пиротехническими эффектами.
Отпишитесь мне на мейл (есть на схеме).
Там нет рабочих и максимальных режимов. Литиевых элементов сейчас несколько видов.
Да. Это я просто так назвал. Для понимания. Это не академически правильные наименования. Естественно в прошивке это будет называться иначе. И вывод на дисплей будет иной. Как именно - обдумаю.
Я имел в виду Литий (и подобные) в реально используемом диапазоне в практических устройствах.
Да, их много видов. Для всех имеющихся у меня на данный момент предельное 4,2 вольта.
Зарядка в реальных устройствах будет догонять их до 4,14-4,17. А разряжать ниже 3 вольт не стоит. Т.е. на первом пункте будет стоять режим "А сколько я могу взять от этой батареи в реальной эксплуатации".
Второй пункт мне лично вряд ли будет полезен. Но пусть будет.
Литий феррофосфатные резко отличаются по рабочему диапазону и их стоит оставить отдельным пунктом. Мне пока не попадались.
Для любительского устройства, считаю достаточным.
На счет остального - хорошо. Понял. Немного позже.
Здравствуйте. Приношу свои извинения tekagi за долгую задержку. Ремонт. Которым пришлось заниматься срочно. Пришлось свалить в кучу все свои технические причиндалы, судорожно распихать по пакетам и засунуть далеко.
Сейчас дым немного развеялся и продолжил ковырять прибор.
Вот Ваш измененный скетч. Сегодняшний.
[code]
/*
История здесь arduino.ru/forum/proekty/tester-akkumulyatorov-dlya-lotka
*/
#include <util/delay.h>
#include <LiquidCrystal.h>
const float R5 = 5.2; //задаём сопротивление зарядного резистора R5
const float R10 = 23.1; //задаём сопротивление разрядного резистора R10
const float R15 = 9.9; //задаём сопротивление разрядного резистора R15
const int analogV = A0; //назначаем аналоговый вход аккума
const int analogVC = A1; //назначаем аналоговый вход заряда
const int analogVD = A2; //назначаем аналоговый вход разряда
const int analogVD2 = A3; //назначаем аналоговый вход разряда 2
const int analogV_TL431 = A4; //назначаем аналоговый вход коррекции напряжения
float coeff = 0.0; //поправка на нестабильность напряжения
float volt = 0.0; //задаем переменные
float R = 0.0; //внутреннее сопротивление аккумулятора
float voltC = 0.0; //Напряжение при заряде
float voltD = 0.0; //Напряжение при разряде
float voltD2 = 0.0; //Напряжение при разряде
float Vc = 0.0; //Конечное напряжение заряда
float Vd = 0.0; //Конечное напряжение разряда
float am = 0; //милиамперы
float amR = 0; //милиамперы, ток определения внутреннего сопротивления
float amR2 = 0; //милиамперы, ток определения внутреннего сопротивления
float amC = 0; //милиамперы заряд
float capvrem= 0; //временная емкость
float cap= 0; //емкость
float voltTEMP= 0; //временная переменная для рассчёта внутреннего сопротивления
byte counteR = 0; //счётчик циклов замера внутреннего сопротивления
byte knop = 0; //переменная для хранения состояния кнопки
byte knop_menu = 1; //переменная для хранения состояния кнопки
byte SEK = 0; //секунды
byte MIN = 0; //минуты
byte HOUR = 0; //часы
byte akk_type = 0; //переменная типа аккумулятора
byte discharge_type = 0; //переменная типа разряда
byte recharge_control = 0; //переменная для однократного подзаряда в конце
unsigned long prMillis = 0;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 19, 10); // 19 - pinA5
void setup()
{
pinMode(analogV , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogVC , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogVD , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogVD2 , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogV_TL431 , INPUT); //определяем тип порта (вход), АЦП
pinMode(2, INPUT); //определяем тип порта (вход), кнопка
pinMode(3, INPUT); //определяем тип порта (вход), кнопка
pinMode(13, OUTPUT); // бузер
pinMode(9, OUTPUT); // разряд
pinMode(8, OUTPUT); // заряд
pinMode(7, OUTPUT); //LED
pinMode(6, OUTPUT); //разряд2
lcd.begin(16, 2); // размер дисплея
lcd.clear(); // Чистим экран
menu(); //вызов меню для начальной конфигурации
}
void loop()
{
if (digitalRead(3)==HIGH) //нажатие кнопки "меню"
{
knop_menu=1;
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(7,LOW); //выключаем светодиод заряда
_delay_ms(100);
menu();
}
coeff = 501/(float (analogRead(analogV_TL431))); // считаем коэффициент погрешности опорного напряжения
volt = float (analogRead(analogV))*coeff*5.04/1024; // 5В - опорное напряжение
voltC = float (analogRead(analogVC))*coeff*5/1024; // Напряжение заряда
voltD = float (analogRead(analogVD))*coeff*5/1024; // Напряжение разряда
voltD2 = float (analogRead(analogVD2))*coeff*5/1024; // Напряжение разряда 2
if (digitalRead(2)==HIGH) //нажатие кнопки
{
tone(13, 1000, 70);
knop++;
lcd.clear(); //чистим экран
if (knop>4){knop=1; } // обнуляем четвёртое нажатие.
_delay_ms(250);
}
if (knop==0){ //сценарий устройство включено но незапущен тест
lcd.setCursor(0, 0);
lcd.print("Press 1Ch 2Rint ");
lcd.setCursor(0, 1);
lcd.print("3Dis 4FinCh ");
lcd.print(volt, 1);
lcd.print("V ");
_delay_ms(250);
}
//-------------------------------------------------
if (knop==1){ //отработка сценария зарядки после подключения
lcd.clear(); //чистим экран
cap= 0; //обнуляем переменные
am = 0;
amR = 0;
amR2 = 0;
amC = 0;
R = 0;
SEK = 0;
MIN = 0;
HOUR = 0;
counteR = 0;
voltTEMP = 0;
recharge_control = 0;
digitalWrite(7,LOW); //светодиод разряжено
if (volt<Vc)
{
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //отключаем ключ нагрузки
digitalWrite(6,LOW); //отключаем ключ нагрузки
amC=((voltC-volt)/R5)*1000; //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
lcd.setCursor(0, 0);
lcd.print("CHARGE: ");
lcd.print(volt); //выводим напряжение на аккумуляторе
lcd.print("V ");
lcd.setCursor(8, 1);
lcd.print("I=");
lcd.print(amC);
}
if(volt>=Vc) {knop = 2; tone(13, 1000, 150);} // фиксируем зарядку АКБ, переходим в проверку внутреннего сопротивления
_delay_ms(350);
}
//----------------------------------------------------------------------------------------------------
if (knop==2) //замер внутреннего сопротивления
{
if (counteR<=252)
{
if (counteR<=230) //первый цикл проверки
{
if (counteR==0) { lcd.clear(); } // Чистим экран
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
digitalWrite(6,LOW); //отключаем ключ нагрузки 2
digitalWrite(9,HIGH); //включаем ключ нагрузки
amR=(voltD/R10); //считаем ток
lcd.setCursor(0, 0);
lcd.print("Testing Rint ");
lcd.setCursor(13, 0); //ставим курсор в 14й столбец, первую строку (вспомогательные данные, можно закомментить строку)
lcd.print("R10"); //используемый резистор (вспомогательные данные, можно закомментить строку)
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(amR*1000,0); //выводим значение тока разряда в мА
lcd.print("mA "); //
lcd.print(volt,2); //выводим напряжение на аккумляторе под нагрузкой
lcd.print("V "); //
_delay_ms(500); //задержка
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(" "); //чистим строку
counteR++; //инкрементируем счётчик
if (counteR<=231) //окончание первого цикла проверки
{
voltTEMP = volt; //переносим значение напряжения под нагрузкой во временную переменную
}
}
if (counteR>230 and counteR<=250) //второй цикл проверки
{
if (counteR==231) { lcd.clear(); } // Чистим экран
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //отключаем ключ нагрузки
digitalWrite(6,HIGH); //включаем ключ нагрузки 2
amR2=(voltD2/R15); //считаем ток
lcd.setCursor(0, 0);
lcd.print("Testing Rint");
lcd.setCursor(13, 0); //ставим курсор в 14й столбец, первую строку
lcd.print("R15"); //используемый резистор (вспомогательные данные, можно закомментить строку)
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(amR2*1000,0); //выводим значение тока разряда в мА
lcd.print("mA "); //
lcd.print(volt,2); //выводим напряжение на аккумляторе под нагрузкой
lcd.print("V "); //
counteR++; //инкрементируем счётчик
_delay_ms(500); //задержка
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(" "); //чистим строку
}
if (counteR==251) //заканчиваем проверку сопротивления
{
R = ((voltTEMP-volt)/(amR2-amR)); //считаем внутреннее сопротивление аккумулятора
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
counteR++; //инкрементируем счётчик
lcd.clear(); // Чистим экран
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print("Rin="); //
lcd.print(R,3); //выводим значение внутреннего сопротивления
}
if (counteR>=252) //восстанавливаем заряд аккумулятора перед тестом ёмкости, переходим в разряд
{
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятор
lcd.setCursor(0, 0); //ставим курсор в первый столбец, первую строку
lcd.print("re-charging"); //дозарядка до полного
lcd.setCursor(11, 1); //ставим курсор в 12й столбец, вторую строку
lcd.print(volt); //вывод текущего напряжения на аккумуляторе
lcd.print("V"); //
_delay_ms(350);
lcd.setCursor(15, 0); //ставим курсор в 16й столбец, первую строку
lcd.print("*"); //мигающий значок заряда
_delay_ms(350);
lcd.setCursor(15, 0); //ставим курсор в 16й столбец, первую строку
lcd.print(" "); //мигающий значок заряда
lcd.setCursor(11, 1); //ставим курсор в 12й столбец, вторую строку
lcd.print(" "); //
if (volt>=Vc) //если зарядился - переходим в разряд
{
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
knop = 3; //фиксация окончания замера внутреннего сопротивления, переход к замеру ёмкости
tone(13, 1000, 150); //тональный сигнал смены цикла
}
}
}
}
//----------------------------------------------------------------------------------------------------------------
if (knop==3){ //проверка сценария для разрядки
lcd.clear(); // Чистим экран
if (volt>Vd)
{
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
if (discharge_type==1)
{
digitalWrite(9,HIGH); //включаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки
}
if (discharge_type==2)
{
digitalWrite(6,HIGH); //включаем ключ нагрузки
digitalWrite(9,LOW); //выключаем ключ нагрузки
}
if (discharge_type==3)
{
digitalWrite(6,HIGH); //включаем ключ нагрузки
digitalWrite(9,HIGH); //включаем ключ нагрузки
}
//#########цикл отсчета
if (millis()-prMillis>=5000){
prMillis=millis();
SEK=SEK+5;
if (discharge_type==1)
{
am=(voltD/R10)*1000; //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
}
if (discharge_type==2)
{
am=(voltD2/R15)*1000; //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
}
if (discharge_type==3)
{
am=((voltD/R10)*1000)+((voltD2/R15)*1000); //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
}
capvrem=am/720; cap=cap+capvrem; //считаем емкость в mAh, при замере раз в 5 сек (в часе 3600сек / 5 = 720)
if (SEK>59){SEK=0;MIN++;}
if (MIN>59){MIN=0;HOUR++;}
if (HOUR>23) HOUR=0;
}
//########################
lcd.setCursor(0, 0);
lcd.print("DisCh ");
lcd.print("I="); //вывод на экран
lcd.print(am, 0); //вывод на экран
lcd.print("mA "); //вывод на экран
lcd.setCursor(0, 1);
lcd.print(volt);
lcd.print("V Q="); //вывод на экран
lcd.print(cap, 0); //вывод на экран
lcd.print("mAh "); //вывод на экран
lcd.setCursor(12, 1);
}
_delay_ms(500);
if (volt<=Vd){knop=4; tone(13, 1000, 150);} //фиксация окончания разрядки и замера емкости
}
//-------------------------------------------------
if (knop==4){ //сценарий окончания подсчета емкости, вывод на экран и зарядка.
lcd.setCursor(10, 1);
lcd.print(volt, 1); //вывод на экран текущего напряжения аккумулятора
lcd.print("V");
switch (recharge_control)
{
case 0: //тест окончен, но аккумулятор полностью разряжен, выводим результаты на экран
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(7,LOW); //выключаем светодиод заряда
lcd.setCursor(0, 0); //выводим значение внутреннего сопротивления
lcd.print("R=");
lcd.print(R,3);
lcd.print(" ");
lcd.setCursor(8, 0);
if (HOUR<1){ lcd.print("00");} //вывод времени разряда на экран
else {lcd.print(HOUR);}
lcd.print(":");
if (MIN<1){ lcd.print("00");} //вывод на экран
else {lcd.print(MIN);}
lcd.print(":");
lcd.print(SEK);
lcd.setCursor(0, 1);
// lcd.print("Q="); //вывод на экран
lcd.print(cap, 1); //вывод на экран
lcd.print("mAh "); //вывод на экран
recharge_control=1; //инкремент счётчика
_delay_ms(5);
break; //выход из case
case 1: //тест окончен, результаты отображены, заряжаем
if (volt<(Vc - 0.3)) //после того как посчитали емкость заряжаем (до напряжения хранения)
{
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятора
lcd.setCursor(15, 1); //столбец 16, строка 2
lcd.print(" "); //мигаем звёздочкой индикатора заряда
_delay_ms(250);
lcd.setCursor(15, 1); //столбец 16, строка 2
lcd.print("*"); //мигаем звёздочкой индикатора заряда
_delay_ms(250);
}
if (volt>=(Vc - 0.3)) //после того как зарядили переходим к поддержанию заданного напряжения
{
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
digitalWrite(7,HIGH); //включаем светодиод заряда
recharge_control=2; //инкрементируем счётчик
tone(13, 500, 300);
_delay_ms(301);
tone(13, 700, 300);
_delay_ms(301);
tone(13, 900, 300);
_delay_ms(301);
}
break;
case 2:
if (volt<(Vc-0.5)) //после заряда поддерживаем напряжение
{
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятора
_delay_ms(150);
}
if (volt>=(Vc-0.5)) //после заряда поддерживаем напряжение
{
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
_delay_ms(500);
}
break;
}
}
}
void menu() //меню
{
knop=0; //обнуляем используемые переменные
akk_type=1; //по умолчанию Li-Ion
discharge_type=1; //по умолчанию минимальный ток разряда
_delay_ms(150); //задержка - антидребезг
while (knop_menu!=0) //пока не произведены начальные настройки остаёмся в меню
{
if (digitalRead(2)==HIGH) //нажатие кнопки
{
lcd.clear(); //чистим экран
knop++; //инкремент кнопки
tone(13, 1000, 70); //бипер
if (knop>3){knop=1; } // обнуляем нажатие
_delay_ms(75); //задержка - антидребезг
}
if (digitalRead(3)==HIGH) //нажатие кнопки
{
knop=0;
lcd.clear(); //чистим экран
knop_menu++; //инкремент кнопки
tone(13, 1000, 70); //бипер
if (knop_menu>3){knop_menu=1; } // обнуляем нажатие
_delay_ms(75); //задержка - антидребезг
}
switch(knop_menu) //выбор типа аккумулятора и тока разряда
{
case 1: //выбор типа аккумулятора
{
lcd.setCursor(0, 0); //индикация текущего типа аккумулятора
lcd.print(" akkum. type: ");
if (knop==0)
{
lcd.setCursor(0, 0);
lcd.print("change akk type?");
if (akk_type==1)
{
lcd.setCursor(0, 1);
lcd.print("Li-Ion 3.0V-4.1V");
}
if (akk_type==2)
{
lcd.setCursor(0, 1);
lcd.print("Li-Pol 2.9V-4.2V");
}
if (akk_type==3)
{
lcd.setCursor(0, 1);
lcd.print("Li-Fe 2.8V-3.6V ");
}
}
if (knop==1) //выбор литий-ионной батареи
{
lcd.setCursor(0, 1);
lcd.print("Li-Ion 3.0V-4.1V");
akk_type=1;
}
if (knop==2) //выбор литий-полимерной батареи
{
lcd.setCursor(0, 1);
lcd.print("Li-Pol 2.9V-4.2V");
akk_type=2;
}
if (knop==3) //выбор литий-железо-фосфатной батареи
{
lcd.setCursor(0, 1);
lcd.print("Li-Fe 2.8V-3.6V ");
akk_type=3;
}
_delay_ms(250);
break;
}
case 2: //выбор тока разряда
{
lcd.setCursor(0, 0);
lcd.print("discharge type: ");
if (knop==0)
{
lcd.setCursor(0, 0); //индикация текущей уставки тока разряда
lcd.print("change I disch.?");
if (discharge_type==1) //минимальный ток
{
lcd.setCursor(0, 1);
lcd.print("minimum current ");
}
if (discharge_type==2) //средний ток
{
lcd.setCursor(0, 1);
lcd.print("middle current ");
}
if (discharge_type==3) //максимальный ток
{
lcd.setCursor(0, 1);
lcd.print("maximum current ");
}
}
if (knop==1) //выбор минимального тока разряда (R10)
{
lcd.setCursor(0, 1);
lcd.print("minimal current ");
discharge_type=1;
}
if (knop==2) //выбор среднего тока разряда (R15)
{
lcd.setCursor(0, 1);
lcd.print("middle current ");
discharge_type=2;
}
if (knop==3) //выбор максимального тока разряда (R10+R15)
{
lcd.setCursor(0, 1);
lcd.print("maximum current ");
discharge_type=3;
}
_delay_ms(250); //задержка
break;
}
case 3: //сохранение параметров и переход к тесту
{
lcd.setCursor(0, 0);
lcd.print(" save and go ");
lcd.setCursor(0, 1);
lcd.print(" to test? ");
if(knop==1)
{
knop_menu=0;
if (akk_type==1)
{
Vd=3.0;
Vc=4.1;
}
if (akk_type==2)
{
Vd=2.9;
Vc=4.2;
}
if (akk_type==3)
{
Vd=2.8;
Vc=3.6;
}
}
_delay_ms(250); //задержка
break;
}
}
}
knop=0; //обнуляем переменные
knop_menu=0; //обнуляем переменные
}
[/code]
Что сделано в коде.
Естественно настройка под себя. Значения резисторов, напряжение на Vcc ардуинки (питание через RAW). Подгонка TL431 (2,46 вольта у меня).
Из важного: Добавлены в скетче в явном виде закрытие портов разряда. Без этого проверка на среднем токе разряда проходила некорректно. По факту были открыты оба порта 6 и 9, ну а ток считался естественно только с одного канала.
Видимо неопределенность состояний портов имеет место быть. Я уж на что только не грешил. И отсоединял нагрузки, просто повесив оба порта в воздухе и ардуинку менял (опасался, что накрылся порт). Словом упражнялся до тех пор, пока не догадался изменить скетч.
Естественно сделал заряд после проверки до напряжения хранения в конце. Удобная, кстати, фишка оказалась.
По железу.
Раздельное питание.
Источник - зарядка от мобильника. С него через синфазный фильтр напрямую на силовую часть.
И от него же через повышающий DC-DC (7-12 вольт) на RAW ардуинки.
Считаю, что питание от собственного аналогового стабилизатора ардуино пойдет на пользу точности и стабильности прибора.
Отдельное питание силовой части считаю очень полезным. Например можно использовать так называемые "адаптивные" быстрые зарядки. А при необходимости проверки АКБ малой емкости, можно запитывать схему пониженным напряжением, вплоть до 4,3 вольт, чтобы ток заряда не превышал допустимые для аккумуляторов.
А адаптивные зарядки (которые умеют повышать напряжение по мере роста тока в определенных пределах) позволяют сократить время заряда достаточно емких аккумуляторов. Что особенно удобно для 18650.
Пока не знаю, как можно увеличить достоверность замера внутреннего сопротивления батареи.
Видимо там надо кардинально менять математику.
Но и имеющийся уже в приборе прикидочный расчет на практике полезен тоже. Мне например позволил понять некоторые вещи про батареи от сотиков. Два внешне одинаковых аккума вели себя странно в схемах, куда пытался их применить. Оказалось, что их сопротивление сильно больше, чем у большинства аналогичных. И это видимо не деградация. Они разного срока выпуска. Т.е. использовать их можно, но только в устройствах с малым током потребления.
Таким образом прибор становится в ряд "маст хев" для многих радиолюбителей. Еще раз спасибо за интересную разработку.
Присоединился к ваше компании.
Немного переделал схему. Взял стандартную платку зарядки лития на Tp4056. На 8 отрезанную от 5в ногу этой микросхемы идёт управление с ардуины,ранее шедшее на транзистор заряда. Ардуино включает-выключает заряд.Ток заряда выбрал 1а,чтоб не сильно грелась мс. Для контроля тока использую 0.4ом резистор на входе. Ток считается как разница uпитания и Uпадения на резисторе деленный на резистор.
Спасибо Tekagi за тестер!! Повторил на макетке - всё работает хорошо, но есть вопрос.
На D9 и D6 при среднем разряде логическая 1, когда при среднем разряде должна быть только на D6, следовательно, что при средней разрядке, что при максимальной один и тот же ток разряда (у меня 400 mA), хотя на дисплее при среднем показывает 220 mA, а по факту открываются транзисторы T3, Т5. По отдельности режимы минимального и максимального разряда работают как положено, значит проблема программная. С железом всё ок! Пробовал разные версии скетча.
Несмотря на это, работой такого тестера аккумов доволен! :)
Ага, есть косяк. Если верно воспроизвёл - то он не проявляется при автоматической смене стадий тестирования, а только при принудительном переключении по кнопке. Причём если нажать кнопку при начальной стадии тестирования внутреннего сопротивления (по резистору R10) - то баг проявится на режиме среднего тока, если на второй (R15) - на режиме минимального тока.
В коде покопался, но не заливал в железо на тест. Код - какой откопал на харде, что за изменения были до этого - не помню) При желании фикс можно добавить в любой, две подсвеченные строчки в блоке разряда.
#include <util/delay.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
float R5 = 5.5; //задаём сопротивление зарядного резистора R5
float R10 = 22.3; //задаём сопротивление разрядного резистора R10
float R15 = 10.2; //задаём сопротивление разрядного резистора R15
int adc_TL431 = 512; //задаём напряжение на источнике опорного (в попугаях АЦП)
byte EEPROM_check = 0; //переменная проверки содержимого ЕЕПРОМ
const int analogV = A0; //назначаем аналоговый вход аккума
const int analogVC = A1; //назначаем аналоговый вход заряда
const int analogVD = A2; //назначаем аналоговый вход разряда
const int analogVD2 = A3; //назначаем аналоговый вход разряда 2
const int analogV_TL431 = A4; //назначаем аналоговый вход коррекции напряжения
float coeff = 0.0; //поправка на нестабильность напряжения
float volt = 0.0; //задаем переменные
float R = 0.0; //внутреннее сопротивление аккумулятора
float voltC = 0.0; //Напряжение при заряде
float voltD = 0.0; //Напряжение при разряде
float voltD2 = 0.0; //Напряжение при разряде
float Vc = 0.0; //Конечное напряжение заряда
float Vd = 0.0; //Конечное напряжение разряда
float am = 0; //милиамперы
float amR = 0; //милиамперы, ток определения внутреннего сопротивления
float amR2 = 0; //милиамперы, ток определения внутреннего сопротивления
float amC = 0; //милиамперы заряд
float capvrem= 0; //временная емкость
float cap= 0; //емкость
float voltTEMP= 0; //временная переменная для рассчёта внутреннего сопротивления
byte counteR = 0; //счётчик циклов замера внутреннего сопротивления
byte knop = 0; //переменная для хранения состояния кнопки
byte knop_menu = 1; //переменная для хранения состояния кнопки
byte SEK = 0; //секунды
byte MIN = 0; //минуты
byte HOUR = 0; //часы
byte akk_type = 0; //переменная типа аккумулятора
byte discharge_type = 0; //переменная типа разряда
byte recharge_control = 0; //переменная для однократного подзаряда в конце
unsigned long prMillis = 0;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 19, 10); // 19 - pinA5
void setup()
{
pinMode(analogV , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogVC , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogVD , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogVD2 , INPUT); //определяем тип порта (вход), АЦП
pinMode(analogV_TL431 , INPUT); //определяем тип порта (вход), АЦП
pinMode(2, INPUT); //определяем тип порта (вход), кнопка
pinMode(3, INPUT); //определяем тип порта (вход), кнопка
pinMode(13, OUTPUT); // бузер
pinMode(9, OUTPUT); // разряд
pinMode(8, OUTPUT); // заряд
pinMode(7, OUTPUT); //LED
pinMode(6, OUTPUT); //разряд2
lcd.begin(16, 2); // размер и инициализация дисплея
lcd.clear(); // Чистим экран
EEPROM.get(1, EEPROM_check); //читаем ячейку ЕЕПРОМ с адресом 1
if (EEPROM_check == 55) //если находим в ней внесённое при настройке значение
{
EEPROM.get(2, R5); //считываем из ЕЕПРОМ сопротивление зарядного резистора R5
EEPROM.get(6, R10); //считываем из ЕЕПРОМ сопротивление разрядного резистора R10
EEPROM.get(10, R15); //считываем из ЕЕПРОМ сопротивление разрядного резистора R15
EEPROM.get(14, adc_TL431); //считываем из ЕЕПРОМ напряжение на источнике опорного (в попугаях АЦП)
}
if ((digitalRead (2) == HIGH) && (digitalRead (1)) == HIGH) // если при включении прибора обнаружили зажатыми обе кнопки
{
menu_config();
}
else
{
lcd.setCursor(0, 0); //курсор в начало первой строки
lcd.print(" Tester Bat mod "); //заставка
_delay_ms(1000); //задержка заставки
lcd.clear(); // Чистим экран
}
menu(); //вызов меню для начальной конфигурации
}
void loop()
{
if (digitalRead(3)==HIGH) //нажатие кнопки "меню"
{
knop_menu=1;
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(7,LOW); //выключаем светодиод заряда
_delay_ms(100);
menu();
}
coeff = adc_TL431/(float (analogRead(analogV_TL431))); // считаем коэффициент погрешности опорного напряжения
volt = float (analogRead(analogV))*coeff*5/1024; // 5В - опорное напряжение
voltC = float (analogRead(analogVC))*coeff*5/1024; // Напряжение заряда
voltD = float (analogRead(analogVD))*coeff*5/1024; // Напряжение разряда
voltD2 = float (analogRead(analogVD2))*coeff*5/1024; // Напряжение разряда 2
if (digitalRead(2)==HIGH) //нажатие кнопки
{
tone(13, 1000, 70);
knop++;
lcd.clear(); //чистим экран
if (knop>4){knop=1; } // обнуляем четвёртое нажатие.
_delay_ms(250);
}
if (knop==0){ //сценарий устройство включено но незапущен тест
lcd.setCursor(0, 0);
lcd.print("Press 1Ch 2Rint ");
lcd.setCursor(0, 1);
lcd.print("3Dis 4FinCh ");
lcd.print(volt, 1);
lcd.print("V ");
_delay_ms(250);
}
//-------------------------------------------------
if (knop==1){ //отработка сценария зарядки после подключения
lcd.clear(); //чистим экран
cap= 0; //обнуляем переменные
am = 0;
amR = 0;
amR2 = 0;
amC = 0;
R = 0;
SEK = 0;
MIN = 0;
HOUR = 0;
counteR = 0;
voltTEMP = 0;
recharge_control = 0;
digitalWrite(7,LOW); //светодиод разряжено
if (volt<Vc)
{
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //отключаем ключ нагрузки
amC=((voltC-volt)/R5)*1000; //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
lcd.setCursor(0, 0);
lcd.print("CHARGE: ");
lcd.print(volt); //выводим напряжение на аккумуляторе
lcd.print("V ");
lcd.setCursor(8, 1);
lcd.print("I=");
lcd.print(amC);
}
if(volt>=Vc) {knop = 2; tone(13, 1000, 150);} // фиксируем зарядку АКБ, переходим в проверку внутреннего сопротивления
_delay_ms(350);
}
//----------------------------------------------------------------------------------------------------
if (knop==2) //замер внутреннего сопротивления
{
if (counteR<=252)
{
if (counteR<=230) //первый цикл проверки
{
if (counteR==0) { lcd.clear(); } // Чистим экран
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
digitalWrite(6,LOW); //отключаем ключ нагрузки 2
digitalWrite(9,HIGH); //включаем ключ нагрузки
amR=(voltD/R10); //считаем ток
lcd.setCursor(0, 0);
lcd.print("Testing Rint ");
lcd.setCursor(13, 0); //ставим курсор в 14й столбец, первую строку (вспомогательные данные, можно закомментить строку)
lcd.print("R10"); //используемый резистор (вспомогательные данные, можно закомментить строку)
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(amR*1000,0); //выводим значение тока разряда в мА
lcd.print("mA "); //
lcd.print(volt,2); //выводим напряжение на аккумляторе под нагрузкой
lcd.print("V "); //
_delay_ms(500); //задержка
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(" "); //чистим строку
counteR++; //инкрементируем счётчик
if (counteR<=231) //окончание первого цикла проверки
{
voltTEMP = volt; //переносим значение напряжения под нагрузкой во временную переменную
}
}
if (counteR>230 and counteR<=250) //второй цикл проверки
{
if (counteR==231) { lcd.clear(); } // Чистим экран
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //отключаем ключ нагрузки
digitalWrite(6,HIGH); //включаем ключ нагрузки 2
amR2=(voltD2/R15); //считаем ток
lcd.setCursor(0, 0);
lcd.print("Testing Rint");
lcd.setCursor(13, 0); //ставим курсор в 14й столбец, первую строку
lcd.print("R15"); //используемый резистор (вспомогательные данные, можно закомментить строку)
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(amR2*1000,0); //выводим значение тока разряда в мА
lcd.print("mA "); //
lcd.print(volt,2); //выводим напряжение на аккумляторе под нагрузкой
lcd.print("V "); //
counteR++; //инкрементируем счётчик
_delay_ms(500); //задержка
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print(" "); //чистим строку
}
if (counteR==251) //заканчиваем проверку сопротивления
{
R = ((voltTEMP-volt)/(amR2-amR)); //считаем внутреннее сопротивление аккумулятора
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
counteR++; //инкрементируем счётчик
lcd.clear(); // Чистим экран
lcd.setCursor(0, 1); //ставим курсор в первый столбец, вторую строку
lcd.print("Rin="); //
lcd.print(R,3); //выводим значение внутреннего сопротивления
}
if (counteR>=252) //восстанавливаем заряд аккумулятора перед тестом ёмкости, переходим в разряд
{
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятор
lcd.setCursor(0, 0); //ставим курсор в первый столбец, первую строку
lcd.print("re-charging"); //дозарядка до полного
lcd.setCursor(11, 1); //ставим курсор в 12й столбец, вторую строку
lcd.print(volt); //вывод текущего напряжения на аккумуляторе
lcd.print("V"); //
_delay_ms(350);
lcd.setCursor(15, 0); //ставим курсор в 16й столбец, первую строку
lcd.print("*"); //мигающий значок заряда
_delay_ms(350);
lcd.setCursor(15, 0); //ставим курсор в 16й столбец, первую строку
lcd.print(" "); //мигающий значок заряда
lcd.setCursor(11, 1); //ставим курсор в 12й столбец, вторую строку
lcd.print(" "); //
if (volt>=Vc) //если зарядился - переходим в разряд
{
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
knop = 3; //фиксация окончания замера внутреннего сопротивления, переход к замеру ёмкости
tone(13, 1000, 150); //тональный сигнал смены цикла
}
}
}
}
//----------------------------------------------------------------------------------------------------------------
if (knop==3){ //проверка сценария для разрядки
lcd.clear(); // Чистим экран
if (volt>Vd)
{
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
if (discharge_type==1)
{
digitalWrite(9,HIGH); //включаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки
}
if (discharge_type==2)
{
digitalWrite(6,HIGH); //включаем ключ нагрузки
digitalWrite(9,LOW); //выключаем ключ нагрузки
}
if (discharge_type==3)
{
digitalWrite(6,HIGH); //включаем ключ нагрузки
digitalWrite(9,HIGH); //включаем ключ нагрузки
}
//#########цикл отсчета
if (millis()-prMillis>=5000){
prMillis=millis();
SEK=SEK+5;
if (discharge_type==1)
{
am=(voltD/R10)*1000; //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
}
if (discharge_type==2)
{
am=(voltD2/R15)*1000; //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
}
if (discharge_type==3)
{
am=((voltD/R10)*1000)+((voltD2/R15)*1000); //считаем ток в mA =Uтекущее/Rнагрузки, *1000 получаем mA
}
capvrem=am/720; cap=cap+capvrem; //считаем емкость в mAh, при замере раз в 5 сек (в часе 3600сек / 5 = 720)
if (SEK>59){SEK=0;MIN++;}
if (MIN>59){MIN=0;HOUR++;}
if (HOUR>23) HOUR=0;
}
//########################
lcd.setCursor(0, 0);
lcd.print("DisCh ");
lcd.print("I="); //вывод на экран
lcd.print(am, 0); //вывод на экран
lcd.print("mA "); //вывод на экран
lcd.setCursor(0, 1);
lcd.print(volt);
lcd.print("V Q="); //вывод на экран
lcd.print(cap, 0); //вывод на экран
lcd.print("mAh "); //вывод на экран
lcd.setCursor(12, 1);
}
_delay_ms(500);
if (volt<=Vd){knop=4; tone(13, 1000, 150);} //фиксация окончания разрядки и замера емкости
}
//-------------------------------------------------
if (knop==4){ //сценарий окончания подсчета емкости, вывод на экран и зарядка.
lcd.setCursor(10, 1);
lcd.print(volt, 1); //вывод на экран текущего напряжения аккумулятора
lcd.print("V");
switch (recharge_control)
{
case 0: //тест окончен, но аккумулятор полностью разряжен, выводим результаты на экран
digitalWrite(8,LOW); //выключаем ключ зарядки аккумулятора
digitalWrite(9,LOW); //выключаем ключ нагрузки
digitalWrite(6,LOW); //выключаем ключ нагрузки 2
digitalWrite(7,LOW); //выключаем светодиод заряда
lcd.setCursor(0, 0); //выводим значение внутреннего сопротивления
lcd.print("R=");
lcd.print(R,3);
lcd.print(" ");
lcd.setCursor(8, 0);
if (HOUR<1){ lcd.print("00");} //вывод времени разряда на экран
else {lcd.print(HOUR);}
lcd.print(":");
if (MIN<1){ lcd.print("00");} //вывод на экран
else {lcd.print(MIN);}
lcd.print(":");
lcd.print(SEK);
lcd.setCursor(0, 1);
// lcd.print("Q="); //вывод на экран
lcd.print(cap, 1); //вывод на экран
lcd.print("mAh "); //вывод на экран
recharge_control=1; //инкремент счётчика
_delay_ms(5);
break; //выход из case
case 1: //тест окончен, результаты отображены, заряжаем
// if (volt<Vc) //после того как посчитали емкость заряжаем
if (volt<(Vc - 0.3)) //после того как посчитали емкость заряжаем (до напряжения хранения)
{
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятора
lcd.setCursor(15, 1); //столбец 16, строка 2
lcd.print(" "); //мигаем звёздочкой индикатора заряда
_delay_ms(250);
lcd.setCursor(15, 1); //столбец 16, строка 2
lcd.print("*"); //мигаем звёздочкой индикатора заряда
_delay_ms(250);
}
// if (volt>=Vc) //после того как зарядили переходим к поддержанию заданного напряжения
if (volt>=(Vc - 0.3)) //после того как зарядили переходим к поддержанию заданного напряжения
{
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
digitalWrite(7,HIGH); //включаем светодиод заряда
recharge_control=2; //инкрементируем счётчик
tone(13, 500, 300);
_delay_ms(301);
tone(13, 700, 300);
_delay_ms(301);
tone(13, 900, 300);
_delay_ms(301);
}
break;
case 2:
// if (volt<(Vc-0.2)) //после заряда поддерживаем напряжение на 0.2 вольта ниже
if (volt<(Vc-0.5)) //после заряда поддерживаем напряжение
{
digitalWrite(8,HIGH); //включаем ключ зарядки аккумулятора
_delay_ms(150);
}
// if (volt>=(Vc-0.2)) //после заряда поддерживаем напряжение на 0.2 вольта ниже
if (volt>=(Vc-0.5)) //после заряда поддерживаем напряжение
{
digitalWrite(8,LOW); //отключаем ключ зарядки аккумулятора
_delay_ms(500);
}
break;
}
}
}
void menu() //меню
{
knop=0; //обнуляем используемые переменные
akk_type=1; //по умолчанию Li-Ion
discharge_type=1; //по умолчанию минимальный ток разряда
_delay_ms(150); //задержка - антидребезг
while (knop_menu!=0) //пока не произведены начальные настройки остаёмся в меню
{
if (digitalRead(2)==HIGH) //нажатие кнопки
{
lcd.clear(); //чистим экран
knop++; //инкремент кнопки
tone(13, 1000, 70); //бипер
if (knop>3){knop=1; } // обнуляем нажатие
_delay_ms(75); //задержка - антидребезг
}
if (digitalRead(3)==HIGH) //нажатие кнопки
{
knop=0;
lcd.clear(); //чистим экран
knop_menu++; //инкремент кнопки
tone(13, 1000, 70); //бипер
if (knop_menu>3){knop_menu=1; } // обнуляем нажатие
_delay_ms(75); //задержка - антидребезг
}
switch(knop_menu) //выбор типа аккумулятора и тока разряда
{
case 1: //выбор типа аккумулятора
{
lcd.setCursor(0, 0); //индикация текущего типа аккумулятора
lcd.print(" akkum. type: ");
if (knop==0)
{
lcd.setCursor(0, 0);
lcd.print("change akk type?");
if (akk_type==1)
{
lcd.setCursor(0, 1);
lcd.print("Li-Ion 2.9V-4.1V");
}
if (akk_type==2)
{
lcd.setCursor(0, 1);
lcd.print("Li-Pol 2.9V-4.2V");
}
if (akk_type==3)
{
lcd.setCursor(0, 1);
lcd.print("Li-Fe 2.8V-3.6V ");
}
}
if (knop==1) //выбор литий-ионной батареи
{
lcd.setCursor(0, 1);
lcd.print("Li-Ion 2.9V-4.1V");
akk_type=1;
}
if (knop==2) //выбор литий-полимерной батареи
{
lcd.setCursor(0, 1);
lcd.print("Li-Pol 2.9V-4.2V");
akk_type=2;
}
if (knop==3) //выбор литий-железо-фосфатной батареи
{
lcd.setCursor(0, 1);
lcd.print("Li-Fe 2.8V-3.6V ");
akk_type=3;
}
_delay_ms(250);
break;
}
case 2: //выбор тока разряда
{
lcd.setCursor(0, 0);
lcd.print("discharge type: ");
if (knop==0)
{
lcd.setCursor(0, 0); //индикация текущей уставки тока разряда
lcd.print("change I disch.?");
if (discharge_type==1) //минимальный ток
{
lcd.setCursor(0, 1);
lcd.print("minimum current ");
}
if (discharge_type==2) //средний ток
{
lcd.setCursor(0, 1);
lcd.print("middle current ");
}
if (discharge_type==3) //максимальный ток
{
lcd.setCursor(0, 1);
lcd.print("maximum current ");
}
}
if (knop==1) //выбор минимального тока разряда (R10)
{
lcd.setCursor(0, 1);
lcd.print("minimal current ");
discharge_type=1;
}
if (knop==2) //выбор среднего тока разряда (R15)
{
lcd.setCursor(0, 1);
lcd.print("middle current ");
discharge_type=2;
}
if (knop==3) //выбор максимального тока разряда (R10+R15)
{
lcd.setCursor(0, 1);
lcd.print("maximum current ");
discharge_type=3;
}
_delay_ms(250); //задержка
break;
}
case 3: //сохранение параметров и переход к тесту
{
lcd.setCursor(0, 0);
lcd.print(" save and go ");
lcd.setCursor(0, 1);
lcd.print(" to test? ");
if(knop==1)
{
knop_menu=0;
if (akk_type==1)
{
Vd=2.9;
Vc=4.1;
}
if (akk_type==2)
{
Vd=2.9;
Vc=4.2;
}
if (akk_type==3)
{
Vd=2.8;
Vc=3.6;
}
}
_delay_ms(250); //задержка
break;
}
}
}
knop=0; //обнуляем переменные
knop_menu=0; //обнуляем переменные
}
void menu_config()
{
uint32_t millis_timeout = millis();
tone(13, 900, 300);
lcd.print(" config mode ");
_delay_ms(1500);
lcd.clear(); // Чистим экран
byte menu_step = 1;
while (menu_step!=0) //пока не произведены начальные настройки остаёмся в меню
{
lcd.clear(); // Чистим экран
if ((millis() - millis_timeout) > 7000)
{
menu_step++;
millis_timeout = millis();
tone(13, 900, 300);
_delay_ms(301);
}
switch(menu_step) //выбор настраиваемого параметра
{
case 1: //выбор сопротивления R5
{
lcd.setCursor(0, 0);
lcd.print("R5 = ");
lcd.setCursor(0, 1);
lcd.print(R5);
if (digitalRead(3)==HIGH) //нажатие кнопки
{
R5 = R5 + 0.1;
millis_timeout = millis();
}
else if (digitalRead(2)==HIGH) //нажатие кнопки
{
R5 = R5 - 0.1;
millis_timeout = millis();
}
_delay_ms(250);
break;
}
case 2: //выбор сопротивления R10
{
lcd.setCursor(0, 0);
lcd.print("R10 = ");
lcd.setCursor(0, 1);
lcd.print(R10);
if (digitalRead(3)==HIGH) //нажатие кнопки
{
R10 = R10 + 0.1;
millis_timeout = millis();
}
else if (digitalRead(2)==HIGH) //нажатие кнопки
{
R10 = R10 - 0.1;
millis_timeout = millis();
}
_delay_ms(250); //задержка
break;
}
case 3: //выбор сопротивления R15
{
lcd.setCursor(0, 0);
lcd.print("R15 = ");
lcd.setCursor(0, 1);
lcd.print(R15);
if (digitalRead(3)==HIGH) //нажатие кнопки
{
R15 = R15 + 0.1;
millis_timeout = millis();
}
else if (digitalRead(2)==HIGH) //нажатие кнопки
{
R15 = R15 - 0.1;
millis_timeout = millis();
}
_delay_ms(250); //задержка
break;
}
case 4: //подстройка опорного напряжения
{
if (digitalRead(3)==HIGH) //нажатие кнопки
{
adc_TL431++;
millis_timeout = millis();
}
else if (digitalRead(2)==HIGH) //нажатие кнопки
{
adc_TL431--;
millis_timeout = millis();
}
coeff = adc_TL431/(float (analogRead(analogV_TL431))); // считаем коэффициент погрешности опорного напряжения
volt = float (analogRead(analogV_TL431))*coeff*10/1024; // 5В - опорное напряжение
lcd.setCursor(0, 0);
lcd.print("Vcc = ");
lcd.print(volt);
lcd.print("V");
lcd.setCursor(0, 1);
lcd.print("adc_TL431 = ");
lcd.print(adc_TL431);
_delay_ms(250); //задержка
break;
}
case 5: //сохранение переменных
{
lcd.setCursor(0, 0);
lcd.print(" saving... ");
uint16_t EEPROM_counter = 0;
EEPROM.get(1, EEPROM_check); //читаем ячейку ЕЕПРОМ с адресом 1
if (EEPROM_check == 55) //если находим в ней внесённое при настройке значение
{
EEPROM.get(16, EEPROM_counter); //читаем ячейки 16-17
EEPROM_counter++; //инкремент прочитанного значения
}
_delay_ms(250); //задержка
EEPROM_check = 55;
lcd.setCursor(7, 1);
lcd.print(EEPROM_counter);
EEPROM.put(1, EEPROM_check); //записываем в ЕЕПРОМ сопротивление зарядного резистора R5
EEPROM.put(16, EEPROM_counter); //записываем в ЕЕПРОМ счётчик циклов перезаписи
EEPROM.put(2, R5); //записываем в ЕЕПРОМ сопротивление зарядного резистора R5
EEPROM.put(6, R10); //записываем в ЕЕПРОМ сопротивление разрядного резистора R10
EEPROM.put(10, R15); //записываем в ЕЕПРОМ сопротивление разрядного резистора R15
EEPROM.put(14, adc_TL431); //записываем в ЕЕПРОМ напряжение на источнике опорного (в попугаях АЦП)
_delay_ms(250); //задержка
menu_step = 0;
break;
}
default :
{
menu_step = 0;
break;
}
}
}
lcd.setCursor(0, 0);
lcd.print(" saved ");
_delay_ms(1000); //задержка
return;
}
Для информации.
Замеренный пару лет назад литий (по схеме от Бодрого 2014) - 1400 мАч.
Пару лет хранения в полностью заряженном виде - 862 мАч.
Почти вдвое. Пусть устройство Бодрого менее точное. Но все же разница очевидна.
Поэтому хранить надо правильно.
Аккум, замеренный на минимальном и максимальном токе разряда - 81 и 76 мАч.
Добавил разистор.
Пост № 186 дополнил.
Заодно вроде ушел еще один недостаток, устройство при пропадании 5 вольт питания не так активно есть батарею. Дисплей уже не светится и все сбрасывается.
Для информации.
Замеренный пару лет назад литий (по схеме от Бодрого 2014) - 1400 мАч.
Пару лет хранения в полностью заряженном виде - 862 мАч.
Почти вдвое. Пусть устройство Бодрого менее точное. Но все же разница очевидна.
Разница была бы очевидна, если бы рядом лежал второй акум, который хранился с неполным зарядом и его емкость упала бы, скажем, всего до 1200 мАч.
А так никакой "разницы" не видать и по мне это самое обычное старение.
А так никакой "разницы" не видать и по мне это самое обычное старение.
Не доверяете мне - почитайте других.
Не доверяете мне - почитайте других.
дело не в доверии, а в том, что ваш пример абсолютно ничего не доказывает, Вы этого не понимаете?
Не доверяете мне - почитайте других.
дело не в доверии, а в том, что ваш пример абсолютно ничего не доказывает, Вы этого не понимаете?
Внимание!
Пост №186 снова дополнил.
https://yadi.sk/d/rDa99Y4z4k3wDQ
Схему не перирисовывал. Просто на плате внес некоторые исправления.
Что изменено:
Резисторы R2, R7, R9, R12, R16 заменены перемычками. Между базами и эмиттерами всех КТ315 добавлены резисторы подтяжки (можно использовать от 4,7к до 10к).
Добавлены блокирующие конденсаторы по 100 нанофарад (104) в нескольких местах.
Добавлены LC фильтры на питание Ардуино и питание дисплея (развязка по питанию).
Если вы используете импульсный источник питания, то по входу с него надо добавить синфазный фильтр.
Дополняю 03.09.19.
Вчера прогнал пару аккумов небольшой емкости. Все норм. Прибор работает красиво. Мне понравилось.
А сегодня после часа работы кракозяблы и все. При перезапуске шашечки. Замена ардуино привела к такому же эффекту.
Запустить прибор больше так и не удалось.
Выпаял транзисторы. Тестер радиодеталей говорит, что они живые.
Словом я в тупике. С этим прибором у меня не сложилось. В чем дело сказать не могу. Схема не та, либо программа не всегда корректно себя ведет - не знаю. Возможно и транзисторы левые. Может быть мои переделки оказались губительными.
Очень жаль. Прибор в работе мне понравился.
А Ардуинки теперь мне придется проверять. Не выгорели ли порты.
Словом я в тупике. С этим прибором у меня не сложилось. В чем дело сказать не могу. Схема не та, либо программа не всегда корректно себя ведет - не знаю.
с крокозябрами на экране проблема скорее всего программная - надо отлаживать код, а не резисторы методом тыка подбирать.
Кракозябр не видел ни разу, юзаю не меньше года. Несколько повторивших тоже не жаловались на подобное поведение.
Я бы смотрел в сторону замены импульсного бп на трансформаторный с нормальным стабилизатором на 7805 и подпайки ардуины и дисплея на кусочки проводков, а не установки в панельку.
А Ардуинки теперь мне придется проверять. Не выгорели ли порты.
Резисторы там стояли как раз на защиту портов, на работу влияния оказывать не должны.
Кракозябр не видел ни разу, юзаю не меньше года. Несколько повторивших тоже не жаловались на подобное поведение.
Я бы смотрел в сторону замены импульсного бп на трансформаторный с нормальным стабилизатором на 7805 и подпайки ардуины и дисплея на кусочки проводков, а не установки в панельку.
Резисторы там стояли как раз на защиту портов, на работу влияния оказывать не должны.
Тоже думал про аналоговый БП. Лень матушка и габариты. Но с фильтрами вход был достаточно чистый. Осциллограф показывал помехи в пределах 10 милливольт. Немного плыл под нагрузкой 5-5,2 вольта. В пределах допустимого для МК по максимуму.
Удаление резисторов по контролирующим входам повышало точность вольтметров. В разных режимах отклонение уменьшилось 0,04 до 0,09 вольта.
С резисторами доходило до 0,15 вольта, если правильно помню.
Сейчас пока остыну. Транзисторы попробую заменить. Возможно на зарубежные аналоги.
Попробую видимо с исходной программой.
Кстати началось все странно еще вчера. Поставил 18650 с разборки. Он заряжался где то до 4,08, а потом напруга начала медленно падать. И пошел нагрев аккума. Хотя заряд подавался вроде нормально (проверял состояние портов тестером). Я решил, что возможно аккум железный и остановил все.
Продолжил уже сегодня в режиме железных. И где-то в середине крыша и съехала.
Возможно аккум был левый. Но тогда таких одинаковых у меня два. Посмотрел по обозначению сегодня - литий-ион.
Да и ардуинки еще не проверил. Запасная есть, но жаба пока мешает. Не хотел на нее ноги распаивать.
На панельки я не грешу. У меня на них довольно много приборов уже. Верой и правдой.
Если чего добьюсь - отпишу.
Пытаюсь анализировать, что это было.
Удаление токоограничительных резисторов на А0 - А4.
При заряде А1 замыкается на +5 вольт через сопротивление открытого транзистора.
При разряде А2, А3 через разрядные резисторы на землю. Через открытые разрядные транзисторы на плюс батареи.
Узкое место пожалуй А1 и А0. Если порты приоткрыты одновременно, то плюс батареи садится на питание через R5.
На практике глюки выглядели как просадки питания аруино. Начинал помаргивать светодиод ардуины и в бузере шел треск.
Словом, резисторы удалять нельзя. Пожалуй кроме R2.
Описать, что происходит внутри ардуино я не могу. Как там открываются-закрываются порты. Возможно дело действительно в неопределенности состояния портов.
Кроме того, еще по Пультоскопу я уяснил, что входное сопротивление АЦП меги 328 (как и других мег) - штука странная. Там на входе кондер малой емкости. И в момент его заряда сопротивление входа равно нулю. Т.е. то ноль, то очень большая величина. Возможно дело в этом.
В принципе, попадание напряжения питания на порты не должно быть опасно для ардуино. Как и на землю. Но возможные сквозные токи при переключениях могут видимо ее и убить.
Проверить эти две ардуинки я не могу простыми средствами. Только если через программатор заливать и пробовать. Почему то у меня не сложилась дружба с ТТЛ переходником для этих ардуин. Но это не вопрос. Откопал в закромах еще пару.
Пока думаю. Если у кого есть соображения по поводу состояний портов ардуино и путей их развязки, буду рад.
Увы, в программировании я около ноля.
Мда.
Давненько я таких примитивных косяков не допускал. СМД перемычка, соединяющая землю ардуино и землю силовой части, была непропаяна с одной стороны. Т.е. была нестабильная земля. Неудивительно, что у ардуино ехала крыша.
Плата по первому варианту, с резисторами, кроме R2.
Питание я успел накрутить. Только благодаря этому и обнаружил. Питание 7-12 вольт. Питание ардуино через ногу RAW, т.е. через внутренний стабилизатор платы. Питание силовой части через импульсный ДС-ДС (типа ЛМ317) вот такой https://ru.aliexpress.com/item/32737717827.html?spm=a2g0s.9042311.0.0.274233edvH70nq&cv=47843&cv=47843&af=843361&af=843361&mall_affr=pr3&mall_affr=pr3&dp=ebe66f24ae165cc62e460c56e0b7bcf4&dp=ebe66f24ae165cc62e460c56e0b7bcf4&scm=1007.22893.125764.0&pvid=bf79f9af-7bf5-4721-9ac4-9c515d44573c&onelink_thrd=0.0&onelink_page_from=ITEM_DETAIL&onelink_item_to=32737717827&onelink_duration=1.055984&onelink_status=noneresult&onelink_item_from=32737717827&onelink_page_to=ITEM_DETAIL&afref=&aff_platform=aaf&cpt=1567671655158&sk=VnYZvQVf&aff_trace_key=1a4c7a1cfafe4990b417ddcdec420a90-1567671655158-05032-VnYZvQVf&terminal_id=f47b3b9136814b9e986caf8c5f9f070f
Вроде заработало. Результат будем посмотреть. Более менее уверенность будет дней через несколько.
Силовая часть и микроконтроллер должны питаться от одного источника, иначе будет показывать среднюю температуру по палате. В качестве опорного при замере берётся напряжение питания ардуины vcc.
Понял. Приму к сведению. Пока стоит на прогоне. Там в принципе разница невелика у меня. На силовую часть идет 5,09, на ардуине 5,05 после стабилизатора.
Кстати разница показаний вольтметра и тестера 0,04 вольта. Оба достаточно стабильны.
Позже переделаю на один стабилизатор. Импульсник по ссылке. Хочется иметь диапазон входных напряжений. Сейчас после этого импульсника около 30 мВ пульсации при зарядке.
Можно немного подкорректировать. Измерить напряжение на TL431 точным вольтметром, если оно отличается от 2,50V более чем на 0,01V то в строке:
подобрать коэффициент 512 в пределах плюс-минус 10. Одно значение - приблизительно 0,005V. Залить скетч с новым коэффициентом и сравнить показания прибора и внешнего вольтметра.
Можно немного подкорректировать. Измерить напряжение на TL431 точным вольтметром, если оно отличается от 2,50V более чем на 0,01V то в строке:
подобрать коэффициент 512 в пределах плюс-минус 10. Одно значение - приблизительно 0,005V. Залить скетч с новым коэффициентом и сравнить показания прибора и внешнего вольтметра.
Пока внедряю аналоговое питание на плату. На 7805. Общее для всей схемы. С радиатором. Поскольку питаю от Нокиевской зарядки, там 9-10 вольт. На стабилизаторе будет рассеиваться около 2 ватт.
Внедрю питание. Оттестирую на стабильность и буду делать точные настройки.
Спасибо.
ТЛ431 у меня в схеме имел 2,47-2,48 вольта. Напряжение прибор показывал на 0,04-0,05 вольта больше образцового тестера. Скомпилировал скетч для коэффициента 505. Разница уменьшилась до 0,00-0,01. Приемлемо.
Некоторые соображения по схеме. Если для расчетов имеет значение лишь опорное на ТЛ431, то в дальнейшем имеет смысл делать опорное с настраиваемого опорного. Т.е. включить ТЛку по полной схеме с подстроечным резистором. В принципе можно подобным образом подгонять и шунты заряда и разряда. Включая параллельно основному резистору другие.
Я это к тому, что компилирование старых скетчей может оказаться проблематичным через несколько лет. Да и забывается все со временем. А Хекс остается хексом.
Да и при реализации прибора не на Ардуино, а на голом камне проще залить хекс. И настраивать прибор уже аппаратно.
А прибор этот, по моему убеждению, из разряда тех, которые должен иметь каждый радиолюбитель, вслед за ЛБП и тестером радиодеталей.
Это не айМакс, конечно. Но вещь весьма полезная.
1. Позволяет заряжать и тестировать литийжелезофасфатные.
2. Определять емкость на разных токах.
3. Оценивать пусть и примерно внутреннее сопротивление.
4. После проверки сразу заряжать аккум до напряжения хранения.
Таким образом tekagi спасибо за великолепную работу.
По реализации. Как я понимаю, питать ардуино все же лучше отдельно. Через внутренний стабилизатор. Он линейный и лучше фильтрует помехи. Дисплей можно цеплять туда же.
Силовую часть можно питать через 7805. Тогда входное напряжение в диапазоне от 8 до 12-15 вольт. Но 7805 нужно цеплять на радиатор. И чем выше входное напряжение, тем больший радиатор понадобится.
Плату можно использовать мою, с предыдущей страницы.
Транзисторы лучше подобрать с коэффициентом усиления не выше 100.
В скетче всё равно необходимо прописать номиналы резисторов, по возможности точно. ИМХО это в разы проще, чем подбирать номинал железно. Собрать скетч можно скачав старые версии ИДЕ. Ну и основное преимущество ардуины - возможность поправить код под свои хотелки. Можно, конечно, ТЛку настроить на 3 вольта и поставить многооборотный подстроечник для точного выставления опорного, но мне проще один раз поправить коэффициент в коде. Хекс для заливки в голый камень можно экспортировать из ИДЕ.
Силовую можно и через импульсный DC/DC. В принципе у меня схема целиком питается через китайский модуль на LM2596, плюс дополнительный электролит и керамика на плате тестера (на фото видно). На входе преобразователя вольт восемь-девять. Глюков не замечено. Компенсационный стабилизатор я упоминал чтобы исключить вероятность проникновения импульсных помех, когда у Вас девайс работал нестабильно.
Серьёзно к данному прибору относиться не стоит, это первый скетч, с которого я начинал знакомство с ардуиной (если не считать железячный "Helloworld" aka blink). Возможности и точность прибора ограничены, дорабатывать смысла не вижу (хотя просится ещё один пункт для современных аккумуляторов с химией на 4,35V). Есть желание собрать подобный девайс с возможностью плавной задачи тока заряда/разряда, но точно не в ближайшее время.
Серьёзно к данному прибору относиться не стоит
1. Понятия "Точное значение емкости" не существует. Емкость зависит от всего. Тока заряда, тока разряда, температуры заряда, температуры разряда. Это как минимум.
2. С практическими целями достигнутой уже точности вполне достаточно.
3. Роль зарядника в нем тоже реализована. Правда емкие аккумуляторы будет заряжать достаточно долго.
4. Дает возможность назначить напряжение заряда после тестирования.
Что касается остального.
Можно организовать настройку прибора програмно с записью в ЕЕР. Только насколько помню, в первую ячейку ничего лучше не писать. Баг какой то у AVR с этим делом. Если не путаю. Не программист.
И так же можно вносить поправки значений резисторов.
На счет плавного задания.
На счет разряда - не актуально. Трех достаточно. Если тестить силовые на десяток ампер - то там печка получится.
А вот ток заряда - не все с ним однозначно. Одно дело таблетка на 45 мАч, совсем другое 18650 на 3000 мАч. Заряжать их стоит по разному. Но это уже типа аймакса будет.
Пришло в голову. Вариант плавной зарядки. Ток можно регулировать вручную. Ардуино питать отдельно, а на входе силовой части регулируемый БП вольт от 4 и вольт до 6. На той же ЛМ317. Ток будет разным. Он по любому нужен в пределах 1А.
Силовую часть можно питать через 7805. Тогда входное напряжение в диапазоне от 8 до 12-15 вольт. Но 7805 нужно цеплять на радиатор. И чем выше входное напряжение, тем больший радиатор понадобится.
использовать DC-DC, там и так тепловыделение дай бог.
использовать DC-DC, там и так тепловыделение дай бог.
Я правда пробовал. Нормально получалось. Но с фильтрами. Синфазным. А питание ардуины через внутренний стаб. Он линейный.
Словом - на усмотрение.
Это да. Но я перестраховшик. ДС_ДС шумят. Вряд ли это хорошо сказывается на работе вольтметров.
Я правда пробовал. Нормально получалось. Но с фильтрами. Синфазным. А питание ардуины через внутренний стаб. Он линейный.
Словом - на усмотрение.
Делал эл.нагр. с питанием от AC-DC импульсного, напряжение на вольтметре стоит стабильно, референсное от 431 и LC на входе.
Я это к тому, что компилирование старых скетчей может оказаться проблематичным через несколько лет. Да и забывается все со временем. А Хекс остается хексом.
Да и при реализации прибора не на Ардуино, а на голом камне проще залить хекс. И настраивать прибор уже аппаратно.
Распространение программ хексом - это наследие "радиолюбительских" сайтов, где программировал лишь один из двадцати, а остальные умели только заливать готовый хекс :) В ардуино сообществе все наоборот, поэтому тут нужен исходник.
Несовместимость с новыми версиями ИДЕ - проблема надуманная, при наличии исходника код всегда можно адаптировать к изменениям софта. Более того, исходник можно собрать и под другой камень и даже портировать на другое семество МК (например, с АВР - на СТМ). С хексом фиг чего сделаешь.
Ну и последнее - к хексу надо подробное описание, что и как работает, команды, используемые пины... С исходником документация, конечно тоже нужна - но в разы меньше, все можно посмотреть в коде.
Это все, конечно, справедливо, когда понимаешь исходный код :) А если нашел программу в инете и она для тебя темный лес - тогда только и остается колхозить переменник на ТЛ-ку :)
Распространение программ хексом - это наследие "радиолюбительских" сайтов, где программировал лишь один из двадцати, а остальные умели только заливать готовый хекс :)....
Несовместимость с новыми версиями ИДЕ - проблема надуманная, при наличии исходника код всегда можно адаптировать к изменениям софта. Более того, исходник можно собрать и под другой камень и даже портировать на другое семество МК (например, с АВР - на СТМ). С хексом фиг чего сделаешь.
Ну и последнее - к хексу надо подробное описание, что и как работает, команды, используемые пины... С исходником документация, конечно тоже нужна - но в разы меньше, все можно посмотреть в коде.
Это все, конечно, справедливо, когда понимаешь исходный код :) А если нашел программу в инете и она для тебя темный лес - тогда только и остается колхозить переменник на ТЛ-ку :)
Ну да. Я именно оттуда. С радиолюбительских сайтов. Логику вы выстроили. Но ведь это не единственный вариант логики.
Осциллограф. Да собственно любая другая конструкция со сравнительно сложной схемой. И все. Это уже не уровень Ардуино. Это уже не только программа. Поэтому извините, но я считаю радиолюбительские сайты следующей ступенью развития.
Но это спор из разряда о "физиках и лириках". Т.е. бесперспективный.
Вы уверены, что через несколько лет сможете сходу восстановить, скомпилировать под другой камень и т.д.?
А с трудностями компиляции старых скетчей я уже столкнулся. Лично и непосредственно. Ну да, разобраться зачастую можно. Потратив кучу времени. А иногда и уперевшись, что например на ХР некоторые хексы не компилируются. И извесные в сети методы с заменой файла компилятора не помогают. И что? Систему срочно переустанавливать?
Поэтому, как было написано на дверях одного заведения: "Каждому свое".
И я, вполне возможно, стану "колхозить" переменник на ТЛку. Именно для того, чтобы любой начинающий мог повторить устройство. И нормально его настроить.
Если вам лично этого не нужно, то я рад за вас. Но лет через несколько вы вспомните этот разговор. Уверен.
извините, но я считаю радиолюбительские сайты следующей ступенью развития.
К сожалению, это не так. Радиолюбительство и программирование до сих пор развиваются параллельно, почти не зная друг о друге. Редко кто из "радиолюбителей" разбирается в программировании - и рекомендованный вами сайт "Радиосхемы" наглядное тому подтверждение. В большинстве проектов при неплохой схемотехнике уровень программирования начальный, причем с явным уклоном в аппаратное решение проблем. Смешно, но уже строя проект на основе МК, люди зачем то вставляют в схему внешние PWM или генераторы сигналов на NE555 , когда логично было бы решить это программно.
Впрочем, этот же подход демонстрируете и вы, когда тратите уйму времени на настройку схемы подбором номиналов компонентов, вместо того чтоб поменять одно число в программе.
Так что извините, назвать это "следующей ступенью" ну никак нельзя :)
Хотя соглашусь, что обратное тоже справедливо - многие из программистов слабо понимают в схемотехнике, что очень видно из их проектов. Так что увы - как уже сказал выше - это два параллельных мира.
и еще о различиях радиолюбителей и программистов.
Лекс, меня несколько коробит ваше желание взять чужой проект, подправить в нем пару резисторов и выложить его "обзор" на свой сайт, даже не спрашивая разрешения автора. Не знаю, может в среде радиолюбителей это почитается нормой, но в среде программистов на такое смотрят косо.
Вполне возможно, что автор-то не против - но вы хотя бы спросите его об этом? Может он не хочет, чтобы его проект уезжал на чужую площадку, может будет правильнее выложить там не "обзор", а ссылку на эту ветку.
и еще о различиях радиолюбителей и программистов.
Лекс, меня несколько коробит ваше желание взять чужой проект, подправить в нем пару резисторов и выложить его "обзор" на свой сайт, даже не спрашивая разрешения автора. Не знаю, может в среде радиолюбителей это почитается нормой, но в среде программистов на такое смотрят косо.
Вполне возможно, что автор-то не против - но вы хотя бы спросите его об этом? Может он не хочет, чтобы его проект уезжал на чужую площадку, может будет правильнее выложить там не "обзор", а ссылку на эту ветку.
Простите, а я уже выложил? Разве я давал основания полагать, что не буду спрашивать разрешения у Автора?
И, как минимум я сразу предупредил о планах. Но, как можете наблюдать, развиваю тему здесь и у себя на Радиосхемах даже нигде не упоминал о такой работе.
Теперь о смысле выкладывать там обзор.
Схему явно можно изменить. И пожалуй даже стоит. Но я самоучка. Некоторые вещи я знаю очень хорошо, но далеко не все.
Например стоит изменить параметры заряда. Вот у меня сейчас стоит на прогоне литий емкостью около 200 и уже пару часов медленно ползет от 3,9 вольта. А когда я питал устройство от 5,2 вольта (сейчас 5,09) заряд шел куда шустрее. Сейчас 4,09 и ток всего 48 мА. А что будет когда 2000-3000?
Имеет смысл сделать регулируемый ток заряда?
Но! Если Автор схемы и прошивки своего разрешения не даст, то я точно не стану выкладывать обзор где-либо. За других, естественно, поручиться не могу.
Так как, вы действительно убеждены, что устройство с хорошим потенциалом развития должно тихо скончаться здесь? Или стоит толкнуть его в широкую практику?
И вы, фактически, обвинили меня в непорядочности.
У автора я пока прямо не спрашивал. Но и предварительную работу пока не считаю законченной.
Например для себя точно буду модернизировать скетч под другие диапазоны (3,0-4,1 и 3,0-4,2). Пока не решил, но может снова переделаю под раздельное питание и с регулируемым входом.
Не будет разрешения, ну будет у меня лично устройство и все.
Разве я давал основания полагать, что не буду спрашивать разрешения у Автора?
Ну вообще-то да :) в сообщении #180 вы говорите об этом как о решенном "я планирую выложить обзор на сайте... где мне удобнее". Даже без оговорки "если автор не против".
Добавлю, ваши постоянные замечния, что вот сейчас вы всех осчастливите своими доработками - и тогда проект можно будет выкладывать - выглядят тоже евсьма невежливо. Особенно с учетом того, что многие из этих "доработок" вызваны тем, что вы просто не разобрались в проекте.
Ну вообще-то да :) в сообщении #180 вы говорите об этом как о решенном "я планирую выложить обзор на сайте... где мне удобнее". Даже без оговорки "если автор не против".
Добавлю, ваши постоянные замечния, что вот сейчас вы всех осчастливите своими доработками - и тогда проект можно будет выкладывать - выглядят тоже евсьма невежливо. Особенно с учетом того, что многие из этих "доработок" вызваны тем, что вы просто не разобрались в проекте.
Мда. Вы, разумеется имеете право относиться ко мне как угодно. Как впрочем и я к вам.
Ваши слова: "Особенно с учетом того, что многие из этих "доработок" вызваны тем, что вы просто не разобрались в проекте." говорят лишь о том, что это вы не разобрались в том, что мной движет.
Видимо вы органически не в состоянии представить, что человек может заботиться не только о себе. И никак не готовы признать неправоту и будете выкручиваться дальше.
Не знаю, какое такое "решенное дело" вы мне приписываете. Планирую, это еще вовсе не означает, что непременно собрался. Потому как сделать публикацию нормально это тоже труд. И еще не факт, что я на себя это возьму.
Но все. Вас лично в дальнейшем игнорирую.
Для информации такой нюанс: человек, как правило, судит об окружающих по себе. Т.е. то, что вы меня в ней обвиняете, говорит о том, что вы сами на такое готовы.
Ну а общаться с людьми непорядочными я не обязан.
Будет что сказать по делу - пообщаемся. По остальным поводам - нет.
Не знаю, какое такое "решенное дело" вы мне приписываете. Планирую, это еще вовсе не означает, что непременно собрался. Потому как сделать публикацию нормально это тоже труд. И еще не факт, что я на себя это возьму.
вот оно даже как... То есть вы остаетесь в полной уверенности, что ваша публикация на чужом сайте - это прям счастье для автора? И вы еще не решили, достоин ли он этого? :)))
Не забудьте только спросить его самого.
Для tekagi.
Как я понял, все же вполне возможно питать силовую часть отдельно. И своим напряжением.
Сегодня сделал грубый прикидочный рассчет.
При питании силовой части 5,0 вольт максимальный ток зарядки при 2,9 вольтах будет составлять около 260 мА.
При питании 6 вольт максимальный ток будет около 460 мА. При этом на R5 будет рассеиваться около 1,1 вт.
Дальше увеличивать напряжение скорее всего не стоит. Печка получится. Да и вряд ли целесообразно.
Т.е. при 5 вольтах достаточно безопасно можно заряжать батареи емкостью примерно от 250 мАч.
Пока весь в сомнениях делать/не делать регулируемое питание. Надо ли мне это. Наиболее частый диапазон у меня в р-не 500-1000 мАч. Но при проверке емких батарей (2000-3000) время заряда сильно растянуто. Посмотрю, покатаюсь пока так. Там решу.
Падение напряжение на силовых транзисторах оказалось около 0,7 вольт для импортных (Т2, Т4 у меня) и около 1 вольта на КТ814. Но это так, для информации.
Вопрос.
Как я понимаю, точное значение сопротивления силовых балластных резисторов (они же шунты) оказывает значительное влияние на точность расчета тока (что не столь важно) и, главное, на точность расчета внутреннего сопротивления батареи.
Как по вашему мнению, с какой точностью имеет смысл указывать это сопротивление в скетче? Скажем два знака после запятой.
Конечно, вычислить сопротивление с такой точностью это отдельная дополнительная процедура. Но вполне возможная. Если пропустить ток в р-не 1 А и измерить падение напряжения. Имеет смысл заморачиваться, или достаточно "из-под тестера" (т.е плюс-минус 0,05 ома)? Т.е. суть вопроса в том, какие разряды Ардуино (или программа) берет в расчет?
Вопрос задаю чисто с познавательными целями. Т.к. вполне сознаю, что точное значение сопротивления батареи измеряется не так и достаточно проблематично. Да и не является столь уж необходимым. Спрашиваю потому, что скорее всего вы сами при разработке прибора задавались подобным вопросом. Если нет, то и ладно, удовлетворюсь прикидочным.
Пока планирую переделать Ваш скетч под свои нужды.
В частности выбор типа батареи:
1. Литий ион. Рабочий диапазон, практический. 3,0-4,1 вольта. (Стандартная зарядка ТП4056 обычно заряжает до 4,14-4,17 вольт).
2. Литий ион. Максимальный. Теоретический. 2,9 - 4,2 вольта.
3. Литий железо фосфатные. (без изменений).
Как я понимаю, для этого достаточно переделать параметры в самом конце скетча, плюс надпись, которая выводится на дисплей.
Литий-полимерные отдельной строкой выделять не буду. Параметры их работы не отличаются от литий-ионных.
Там нет рабочих и максимальных режимов. Литиевых элементов сейчас несколько видов, с разными граничными напряжениями заряда-разряда, указываемыми на этикетках или в даташитах. Что для одних недозаряд, то для других уже сильный перезаряд с уменьшением количества жизненных циклов, а то и пиротехническими эффектами.
Отпишитесь мне на мейл (есть на схеме).
Да. Это я просто так назвал. Для понимания. Это не академически правильные наименования. Естественно в прошивке это будет называться иначе. И вывод на дисплей будет иной. Как именно - обдумаю.
Я имел в виду Литий (и подобные) в реально используемом диапазоне в практических устройствах.
Да, их много видов. Для всех имеющихся у меня на данный момент предельное 4,2 вольта.
Зарядка в реальных устройствах будет догонять их до 4,14-4,17. А разряжать ниже 3 вольт не стоит. Т.е. на первом пункте будет стоять режим "А сколько я могу взять от этой батареи в реальной эксплуатации".
Второй пункт мне лично вряд ли будет полезен. Но пусть будет.
Литий феррофосфатные резко отличаются по рабочему диапазону и их стоит оставить отдельным пунктом. Мне пока не попадались.
Для любительского устройства, считаю достаточным.
На счет остального - хорошо. Понял. Немного позже.
Здравствуйте. Приношу свои извинения tekagi за долгую задержку. Ремонт. Которым пришлось заниматься срочно. Пришлось свалить в кучу все свои технические причиндалы, судорожно распихать по пакетам и засунуть далеко.
Сейчас дым немного развеялся и продолжил ковырять прибор.
Вот Ваш измененный скетч. Сегодняшний.
Что сделано в коде.
Естественно настройка под себя. Значения резисторов, напряжение на Vcc ардуинки (питание через RAW). Подгонка TL431 (2,46 вольта у меня).
Из важного: Добавлены в скетче в явном виде закрытие портов разряда. Без этого проверка на среднем токе разряда проходила некорректно. По факту были открыты оба порта 6 и 9, ну а ток считался естественно только с одного канала.
Видимо неопределенность состояний портов имеет место быть. Я уж на что только не грешил. И отсоединял нагрузки, просто повесив оба порта в воздухе и ардуинку менял (опасался, что накрылся порт). Словом упражнялся до тех пор, пока не догадался изменить скетч.
Естественно сделал заряд после проверки до напряжения хранения в конце. Удобная, кстати, фишка оказалась.
По железу.
Раздельное питание.
Источник - зарядка от мобильника. С него через синфазный фильтр напрямую на силовую часть.
И от него же через повышающий DC-DC (7-12 вольт) на RAW ардуинки.
Считаю, что питание от собственного аналогового стабилизатора ардуино пойдет на пользу точности и стабильности прибора.
Отдельное питание силовой части считаю очень полезным. Например можно использовать так называемые "адаптивные" быстрые зарядки. А при необходимости проверки АКБ малой емкости, можно запитывать схему пониженным напряжением, вплоть до 4,3 вольт, чтобы ток заряда не превышал допустимые для аккумуляторов.
А адаптивные зарядки (которые умеют повышать напряжение по мере роста тока в определенных пределах) позволяют сократить время заряда достаточно емких аккумуляторов. Что особенно удобно для 18650.
Пока не знаю, как можно увеличить достоверность замера внутреннего сопротивления батареи.
Видимо там надо кардинально менять математику.
Но и имеющийся уже в приборе прикидочный расчет на практике полезен тоже. Мне например позволил понять некоторые вещи про батареи от сотиков. Два внешне одинаковых аккума вели себя странно в схемах, куда пытался их применить. Оказалось, что их сопротивление сильно больше, чем у большинства аналогичных. И это видимо не деградация. Они разного срока выпуска. Т.е. использовать их можно, но только в устройствах с малым током потребления.
Таким образом прибор становится в ряд "маст хев" для многих радиолюбителей. Еще раз спасибо за интересную разработку.
Присоединился к ваше компании.
Немного переделал схему. Взял стандартную платку зарядки лития на Tp4056. На 8 отрезанную от 5в ногу этой микросхемы идёт управление с ардуины,ранее шедшее на транзистор заряда. Ардуино включает-выключает заряд.Ток заряда выбрал 1а,чтоб не сильно грелась мс. Для контроля тока использую 0.4ом резистор на входе. Ток считается как разница uпитания и Uпадения на резисторе деленный на резистор.
Пока тестирую.Не совсем понятно как все должно работать. Внутреннее сопротивление можно мерить по другому R=(Uхх/Un-1)*Rn
А всё же, если говорить о изначальной схеме автора, стоит ли транзисторы заменить, например, на 2N7000 и выкинуть лишние резисторы? :)
И ещё - раз всё равно делаем на Ардуине, может, использовать модуль INA219, он же замеряет и силу тока, и напряжение, и под рукой есть? :)
Удалил
может, использовать модуль INA219
Здесь используется INA219 и дисплей не нужен.
https://arduino.ru/forum/proekty/peredelka-kredla-zaryadki-dlya-akb-smartfonov-v-tester-akb-0
Спасибо Tekagi за тестер!! Повторил на макетке - всё работает хорошо, но есть вопрос.
На D9 и D6 при среднем разряде логическая 1, когда при среднем разряде должна быть только на D6, следовательно, что при средней разрядке, что при максимальной один и тот же ток разряда (у меня 400 mA), хотя на дисплее при среднем показывает 220 mA, а по факту открываются транзисторы T3, Т5. По отдельности режимы минимального и максимального разряда работают как положено, значит проблема программная. С железом всё ок! Пробовал разные версии скетча.
Несмотря на это, работой такого тестера аккумов доволен! :)
Enjoy, я уж думал проект давно уехал на полку истории) Будет свободная минута - стряхну пыль с девайса, проверю.
Заранее спасибо!
Ага, есть косяк. Если верно воспроизвёл - то он не проявляется при автоматической смене стадий тестирования, а только при принудительном переключении по кнопке. Причём если нажать кнопку при начальной стадии тестирования внутреннего сопротивления (по резистору R10) - то баг проявится на режиме среднего тока, если на второй (R15) - на режиме минимального тока.
В коде покопался, но не заливал в железо на тест. Код - какой откопал на харде, что за изменения были до этого - не помню) При желании фикс можно добавить в любой, две подсвеченные строчки в блоке разряда.
Tekagi, спасибо большое! Будем пробовать...
Потестил. Косяков не обнаружил.
Спасибо ещё раз!