Конец октября. За бортом целых +10. Сажусь в свой автомобиль, поворачиваю ключ иии....как-то вяло крутит стартер, а вольтметр на приборке (есть у меня привычка вольтаж смотреть) в момент пуска показал 7,5 вольт. По приезду глянул аккумулятор - он у меня с поплавком. Поплавка этого самого не видно (должен быть зелёный) - поставил аккумулятор на зарядку. Ток он почти не брал - минут 5 было 4 ампера, потом упал до 1го и стоял 12 часов, но поплавок так и не показался. Я уже морально смирился с потерей нескольких килорублей (а хороший аккум на 70а/ч стоит 6-8т.руб в среднем), но всё же решил поковырять интернеты, благо паяльник знаю с какой стороны держать, что уже полдела! В интернетах зацепили две разновидности схем - на тиристорах, которые 220 подводят на аккумулятор импульсами и схемы на всем известном и до боли знакомом таймере NE555. Первый вариант не устраивал по двум причинам. Во-первых в цепи 220, в т.ч. и на клеммах аккумулятора (а там где оголенные 220, там и ...бом токнет 146%), во-вторых для эффективности работы нужна целая охапка неполярных конденсаторов, которые к тому же быстро убиваются этой схемой. Остановился на ne555. Глянув схему прикинул "а зачем мне лепить всю эту обвязку, когда есть кучка digispark и всё можно (кроме катушки) смонтировать на ней прям?". Родилась такая вот схема (принципиальную рисовать было лень - просьба сильно не ругать:)):

Деталюшки использованы такие:
Транзистор irl540 - 1шт (на схеме irf1104, но он дороже и тут на не на)
Диоды 1n5408 - 2шт (не принципиально, главное на 3а и больше)
Конденсатор полярный 16в 470мкф - 1шт (лучше на 25 вольт)
Какое-то ферритовое кольцо со дна коробки с барахлом - 1шт
Витая пара (2 жилы) медная - 2,5м/~60 витков. Обмоточный провод кончился.
Резистор на 100-200ом - 1шт
Ну и диджиспарк - одна штука.
Прошиваем плату следующей сверхсложной программой:
03 | unsigned long currentTime; |
04 | unsigned long loopTime; |
12 | currentTime = micros(); |
13 | if (currentTime >= (loopTime + 600)) |
17 | if (currentTime >= (loopTime + 650)) |
20 | loopTime = currentTime; |
Получается что-то типа шим. В комментарии несколько вариантов частот. Можно и свою частоту подобрать, главное чтоб рабочий цикл был не более 10-15%. 1,5кГц по тестам самое то! Визуально "выхлоп" с P0 выглядит так:

Далее навесным монтажом припаиваем всё на плату диджиспарк. Получается такое чудовище:

Далее мотаем катушку, стараясь не выколоть себе глаз и припаиваем к проводам от истока и плюса. Чтобы замерить напряжение импульсов нужно подключить какой-нибудь неполярный конденсатор на выход. Внимание! Без нагрузки транзистор может выбить! Да и напряжение на выходе ближе к сотне вольт - аккуратнее! В общем вот что получается, когда схема "заведётся" (источник ~11 вольт):

Оживлять аккумулятор следует так - заряжаем/разряжаем до 11-12 вольт, подключаем нашу схему последовательно с лампочкой на 12в 21вт (она же на картинке), подключаемся к аккумулятору и только ПОТОМ подаем питание. Далее главное не допускать перезаряда аккумулятора, т.к. схема даже при малых токах его кипятит при полном заряде. Циклы повторяем до получения результата. Мне хватило 3х циклов - зелёный поплавок всплыл, аккум начал брать заряд и куда более бодро проворачивать стартер! На пуске напряжение не падает ниже 8,7 вольт - результат достигнут, но надо бы ещё погонять, правда, как обычно, пока гром не грянет) Выкладываю краткое видео по изготовлению - там есть все необходимые ссылки, в т.ч. и на готовый похожий десульфататор на ne555, а также ссылка на более развёрнутое получасовое видео для тех, кто не спешит;)
https://youtu.be/GQN8HezlegQ
Удачи в программно-аппаратном творчестве!
никада так
if
(currentTime >= (loopTime + 650))
не делай
Сразу скажу две вещи - я не программист, но данная конструкция у меня работает во многих устройствах годами, в связи с чем вопрос. Почему так не делать и как надо правильно?)
Сразу скажу две вещи - я не программист, но данная конструкция у меня работает во многих устройствах годами, в связи с чем вопрос. Почему так не делать и как надо правильно?)
вместо
1
if
(currentTime >= (loopTime + 650))
надо писать
1
if
(currentTime - loopTime >= 650)
Это тот случай, когда "от перемены мест слагаемых"... ну и так далее ;))
Это особенности вычислений в компьютере с ограничением максимального числа. Сумма в которой результат вызовет переполнение - ошибочна, а вычитание ко всяким переполнениям нечувствительно.
На форуме есть тема "Великое переполнение millis()" - поищи её поиском.
(есть у меня привычка вольтаж смотреть) в момент пуска показал 7,5 вольт.
По приезду глянул аккумулятор - он у меня с поплавком. Поплавка этого самого не видно (должен быть зелёный)
В таком случае необходимо проверить плотность электролита в каждой банке при т=20гр. И если плотность в одной или нескольких банках "упала" - только фчирмет. НичО нипалучиццо сделать по причине того, что пластины физически разрушились и их растворила в себе кислота, вследствие этого и понизилась плотность. Поэтому и просаживается напряжение в момент прокрутки до 8 Вольт. Поплавок - это всего-лишь показометр и закручен он в одну банку, остальные пять банок он не видит. Так-шо толку от него почти 0.
Вообще, любые пляски вокруг аккумуляторов "полезны" только тогда, когда он ещё "жив" хоть немного. Вождение хороводов вокруг дохлого акб - эт чотт шаманское. Мошт малитва какая есть, типа О... аккум, зарядись, йоптэ.
По поводу скетча и всего остального: ну-жежь там-жежь тинька85. А в ней два таймера и ацп. Ну неужели нельзя было "приделать" вольтметр на светодиодах, кнопку изменения частоты а саму частоту сделать от таймера??? Ноги то свободные естью Ну и апогеем был бы режим "длядуракофф" = включил и "пошёл", как только замигает зелёный светодиод - выключил.
PS: фигня это всё, еслиБ оно ещё работало и толк был бы...
Это тот случай, когда "от перемены мест слагаемых"... ну и так далее ;))
Большое спасибо! Буду иметь ввиду)
Вообще, любые пляски вокруг аккумуляторов "полезны" только тогда, когда он ещё "жив" хоть немного. Вождение хороводов вокруг дохлого акб - эт чотт шаманское. Мошт малитва какая есть, типа О... аккум, зарядись, йоптэ.
По поводу скетча и всего остального: ну-жежь там-жежь тинька85. А в ней два таймера и ацп. Ну неужели нельзя было "приделать" вольтметр на светодиодах, кнопку изменения частоты а саму частоту сделать от таймера??? Ноги то свободные естью Ну и апогеем был бы режим "длядуракофф" = включил и "пошёл", как только замигает зелёный светодиод - выключил.
PS: фигня это всё, еслиБ оно ещё работало и толк был бы...
По пунктам. Плотность электролита не во всех аккумах можно корректно проверить, например в CA/CA аккумуляторах она неоднородна, пластины там в пакете. Поплавок в них довольно глубоко. В AGM плотность уже никак не померить, тут понятно. Да, физически разрушенные аккумуляторы спасет только их замена, но в случае с сульфатацией процесс обратим. Насколько обратим - зависит от степени запущенности. А вот по приделке вольтметров, диодов, защит от дурака и прочее - это, во-первых, пока в процессе, во вторых - схема усложниться очень значительно и не каждый её осилит. А вот по поводу Вашего P/S - нет, уважаемый, это не фигня и она работает! Владельцы солнечных батарей подобными девайсами успешно реанимируют подуставшие аккумуляторы почти "в завод". Одна из моих таких схем пашет нонстоп - соседям восстанавливаю аккумы. Пока попался только один мёртвый - остальные стали брать заряд и отдавать ток. Экспериментирую с частотами и индуктивностями - результаты интересные.
Можно в эту моргалку внедрить алгоритм окончания заряда с переходом в режим хранения типа "качели" .. или в режим разряда, добавив в схему всего один разрядный мосфет, что в принципе не сложно. Это довольно существенно расширит функциональность почти без изменения (простой) схемы, позволит производить КТЦ с выходом в режим хранения.. и практически можно будет оставлять на длительный срок. Есть форум, где это все уже воплощают в жизнь.. https://electrotransport.ru/ussr/index.php?topic=44520.msg1033420#msg1033420
Можно в эту моргалку внедрить алгоритм окончания заряда с переходом в режим хранения типа "качели" .. или в режим разряда, добавив в схему всего один разрядный мосфет, что в принципе не сложно. Это довольно существенно расширит функциональность почти без изменения (простой) схемы, позволит производить КТЦ с выходом в режим хранения.. и практически можно будет оставлять на длительный срок. Есть форум, где это все уже воплощают в жизнь.. https://electrotransport.ru/ussr/index.php?topic=44520.msg1033420#msg1033420
Себе планирую сделать на подобие. Есть корпус от сгоревшего напрочь ориона (зарядник) - думаю на его базе сделать универсальную зарядку для всего и вся, плюс десульфатация с мониторчиком 1602. У самого в хозяйстве много "свинины", поэтому такой прибор будет востребован, а для человека, которому раз в 2-3 года взбодрить аккум на машине - это крутовато ИМХО) Тут пользователи, как правило, достаточно продвинутые (себя к ним не отношу - просто радиогубитель) - для них не проблема изготовить такое, а для новичков уже тяжеловато. Делаю упор на навесной монтаж, т.е. "на коленке".
Ну добавить хотя бы три резистора в схему, не сильно затруднит.. два на делитель измерения напряжения, и один на шунт.
Схема (с мегой328 от 7 февр 2020) примерно такая
Алгоритм примерно такой: 1) Изначально мерится напряжение на АКБ (НРЦ) 2) Подаются импульсы и мерится ток и напряжение, далее идет подстройка частоты под заданные значения тока и напряжения. 3) В процессе заряда делаются паузы для релаксации и выравнивания токов внутри АКБ. 4) При достижении порога (14,4В) 14,7В напряжение держится на этом уровне со снижением тока заряда до тех пор, пока ток не достигнет минмума и уже почти не будет снижаться + еще заряд в течении 2часов на таком режиме. 5) Далее пауза, в паузе мерится скорость падения напряжения и если скорость снизится до 10мВ/10час или напряжение упадет ниже 12,6В - снова включается дозаряд до 14,7В. и так далее.
Это простой как бы вариант, почти полноценной заряжалки - моргалки.
В делитель напряжения ещё защита нужна, к примеру, на стабилитроне, т.к. если клемма отцепится от аккумулятора - ардуине придёт пушистый зверёк. Ещё момент - на выходе есть некоторые пульсации напряжения и чем ниже ёмкость аккумулятора и ближе окончание заряда, тем они сильнее - придется программно реализовывать измерение напруги между импульсами.
Да, защита тут не помешает, и хотя прибавится еще пару деталюшек, думаю, можно и навесным монтажом обойтись.
Для начала надо сделать функцию замера напряжения и тока, затем выдавать это в порт.. это позволит отладить код программы, чтобы измерения были адекватны и четко работало. Конечно, применять обычный AnalogRead() тут уже не подойдет из за времени исполнения около 120мксек, это слишком много, а нам надо хоть как-то делать усреднения данных и т.д.. так что придется взять примеры из статей. Еще надо будет ввести небольшую паузу, чтобы периодически отправлять данные в порт (а потом и на дисплей), для релаксации тока в АКБ, замеров и анализа состояния АКБ.
Ардуинку на Меге328 (на мой взгляд) лучше применить, потому что цена почти такая же, размеры небольшие, ну и главное - позволяет нарастить "немного мяса" на "кости" этой моргалки, а именно - кнопки, светодиоды для индикации, вывод данных на компьютер (в порт), измерять ток и напряжение.. ну и если дело пойдет хорошо - подключить дисплей и добавить функцию разряда, добавив в схему всего один разрядный транзистор.. что в принципе должно сохранить способность собрать это все "на коленке" навесным монтажом. В конечном итоге, все что делал автор вручную, должно будет максимально автоматизировано и можно будет даже вводить какие-то доп. режимы, вести лог данных и т.д.
Придёццо собрать на 85 тинике, так сказать, шоббыло. Мошт кому впарю заящег срецтва ))) Естэственно, с кнопками и свэтодиодом.
Тоже хотел сделать десульфататор+зарядник интеллектуальный, но старый зарядник сдох раньше чем сделал. По этому купил интеллектуальный зарядник OptiMate.
канечна есть
Как правило перечисленные симптомы это не сульфатация пластин, а их осыпание.
рад , что Вашему акууму полегчало, не мешало бы добавить электролит в банки.
Симптомы схожи, но тут именно сульфатация. Осыпавшиеся пластины ток давать уже не будут, а тут на лицо "выздоровление" как по току, так и по ёмкости.
Конечно, применять обычный AnalogRead() тут уже не подойдет из за времени исполнения около 120мксек, это слишком много,
Дело в том, что этот десульфатор-ЗУ работает по принципу повышающего преобразователя и частота импульсов приходящих на катушку находится в диапазоне 1,5кГц, т.е. длит импульса (при 50% коэф зап) будет не более 650мксек. а нам надо контролировать выходное напряжение и ток этих импульсов. Кроме того необходимо делать оверсемплинг, а это надо успеть сделать как минимум 10-20 выборок и потом еще затратить время на усреднение, на расчеты. Если все это посчитать, то 120мксек это очень много, надо не более 12мксек. Правда можно пойти по другому пути.. например, делать замеры за время в 0,1сек (100 000мксек), и результат усреднять..
Дело в том, что этот десульфатор-ЗУ работает по принципу повышающего преобразователя и частота импульсов приходящих на катушку находится в диапазоне 1,5кГц, т.е. длит импульса (при 50% коэф зап) будет не более 650мксек. а нам надо контролировать выходное напряжение и ток этих импульсов.
На схеме необходимо дорисовать конденсатор параллельно стабилитрону и RC фильтр на вход A1.
В результате, возможно, получится устройство для (под)заряда аккумулятора, ни о какой десульфатации речь не идет.
Для десульфатации нужно добавлять схему разряда (это несложно) и мужика, который будет доливать дистиллированную воду и замерять плотность электролита.
В результате, возможно, получится устройство для (под)заряда аккумулятора, ни о какой десульфатации речь не идет. Для десульфатации нужно добавлять схему разряда (это несложно) и мужика, который будет доливать дистиллированную воду и замерять плотность электролита.
Если добавить конденсатор параллельно стабилитрону и RC фильтр на вход А1, то вряд ли можно будет замерить например, пиковое напряжение в импульсе (хотя бы приблизительно). Возможно (после опытов) так и будет - будет добавлен кондер и фильтр.
А десульфацию можно проводить по разному - 1) долбить короткими (мксек) импульсами с амплитудой от 40В и током в сотни Ампер.. и эти десульфаторы (в народе) называются "ДОЛБИЛКИ" 2) Импульсами от нескольких десятков Гц до кГц с напряжением прим 20-30В и током в несколько десятков Ампер называемые "МОРГАЛКАМИ" 3) Зарядные импульсы с разрядом, называемые "заряд с реверсом". 4) Десульфация постоянным/импульсным малым током с конечным напряжением 14,7-17В.. Ну и так далее.
В Нашем случае схема позволяет проводить десульфацию по 2 и 4 пункту, а если добавить разрядный мосфет, то и по 3 пункту + проводить КТЦ, ну и само собой делать обычный заряд. Воду необходимо доливать когда делается восстановление АКБ. Профилактический заряд можно проводить и без долива воды.
В результате, возможно, получится устройство для (под)заряда аккумулятора, ни о какой десульфатации речь не идет. Для десульфатации нужно добавлять схему разряда (это несложно) и мужика, который будет доливать дистиллированную воду и замерять плотность электролита.
Если добавить конденсатор параллельно стабилитрону и RC фильтр на вход А1, то вряд ли можно будет замерить например, пиковое напряжение в импульсе
А десульфацию можно проводить по разному - 1) долбить короткими (мксек) импульсами с амплитудой от 40В и током в сотни Ампер.. и эти десульфаторы (в народе) называются "ДОЛБИЛКИ" 2) Импульсами от нескольких десятков Гц до кГц с напряжением прим 20-30В и током в несколько десятков Ампер называемые "МОРГАЛКАМИ" 3) Зарядные импульсы с разрядом, называемые "заряд с реверсом". 4) Десульфация постоянным/импульсным малым током с конечным напряжением 14,7-17В.. Ну и так далее.
Десульфатация по принципу "заряд с реверсом" (нормальными токами без фанатизма) проводилась задолго до распространения в ширнармассах импульсной техники и иногда давала реальные результаты. А идеи с десятками вольт и сотнями ампер мне представляются, мягко выражаясь, сомнительными.
В Нашем случае схема позволяет проводить десульфацию по 2 и 4 пункту, а если добавить разрядный мосфет, то и по 3 пункту + проводить КТЦ, ну и само собой делать обычный заряд. Воду необходимо доливать когда делается восстановление АКБ. Профилактический заряд можно проводить и без долива воды.
Дык десятки вольт тут имульс всего лишь - какие сотни ампер?) Это не той сложности схема, чтобы строить теории и ломать голову на тему "работает или нет?" ИМХО - практика тут решает. Почитал в инете, полазил по али, нашел похожую, полистал отзывы у разных продавцов - решающим был отзыв человека, у которого солнечная электростанция - выложил все замеры "до" и "после" - эффект есть! Мой аккумулятор, что в машине прошел ещё пару циклов - теперь на пуске уже 10,3в (практически номинал), зелёный поплавок больше не "убегает", т.е. заряд берёт нормально. Напомню: до "обработки" поплавок не показывался, аккумулятор заряд не брал толком, на пуске напряжение просаживалось до 7 вольт (при +10 тепла), после трёх циклов появился заряд, на пуске стало больше 9 вольт, потом недавно прошёл ещё пару циклов - уже 10,3в при -1 градусе тепла.
Вывод - схема работает, причем заметно. Сейчас оживляю "труп" о 70ач, из которых 10 осталось, пусковой ток уже не дает ессна. Дня 4ре его мучаю - уже 21ач, ток пока не проверял. Мучаю дальше ;)
SLKH я Вам привел примеры десульфации которые не сам придумал, а которые реально работают во многих серийных ЗУ и много раз обсуждаемые на специализированных форумах по этим вопросам и испробованных на практике. Поэтому нет смысла разводить здесь дискуссию. Контроль уровня и плотности, долив воды и тому подобное - уже другая тема, которая касается обслуживания АКБ в целом.
Что касается измерений пиковых значений тока и напряжения, а также их средних значений, то на мой взгляд, это важно для правильной настройки режима десульфации и заряда в целом, а также чтобы не спалить устройство.. по моему это очевидно.
В простом варианте, можно измерять напряжения на АКБ и по достижению нужного значения - выключать заряд с переходом в качели, все остальное остается как есть..
Дык десятки вольт тут имульс всего лишь - какие сотни ампер?)
Вот эти: "... импульсами с амплитудой от 40В и током в сотни Ампер.."
SLKH я Вам привел примеры десульфации которые не сам придумал, а которые реально работают во многих серийных ЗУ и много раз обсуждаемые на специализированных форумах по этим вопросам и испробованных на практике. Поэтому нет смысла разводить здесь дискуссию.
Развлечение это достаточно безобидное, речь всё равно идет о полудохлых аккумуляторах. Или его характеристики улучшатся, или не изменятся, или он совсем сдохнет - в любом случае не критично.
Самое лучшее - это дать дельный совет, по скетчу или по схеме. Вот скетч простого варианта
001
/*
002
* 16 февр 2020 Простой вариант моргалки и окончания заряда по верхнему порогу с переходом в качели
003
* Опорное вн = 1,1В вх. делитель = 1:31 Резисторы 1к и 30 кОм Макс вх.напр = 34,1В
004
* Точность измерений = 33000/1024 =0,032V или с оверсемпл = 0,05V..
005
* Значение АЦП = 441 соотв 14,7В Чтобы вычислять напряжение нужно знач АЦП * на 0,03333
006
* Версия Ардуино ИДЕ 1.8.9
007
* == АЛГОРИТМ -
008
* Позволяет оставлять моргалку на сколь угодно долгое время, исключает перезаряд.
009
* А также данные выводятся в порт и можно смотреть графики заряда.
010
* При запуске проверяется напряжение, если на входе ниже 0,9В то заряд не включается и изм НРЦ.
011
* ЗАРЯД включаются импульсы заряда пока напряжение не дойдет до верхнего порога
012
* или длит не превысит установленное значение.
013
* если не достинут порог а длит имп. превышена - включается пауза, идут измерения далее заряд
014
* При достижении верхнего порока включается качели
015
* в качелях измеряется НРЦ и время, даже если НРЦ достигло нижнего порога но время не вышле
016
* пауза-качели продолжается.. если порог достигнут и время вышел - включается заряд по новой.
017
* Результат компиляции на 22/02/20 6:32 - Скетч использует 5134 байт
018
*/
019
020
021
unsigned
long
currentTime, loopTime;
// переменные от первого скетча
022
unsigned
long
time, time1, time2 ;
023
024
// параметры заряда, паузы и качель
025
unsigned
long
time_kachel = 300000;
// мин время качелей (5мин)
026
unsigned
long
time_imp = 50000;
// длит заряда 50сек
027
unsigned
long
time_pauza = 7000;
// пауза 7 сек
028
029
//измерения
030
float
V, V1,I;
//переменные изм. напряжения и тока
031
float
V_high = 14.7;
// ВЕРХНИЙ ПОРОГ
032
float
Kv = 0.033333;
// коэф на который надо умножит знач АЦП чтобы получить напряжение в Вольтах.
033
//float V_high = 441; // верхний порог без перевода в вольты
034
float
V_low = 13.1;
// НИЖНИЙ ПОРОГ для качелей (подбирается по типу и состоянию акб)
035
//float V_low = 393; // НИЖНИЙ ПОРОГ для качелей (подбирается по типу и состоянию акб)
036
037
int
j ;
// счетчик
038
int
srednee = 1000;
// переменная = количеству измерений в усреднении
039
//int srednee2 = 100; // переменная = количеству измерений в усреднении
040
041
// назначение пинов ардуины
042
#define VoltagePin A0 //Пин измерения напряжения на АКБ
043
#define CarrentPin A1 //Пин измерения тока
044
#define MosfetPin A2 //Пин управления ключом заряда
045
046
void
setup
() {
047
analogReference(INTERNAL);
// опорное будет 1.1V
048
Serial
.begin(9600);
049
pinMode(VoltagePin,INPUT);
050
pinMode(CarrentPin,INPUT);
051
pinMode(MosfetPin,OUTPUT);
052
Serial
.println(
"sketch Mega328 "
);
Serial
.print(
"22.02.2020 "
);
053
054
// цилкл проверки НРЦ на входе, если нет - то ждет пока не появится!
055
V1 = 0 ;
056
do
{
057
for
(j = 1; j < srednee; j++) {
058
V1 = analogRead(VoltagePin) + V1;
059
}
060
V = V1/srednee * Kv ;
//получаем усредненное значение НРЦ
061
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
062
delay(1000);
//
063
}
while
(V > 0.9);
064
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
065
Serial
.println(
" Zariad !... "
);
066
}
067
068
void
loop
()
069
{
070
Accelero();
// процедура заряда с заданной длительностью (time_imp = 50000)в млсек.
071
V = analogRead(VoltagePin) * Kv;
// измерение напряжения на АКБ
072
if
(V >= V_high)
073
{
074
Kacheli();
075
}
076
Pauza();
077
}
078
079
//---------------------БЛОК ПРОЦЕДУР И ФУНКЦИЙ -------------------------------------------
080
081
// функция измерения напряжения
082
083
//Функция измерения напряжения с оверсемплингом
084
085
// процедура формирования зарядно-десульфирующих импульсов от Accelero
086
void
Accelero()
087
{
088
time = millis();
089
do
{
090
currentTime = micros();
091
if
(currentTime >= (loopTime + 600))
//~1,5khz (600/650), ~4,5khz (200/210), ~450hz (2000/2200).
092
{
093
digitalWrite(MosfetPin,HIGH);
094
}
095
if
(currentTime >= (loopTime + 650))
096
{
097
digitalWrite(MosfetPin,LOW);
098
loopTime = currentTime;
099
}
100
time2 = millis()- time ;
101
}
while
(time2 >= time_imp);
102
// return;
103
}
// end void Accelero()
104
105
// процедура паузы ----------------------------------------------------------------------
106
void
Pauza()
107
{
108
int
j ;
109
time = millis();
110
// крутим цикл – измеряем напряжение и время
111
do
{
112
V1 = 0 ;
113
do
{
114
for
(j = 1; j < srednee; j++) {
115
V1 = analogRead(VoltagePin) + V1;
116
}
117
V = V1/srednee * Kv ;
//получаем усредненное значение НРЦ
118
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
119
delay(1000);
//
120
}
while
(V > 0.9);
121
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
Serial
.print(
" .. PAUZA... "
);
122
123
time2 = millis()- time ;
124
}
while
(time_pauza >=time2);
125
// return;
126
}
// -------------------------------------------------------------------------
127
128
// ПРОЦЕДУРА КАЧЕЛЬ ----------------------------------------------------------------------
129
void
Kacheli()
130
{
131
time = millis();
132
// крутим цикл – измеряем напряжение и время
133
do
{
134
for
(j = 1; j < srednee; j++) {
135
V1 = analogRead(VoltagePin) + V1;
136
}
137
138
V = V1/srednee * Kv ;
//получаем усредненное значение НРЦ
139
time2 = millis()- time ;
140
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
Serial
.print(
" .. Kacheli.. "
);
141
delay(2000);
142
}
while
((time_kachel >= time2) && (V <= V_low));
143
// return;
144
}
// ---------------------------------------------------------------------------------------
145
146
// -----------------КОНЕЦ БЛОКА С ФУНКЦИЯМИ И ПРОЦЕДУРАМИ ------------------
Скетч еще не проверен в деле.. но уже можно от чего-то отталкиваться. Основные параметры: длит заряда = 50сек, пауза 7 сек. После достижения напряжения на АКБ до 14,7В включаются качели минимум на 5 минут с нижним порогом до 13,1В.. нижний порог можно поменять до 12,8 или сделать другой.
Из статьи https://alexgyver.ru/lessons/pwm-overclock/ устанавливаем частоту регистрами и затем запускаем analogWrite();
01
// пример использования analogWrite() с предустановкой регистрами для меги328
02
03
void
setup
() {
04
05
// Пины D9 и D10 устанавливаются на выход 2 кГц 10bit (1024)
06
TCCR1A = 0b00000011;
// 10bit
07
TCCR1B = 0b00001010;
// x8 fast pwm
08
09
// устанавливаем ШИМ на 9 пине с коэф зап = 90
10
analogWrite(9, 90);
// длит имп =45мксек, пауза = 455мксек
11
}
12
13
void
loop
() {
14
15
}
Можно сначала сделать подбор частоты, но надо уже использовать библиотеку из той же статьи.
01
// установка частоты с помощью библиотеки из статьи
02
#include "GyverPWM.h"
03
04
void
setup
() {
05
pinMode(9, OUTPUT);
06
PWM_frequency(9, 1540, FAST_PWM);
//ШИМ на D9 с частотой 1540 Гц и 8бит
07
08
// устанавливаем ШИМ на 9 пине с коэф зап = 19 аналогично - analogWrite(9, 19)
09
PWM_set(9, 19);
// длит имп =50мксек, пауза = 600мксек все как в оригинале
10
}
11
12
void
loop
() {
13
}
Так.. теперь надо повысить разрядность ШИМ.. 8 бит маловато, сделаем 10 бит, должно хватить.
01
#include "GyverPWM.h"
02
void
setup
() {
03
pinMode(9, OUTPUT);
04
PWM_frequency(9, 1540, FAST_PWM);
//ШИМ на D9 с частотой 1540 Гц и 8бит
05
PWM_resolution(9, 10, FAST_PWM);
//ШИМ на D9 и 10 бит (уже с частотой 1540 Гц)
06
07
// устанавливаем ШИМ на 9 пине с коэф зап = 19 аналогично - analogWrite(9, 19)
08
PWM_set(9, 79);
// длит имп =50мксек, пауза = 600мксек все как в оригинале
09
}
10
void
loop
() {
11
}
Итого, по идее, мы можем запустить ШИМ и одновременно мерить напряжение.. в этом случае можно использовать обычный аналогРид() с усреднением.. и считывать напряжение на АКБ во время заряда.. а также и считывать ток. Теперь что у нас по времени.. если усреднять 1000 считываний, то должно хватить на более менее стабильные данные (достаточно с разрешением 0,1В).. при этом все время займет около 120мкс*1000 =120-200млсек.. (4 раза в секунду) в принципе должно хватить.
01
// 22/02/2020 делаем 10 сек заряд и 10 сек пауза - проверка работы
02
// во время паузы можно снять клемму с АКБ и ШИМ (заряд) не будет идти
03
04
#include <GyverPWM.h> // библиотека c сайта " <a href="https://alexgyver.ru" title="https://alexgyver.ru" rel="nofollow">https://alexgyver.ru</a> "
05
#define VoltagePin A0 //Пин измерения напряжения на АКБ
06
#define CarrentPin A1 //Пин измерения тока
07
#define MosfetPin 9 //Пин управления ключом заряда
08
09
float
V, V1, I ;
//переменные изм. напряжения и тока
10
float
V_high = 14.7;
// ВЕРХНИЙ ПОРОГ
11
float
Kv = 0.033333;
// коэф для преобр в Вольты (делитель 1кОм и 30кОм
12
13
unsigned
long
currentTime, loopTime;
// переменные от первого скетча
14
unsigned
long
time, time1, time2, time3, startTime;
15
16
int
j ;
// счетчик
17
int
srednee = 1000;
// переменная = количеству измерений в усреднении
18
19
void
setup
() {
20
analogReference(INTERNAL);
// опорное 1.1V
21
Serial
.begin(9600);
// уст скорость в порту
22
pinMode(CarrentPin,INPUT);
// пин для изм тока
23
pinMode(VoltagePin,INPUT);
// пин для изм напряжения на АКБ.
24
pinMode(MosfetPin, OUTPUT);
// пин управления зарядом (мосфетом)
25
PWM_frequency(MosfetPin, 1540, FAST_PWM);
//ШИМ на D9 с частотой 1540 Гц и 8бит
26
PWM_resolution(MosfetPin, 10, FAST_PWM);
//ШИМ на D9 и 10 бит (уже с частотой 1540 Гц)
27
startTime = millis();
28
}
29
30
void
loop
() {
// основной цикл программы
31
// micros();
32
time2 = 0; time = 0; time1 = millis(), time3 = millis(),
33
// запускаем генерацию ШИМа на 9 пине с коэф зап = 79
34
PWM_set(MosfetPin, 79);
// длит имп =50мксек, пауза = 600мксек все как в оригинале
35
36
// и теперь делаем измерение напряжения на АКБ во время заряда
37
38
do
{
39
40
V1 = 0 ;
//сброс значения напряжения
41
for
(j = 1; j < srednee; j++) {
42
V1 = analogRead(VoltagePin) + V1;
43
}
44
V = V1/srednee * Kv ;
//получаем усредненное значение НРЦ
45
46
// пробуем выдать данные в порт с интервалом в 1 секунду
47
time = millis()- time1 ;
// отсчет 1000 млсек (1 сек)
48
if
(time >= 1000) {
49
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
50
Serial
.println(
" currentTime sek = "
);
Serial
.print(currentTime/1000000);
51
time = 0; time1 = millis();
// для осчета по новой..
52
}
53
54
time2 = millis()- time3 ;
// высчитываем время длит заряда
55
}
while
((V >= V_high ) && ( time2 >= 10000));
// если напр. выше 14,7 или прошло 10сек выход из цикла
56
57
digitalWrite(MosfetPin, LOW);
// выключаем генерацию ШИМ (выкл. тока заряда)
58
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
// выдаем напр. на АКБ в порт
59
Serial
.println(
" Time sek = "
);
Serial
.print((millis() - startTime)/1000);
// общ. время
60
Serial
.println(
" Start Pauza 10 sek ... "
);
61
// надо бы зажечь светодиодик обозначающий паузу.. чтобы в этот момент можно было отсоединить АКБ.
62
// delay(10000); // 10сек пауза ..
63
64
65
/* сделаем на всяк случай безопасное отключение - крутим цикл
66
Если 10сек не прошло и на входе нет напр выше 0,9В
67
(АКБ не подсоединен) то впадаем в цикл ожидания появления напр.
68
*/
69
time = 0; time2 = 0; time1 = millis(); time3 = millis();
70
do
{
71
V1 = 0;
72
for
(j = 1; j < srednee; j++) {
73
V1 = analogRead(VoltagePin) + V1;
74
}
75
76
V = V1/srednee * Kv ;
//получаем усредненное значение НРЦ
77
time2 = millis()- time3 ;
// отсчет 1 сек.
78
time = millis()- time1 ;
// общее время в цикле
79
80
if
(time2 >= 1000) {
81
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
82
Serial
.println(
" Pauza sek = "
);
Serial
.print( time/1000);
83
time2 = 0; time3 = millis();
// для осчета по новой..
84
}
85
86
}
while
((V > 0.9) && (time >= 10000 ));
87
88
Serial
.println(
" END Pauza ! - Start Zariad!"
);
89
Serial
.println(
" Vakb = "
);
Serial
.print(V,2);
90
91
}
Как бы должно работать.. получился тестовый скетч для проверки измерений, для проверки генерации импульсов, - можно проверить на той же катушке, что первоначально использовалась в проекте.. Параметры, импульсов - частота (1540Гц) , длит импульса (50мксек) и паузы(600мксек) (если не врет прога и Ардуина и не накосячил с лихвой), должны совпадать с первоначальными настройками. Сегодня как бы работка понемногу идет..
Итак продолжим предыдущий пост.. Надо еще включить измерение тока.. а там еще "конь не валялся".. По мелочи" надо бы хотя бы светодиодом моргать и кнопку "стоп старт" прикрутить в прогу.
По крупному - надо сделать функцию подбора и удержания заданного тока заряда на основном заряде до 14,4В и потом плавно снижать ток вплоть до минимума.. наверное надо будет повышать разрядность ШИМ до 12бит.. Наверное это самый сложный этап как в программе, так и в настройке схемы.. Хотя если получится, то можно будет брать любую более менее подходящую катушку, а программа сама настроит под оптимальный ток.. было бы неплохо.
На первом этапе ток будет задаваться жестко в сэтапе, в последствии через меню кнопками (энкодером) или через порт. Начнем пожалуй с тока до 10-20А в импульсе.. в среднем это будет не больше 3-6А, значение которого (если что) можно будет поменять в сэтапе в любых (почти) пределах. Для автомобильных АКБ как раз. Катушка и мосфет должны подходить по параметрам.. Интересно, что нам может дать 10 разрядный ШИМ если максимальный ток будет 20А? 20000мА/1023 = т.е. шаг примерно будет = 20мА.. с натяжкой должно хватить, если что перейдем на 12 битный.
Также надо будет доработать процедуру качель.. качели надо будет начинать тогда, когда ток упадет до минимума = 0,001С т.е. 0,1% от емкости АКБ по паспорту, что от 60Ач АКБ будет составлять 0,06А (60мА).. или уже не будет понижаться, встанет "колом" на каком-то одном значении. А также надо будет сделать замеры саморазряда в паузе (что важно для анализа) и нижний порог по скорости падения напряжения.
Если все это удастся сделать, то будет себе пристойная супер моргалка - зарядное устройство с десульфирующем действием, не хуже чем было изначально, но с расширенными функциями, которую можно собрать на "коленке" без особых усилий. Пора приступать к функции замера тока, потом сделать схему.. вроде все необходимое для этого есть, проверю как это может быть "на коленке" ..
Апну тему, может ЮриБас если заходит на форум увидит и ответит, получилось ли у него доделать прошивку или остановился на той что постом выше.
На ATtiny85:
001
// FREQ = 16,5Mhz
002
003
#define VoltagePin A2 //Пин измерения напряжения на АКБ
004
#define CarrentPin A1 //Пин измерения тока
005
#define MosfetPin 1 //Пин управления ключом заряда
006
007
float
V, V1, I ;
// переменные изм. напряжения и тока
008
float
V_high = 14.7;
// ВЕРХНИЙ ПОРОГ
009
float
Kv = 0.033333;
// коэф для преобр в Вольты (делитель 1кОм и 30кОм
010
011
unsigned
long
currentTime, loopTime;
// переменные от первого скетча
012
unsigned
long
time, time1, time2, time3, startTime;
013
014
int
j ;
// счетчик
015
int
srednee = 1000;
// переменная = количеству измерений в усреднении
016
bool
go =
false
;
017
#define ButtonPin 0
018
#define LedPin 4
019
020
021
void
setBotton() {
022
if
(!digitalRead(ButtonPin)){
023
go = !go;
024
digitalWrite(ButtonPin,go);
025
}
026
}
027
028
029
void
setup
() {
030
analogReference(INTERNAL);
// опорное 1.1V делитель 1k - 30k
031
pinMode(CarrentPin, INPUT);
// пин для изм тока
032
pinMode(VoltagePin, INPUT);
// пин для изм напряжения на АКБ.
033
pinMode(MosfetPin, OUTPUT);
// пин управления зарядом (мосфетом)
034
pinMode(ButtonPin, INPUT_PULLUP);
//пин кнопки управления
035
pinMode(LedPin, OUTPUT);
// пин светодиода
036
037
startTime = millis();
038
}
039
040
void
loop
() {
// основной цикл программы
041
// micros();
042
043
setBotton();
044
if
(go) {
045
time2 = 0; time = 0; time1 = millis(), time3 = millis(),
046
DDRB = (1 << PB1);
047
OCR1A = 15;
048
OCR1C = 165;
049
TCCR1 = (1 << PWM1A) | (1 << COM1A0) | (1 << CS12) | (1 << CS11) | (1 << CS10);
// делитель /64
050
051
// и теперь делаем измерение напряжения на АКБ во время заряда
052
053
do
{
054
055
V1 = 0 ;
//сброс значения напряжения
056
for
(j = 1; j < srednee; j++) {
057
V1 = analogRead(VoltagePin) + V1;
058
}
059
V = V1 / srednee * Kv ;
//получаем усредненное значение НРЦ
060
061
// пробуем выдать данные в порт с интервалом в 1 секунду
062
time = millis() - time1 ;
// отсчет 1000 млсек (1 сек)
063
if
(time >= 1000) {
064
// Serial.println(" Vakb = "); Serial.print(V,2);
065
// Serial.println(" currentTime sek = "); Serial.print(currentTime/1000000);
066
time = 0; time1 = millis();
// для осчета по новой..
067
}
068
069
time2 = millis() - time3 ;
// высчитываем время длит заряда
070
}
while
((V >= V_high ) && ( time2 >= 10000));
// если напр. выше 14,7 или прошло 10сек выход из цикла
071
072
digitalWrite(MosfetPin, LOW);
// выключаем генерацию ШИМ (выкл. тока заряда)
073
// Serial.println(" Vakb = "); Serial.print(V,2); // выдаем напр. на АКБ в порт
074
// Serial.println(" Time sek = "); Serial.print((millis() - startTime)/1000); // общ. время
075
// Serial.println(" Start Pauza 10 sek ... ");
076
// надо бы зажечь светодиодик обозначающий паузу.. чтобы в этот момент можно было отсоединить АКБ.
077
// delay(10000); // 10сек пауза ..
078
079
080
/* сделаем на всяк случай безопасное отключение - крутим цикл
081
Если 10сек не прошло и на входе нет напр выше 0,9В
082
(АКБ не подсоединен) то впадаем в цикл ожидания появления напр.
083
*/
084
time = 0; time2 = 0; time1 = millis(); time3 = millis();
085
do
{
086
V1 = 0;
087
for
(j = 1; j < srednee; j++) {
088
V1 = analogRead(VoltagePin) + V1;
089
}
090
091
V = V1 / srednee * Kv ;
//получаем усредненное значение НРЦ
092
time2 = millis() - time3 ;
// отсчет 1 сек.
093
time = millis() - time1 ;
// общее время в цикле
094
095
if
(time2 >= 1000) {
096
// Serial.println(" Vakb = "); Serial.print(V,2);
097
// Serial.println(" Pauza sek = "); Serial.print( time/1000);
098
time2 = 0; time3 = millis();
// для осчета по новой..
099
}
100
101
}
while
((V > 0.9) && (time >= 10000 ));
102
103
// Serial.println(" END Pauza ! - Start Zariad!");
104
// Serial.println(" Vakb = "); Serial.print(V,2);
105
106
}
107
}
Резистор R1 = 30 Килоом