Зарядное устройство Ni-MH на контроллере AVR.

Не очень уверен в какой блог публиковать, но вроде про питание тут больше, чем про AVR :)

Preamble


Есть у меня замечательная подруга — любительница велосипеда. В прошлом году она купила для своего двухколёсного транспорта фару. Вот такую (фото с tripemma.info):



Фонарь изумительный, оснащённый мощным светодиодом с рефлектором, драйвером для диода и встроенным аккумулятором 4.8V/780mAh. Так как фонарь был приобретён ближе к концу велосезона, хозяйка не успела ещё посадить “батарейку”, как пришло время зимней парковки. Соответственно, поскольку аккумулятор не сел, то и заряжать его не пришлось. Как следствие, зарядное устройство было среди зимы ненароком выброшено, по причине “Интересно, а это от чего? Не помню… Ааа, нафиг его!” :)

Зима прошла, снова стало тепло и сухо, снова велосипед стал основным транспортом, снова понадобился фонарь. И, конечно, аккумулятор сел, хоть и не сразу. Эта история и привела к разработке следующего девайса, который может быть с небольшими изменениями использован для зарядки любых Mi-MH и Ni-Cd аккумуляторов.

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

Ещё один момент: я тупо не нашёл ни в одном магазине города ни MAX713, ни какого-либо другого контроллера зарядки, иначе бы не парился. А может и парился бы, интересно всё же :)

Theory


Теорию изложу так, как я её понял в процессе разработки девайса и в том объёме, которого мне хватило. Возможно, где-то я не совсем прав, или даже совсем не прав. В таком случае буду рад комментариям и пояснениям.

Ещё одна важная деталь: всё нижесказанное относится только к Ni-MH аккумуляторам. Ni-Cd имеют некоторые особенности, но в целом теория справедлива и для них. К Li-Ion, Li-Pol, свинцовым аккумуляторам теория не относится. Они работают по другому, и методы зарядки/контроля у них свои, не знаю какие. Так что, если при попытке зарядить описанным способом автомобильный, например, аккумулятор, у вас сломается зарядка/аккумулятор, пострадает мебель, кошка/собака/попугай/рыбки, или ещё чего-нибудь приключится, то я за это ответственности не несу )

В разработке девайса я руководствовался статьями на cxem.net и далее по ссылкам. Спасибо им! В основном, излагаемый материал я почерпнул там, но, разумеется, пишу всё своими словами и через призму своего понимания.

У аккумулятора или аккумуляторной батареи есть такая характеристика как ёмкость. И есть связанное с ней понятие зарядного тока. Если обозначить ёмкость аккумулятора как C, то зарядный ток может составлять от 0.1С (медленная зарядка) до 0.2C-C а то и выше (быстрая зарядка). Понятно, чем выше ток, тем быстрее происходит зарядка аккумулятора. Но в то же время тем активнее протекающие в нём химические реакции, тем больше на нём выделяется тепла и тем быстрее он склеит клеммы. Поэтому выбор тока зарядки это поиск компромисса между временем зарядки и временем жизни аккумулятора.

Отдельное значение имеет момент прекращения зарядки. Дело в том, что к окончанию зарядки выделение тепла на аккумуляторе усиливается, и, прозевав момент, можно угробить аккумулятор или нанести существенный ущерб его здоровью. Поэтому дешёвые зарядные устройства как правило держат ток зарядки в пределах 0.1C — такой ток не сможет существенно нагреть аккумулятор и вывести его из строя. Но тем не менее, постепенно аккумулятор всё таки гробится. Поэтому крайне желательным свойством зарядного устройства является талант определять момент окончания зарядки и автоматически выключаться.

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

Способ второй заключается в определении конца зарядки по изменению напряжения на клеммах аккумулятора. По мере зарядки напряжение на аккумуляторе растёт, к окончанию зарядки рост напряжения останавливается, или оно начинает падать. Это и есть признак того, что аккумулятор полностью заряжен. То есть можно просто мерять напряжение на аккумуляторе и выключать зарядку как только оно начнёт падать? Не совсем. Дело в том, что характер изменения напряжения сильно зависит от типа аккумулятора, его ёмкости, степени его разряженности к началу зарядки, тока зарядки и ещё кучи факторов. К тому же в начале зарядки бывают перепады напряжения, которые могут быть неверно истолкованы. Но общая закономерность есть, её можно использовать, её и используют большинство “умных” контроллеров зарядки, и моё устройство не исключение.

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

Помимо всего вышесказанного, существует такая проблема как “эффект памяти”. Заключается о вот в чём: если начать заряжать аккумулятор не посадив его до конца, то на его электродах внутри что-то там кристаллизуется из электролита, снижая эффективную площадь электродов, эффективный объём электролита, и наверняка что-нибудь ещё :) Отчего аккумулятор, само собой, лучше не работает, а тот порог заряженности, с которого его начали заряжать, становится его нижним порогом, то есть ёмкость падает.

Чтобы избежать такого развития событий, аккумулятор следует хотя бы периодически сажать “в ноль”, то есть до напряжения 0.8-1V на элемент, для Ni-MH. При этом вражеские кристаллы разрушаются и освобождают пленные электроды. В своём девайсе я решил реализовать такую стратегию: при напряжении на аккумуляторе ниже некоторого порога, он перед зарядкой полностью разряжается. Эта функция работает не очень, даже при напряжении ниже этого порога, аккумулятор начинает заряжаться практически сразу. Может я где-то накосячил с замерами, не знаю, но во всех рассмотренных мною конструкциях режим разрядки включался вручную. Я попробовал его автоматизировать, но это дело требует доработки. В случае с велофонарём это не так критично, поскольку в фонаре есть DC-DC драйвер, который гарантированно высосет из аккумулятора всё что можно.

Recipe


Принципиальная схема устройства ничем не оригинальна, и почти повторяет кучу других подобных (схема в приложенном архиве в нормальном разрешении):



Так как аккумулятор следует заряжать постоянным током, в схеме применён интегральный стабилизатор IC2 — LM317 в режиме стабилизации тока. Ток, который этот стабилизатор имеет на выходе определяется резистором R7, и составляет примерно 1.25/R, в моём случае где-то 125mA. Помимо этого полезно знать, что на стабилизаторе падает 1.25V своих, плюс все лишние, которые не уходят на питание нагрузки. И чем больше падает, тем больше стабилизатор греется. То есть питание стабилизатору нужно давать как минимум на 1.25V больше чем от него потребуется на выходе, но и не слишком много, так как на все лишние вольты он будет отапливать квартиру и, неровен час, помрёт от такого стресса. У меня питание обеспечивается трансом от китайского адаптера, в сочетании с диодным мостом и конденсатором он даёт вольт 12-13 под нагрузкой, чего за глаза хватает. Можно бы даже поменьше.



Зарядный ток подаётся на аккумулятор транзистором Q2. Резистор R12 держит транзистор закрытым, пока на его базу не поступит минус с транзистора Q1, который в свою очередь открывается живительным плюсом с порта PB1 контроллера.

Транзистор Q3 представляет собой ключ разряда и вся его работа состоит в том, чтобы пустить ток с аккумулятора через резистор R13, дабы аккумулятор сел побыстрее :) Транзистор IRLR120 управляется логическим уровнем, то есть чтобы открыть его нараспашку хватит пяти вольт с ноги контроллера, и больше ничего городить не надо. Резистор R11 тянет затвор этого транзистора к земле, чтобы он не открылся сам от наводок, что может случаться с полевыми транзисторами.

Цепочка R8/R9 это делитель, снижающий напряжение с аккумулятора для АЦП контроллера. Опорное напряжение АЦП 1.1V, то есть АЦП может измерить от 0V до 1.1V, что даёт нам возможность мерять от 0 до 10.12V, с шагом 9.88mV, при указанных на схеме номиналах. Для аккумулятора 4×1.2V = 4.8V — самое то.

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

Стабилитрон на 4V7 на всякий случай защищает вход от передозировки вольтами. Он, кстати, на маленьких токах срабатывает не от 4V7, а при меньшем напряжении, что меня сбивало с толку при экспериментах на отладочной плате с опорными 2.56 и 5 V. Кто не знал — возьмите на заметку, я вот не знал.

Нафиг нужен конденсатор С2 я не знаю :) Нет, серьёзно, я в целом понимаю, что он там гасит помехи и всё такое, но в чём численно выражается его функция мне неведомо. Так что стоит он там потому что у всех так :)

Управляется всё контроллером attiny13 от atmel. Поначалу я боялся, что в 1 килобайт памяти не влезу, поэтому начинал разработку под имеющиеся attiny45, но в итоге программа получилась чуть меньше кило, так что в готовом девайсе стоит всё таки attiny13. Для того, чтобы программа заработала на attiny 25/45/85 нужно только изменить инициализацию АЦП — там биты конфигурации чуть другие. Плату или схему менять не нужно.



Контроллер измеряет напряжение на ноге PB2 и в зависимости от оного дёргает ногами PB0 или PB1 включая разрядку или зарядку соответственно. Также он дёргает ногами PB3 и PB4, к которым подключен двухцветный светодиод. Резисторы в цепи диода стоят разные, так как от природы красная половина диода при том же токе светится куда ярче зелёной. Пришлось зелёной дать фору.

Питается контроллер от стабилизатора LM7805 о пяти вольтах. К тем же пяти вольтам подтянута через резистор нога 1 контроллера (RESET) — во избежание случайных сбросов.

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

Cooking


Сначала устройство отлаживалось на отладочной плате. Так как у Mega8 другое опорное напряжение АЦП, пришлось чуть чуть поменять номиналы R8/R9. 2K7/8K2, дают примерно тот же диапазон при 2.56V опорного напряжения, что и 1K/8K2 при 1.1V.



После отладки я выбрал корпус для устройства. Такой, чтобы влез в него и девайс и транс питания. Такой, чтобы были выводы под провода. Вот такой:



Обошёлся он мне в $2, в местном магазине (на Абая-Сейфуллина). Дырки в корпусе насверлены мной самостоятельно, чтобы улучшить (вернее создать) вентиляцию. LM317 и лишние вольты, да. Также в корпус дихлорэтаном вклеены два куска пластика с отверстиями под шурупы крепления крышки (с одной стороны, со второй есть вполне живые защёлки), и два, от этого же корпуса отломанных ушка. Они служат упорами для транса, чтобы тот не болтался внутри.





На крышку корпуса, исключительно на всякий случай, было наклеено напоминание о том, что это за штука :)



Уже после выбора корпуса я разработал печатку, так чтобы она влезла в корпус вместе с трансом. Плата нарисована в EagleCad и изготовлена методом ЛУТ на двухстороннем текстолите. Правда, на верхнем слое всего парочка дорожек, так что при желании можно её урезать до одного слоя. У меня желания не возникло :) Как водится, при разводке допустил косяк — забыл развести R11. В моей плате он висит на припое между затвором транзистора и ближайшей землёй. В проекте разумеется исправил.



Все резисторы, кроме мощных — SMD, также как и C2 и Q3. Остальные транзисторы, диоды и прочие — выводные. Чуть-чуть дырок посверлить всё же пришлось.

LM317, как показала практика неслабо греется, так что на ней висит небольшой радиатор. С радиатором она при зарядке нагревается примерно до 55-60 градусов.

Плата крепится к трансу так же, как к нему крепился родной диодный мостик, а именно: в плате просверлены два отверстия, которыми она одевается на специальные пластиковые уши на каркасе транса, а затем фиксируется на месте путём припаивания выводов с транса, которые не дают плате слететь с ушек. В принципе довольно надёжно, пару раз я уронил эту конструкцию со стола, и ничего не отвалилось.



Резистор R13 на фотографиях одноваттный, не было 2W нужного номинала. Потом я его заменил, одноваттный сильно греется. Собранная схема была предварительно проверена с контроллером отладочной платы. Прошивка для отладочной платы, помимо прочего отправляла в UART текущие показания АЦП и историю показаний.



Также, в процессе разработки девайса я открыл для себя очевидный способ соединять папы на плате с папами на соединительных проводках:



В какой-то момент приехали проводки с мамами с DealExtreme и избавили меня от этого огорода.

Провод фонаря заканчивается подходящим разъёмом. Конструкция фонаря такова, что при подключении разъёма, земля фонаря размыкается с землёй аккумулятора, поэтому вся схема фонаря оказывается не при делах.

Также в фонаре, последовательно с аккумулятором стоит диод, видать для защиты от возможной переполюсовки зарядки. Так вот, не знаю почему, но с этим диодом моя зарядка думала, что на аккумуляторе всего около 500mV, при реальных 5.2V. Пришлось его закоротить. Если кто знает, почему он мне так мешает, расскажите, а? Я его верну и поправлю как надо.

Вся конструкция помещается в корпус следующим образом:



Провод питания закреплён стяжкой (он очень плотно садится в вывод корпуса), а провод к фонарю закреплён термоклеем. Светодиод никак не закреплён в отверстии и держится там только на трении и своих ногах, которые я зачем-то посадил на PLS разъём со штырьками на плате.

Ну и сверху всё это дело накрывается крышкой, крышка прикручивается двумя шурупчиками.

Software


Поскольку схема никакой оригинальностью не отличается, то уж хотя бы программу я решил написать сам. Впрочем алгоритм её работы тоже ничем оригинальным не отличается, я читал те же мануалы, что и другие авторы :) Но хотя бы реализация полностью от себя :) Писал в AVRStudio 5.

Логика работы такова:

  • Каждое измерение выполняется 10 раз и результатом является среднее арифметическое десяти замеров. Сначала включается ток зарядки, и измеряется напряжение на батарее. Если оно выше 10V (для данной конкретной батареи и с запасом), то делается вывод, что батареи нет. Если в прошлый замер она была, то делается вывод, что её отключили. Тут важно отметить, что источник питания устройства должен быть способен отдать не менее, чем этот порог, плюс 1.25V, которые падают на стабилизаторе.
  • Если напряжение меньше 10V и в прошлый раз батареи не было, то делается вывод, что её только что подключили.
  • Если батарея была только что отключена, то сбрасывается история напряжений, зарядка возвращается к исходному состоянию.
  • Если батарею только что подключили, то производится оценка её состояния. Это делается так. При выключенных всех токах измеряется напряжение на батарее. Если оно ниже вольта на элемент, то производится предзарядка короткими импульсами. Если от вольта до 1.2V, то производится разрядка. Если Выше этого порога, то зарядка.
  • При предзарядке программа включает ключ зарядки на 40 ms, после чего 490 ms ждёт. И делает так, пока напряжение не поднимется до 1V на элемент.
  • При разрядке программа включает разрядный ток на 490 ms. И делает так, пока напряжение не упадёт ниже 1V на элемент.
  • При зарядке программа включает зарядный ток на 490 ms. Также при зарядке собирается история напряжений батареи за последние 8 минут. В конце каждой минуты записывается среднее значение всех измерений за минуту. Если текущее значение равно или меньше семи из восьми в истории, то считается, что батарея заряжена, так как напряжение на ней падает или как минимум не растёт.
  • Если время работы какого-либо режима вышло за допустимые рамки, то программа переходит в режим ошибки, в котором только проверяется наличие батареи.
  • Текущее состояние программы выводится на светодиод.
  • Происходит обработка таймера
  • Всё сначала.


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

Светодиодом индицируется текущий режим работы программы:

  1. Зелёный — нет батареи
  2. Красный — батарея заряжается.
  3. Мигающий зелёный — батарея заряжена.
  4. Мигающий красный — ошибка (таймаут).
  5. Жёлтый — идёт предварительная зарядка.
  6. Мигающий жёлтый — идёт разрядка.


В принципе всё. Программа подробно откомментирована, и разобраться в ней труда не составит. Прилагаю исходники, прошивку, а также схему и печатную плату. На плате слой top нужно отзеркалить для ЛУТ, а bottom уже зеркальный.

Bonus


Для прошивки attiny13 я использовал маленький ISP коннектор, к которому контроллер на время прошивки крепится прищепкой. Идея не новая и не моя, спасибо её автору за неё!





Так как устройство проходит стадию тестирования, очень приветствуются комментарии относительно его конструкции и реализации. Если у вас есть опыт изготовления таких штук, то пишите! Я хочу довести девайс до ума, и повторить его для двух своих шуруповёртов

Всё!

В прикреплённом архиве всё необходимое для повторения, включая библиотеку с элементами, которые я не нашёл в стандартных либах Eagle Cad.
Файлы в топике: Ni-MH charger.zip

Комментарии (80)

RSS свернуть / развернуть
Здорово, где транс брали? или пропустил в тексте?
0
Пропустили, я упомянул, даже фотографию на память вставил ) Транс из обычного китайского адаптера 12V/500mA, или вроде того. Мне их по оказии перепал десяток, так что трансов у меня теперь как гуталину ))
0
>>Нафиг нужен конденсатор С2 я не знаю :)
В даташите популярно описано, АЦП имеет систему хранения «sample & hold», которая заряжается в момент старта преобразования. Без конденсатора внутренняя ёмкость АЦП «просадит» делитель, и показания считаются неверно, с ошибкой в сторону уменьшения.
0
Теперь знаю ) Спасибо!
0
Немного «повредничаю» по поводу индикации режимов работы…
Нагляднее было бы:
Зелёный — батарея заряжена.
Красный — батарея заряжается.
Мигающий зелёный — идёт зарядка.
Мигающий красный — нет батареи.
Жёлтый — идёт предварительная зарядка.
Мигающий жёлтый — идёт разрядка.
Но это мое личное мнение и оно может не совпадать с мнением автора :)
+1
А чем у вас «Красный» отличается от «Мигающий зелёный»?
+1
тогда уж:
1. Красный — нет батареи
2. Мигающий зелёный — батарея заряжается.
3. Зелёный — батарея заряжена.
4. Мигающий красный — ошибка (таймаут).
5. Мигающий жёлтый — идёт предварительная зарядка.
6. Жёлтый — идёт разрядка.
Принцип прост: всё красное — ошибка. Мигание — зарядка идет. Как-то так :)
0
А можно так: Мигание — процесс идёт. Красный — разрядка, жёлтый — предзарядка, зелёный — зарядка.
Не мигание — режим ожидания. Красный — ошибка, жёлтый — нет батареи, зелёный — батарея заряжена.
0
Я исходил из следующих соображений:
1. Когда устройство воткнуто в розетку должна гореть зелёная «лампочка», показывая, что всё в порядке, электричество есть :)
2. Когда батарейка заряжается должна гореть красная «лампочка» — «внимание, я тружусь!» :)
3. Теперь два мигающих сигнала распределяются между «заряжено» и «ошибка» очевидным образом.
4. Ну и остаётся два жёлтых сигнала для пред. зарядки и разрядки.
Вообще говоря, для конечного потребителя лучше обойтись двумя, максимум тремя вариантами индикации, ибо запоминать что о чём мигает, и знать подробности о процессе пользователю нафиг не надо и не хочется. Как у apple — если кнопка, то одна, две — много :) Так что все эти мигалки больше для себя, чтобы, в случае чего, было легче диагностировать возможные неполадки :)
Ну а если очень хочется, то исходник приложен, индикация там проще простого сделана :)
0
У моего варианта, кроме того что легко видно идёт процесс или нет, есть ещё такой плюс: после включения жёлтый свет сразу показывает, что обе половинки индикатора работают.
0
Резонно ))
0
Тоже верно. В добавок разница между зарядка/заряжено гораздо лучше разными цветами в том плане, что достаточно беглово взгляда. не надо задерживать и выжидать «мигает оно или больше нет». И на самом деле куча состояний для блондинки излишне. нужна «одна кнопка».
0
She is a brunette )))
Мне лично кажется, что при разработке интерфейса любого девайса, пользователя следует считать «блондинкой», в хорошем смысле слова. В том смысле, что если не предполагается его взаимодействие с какими-то разными режимами, настройками, опциями, то ему и знать о них не нужно. Должно быть максимально просто и понятно. А мигалки, как я уже сказал, для меня. Поскольку мне, возможно, как раз придётся что-то с ними делать.
0
Тогда уж лучше оставить только состояния жду/делаю/сделал/фейл. Разные варианты «делаю» можно для диагностических целей сделать слегка разными — скажем, мигание с разной частотой.
0
Хотя интегральные контроллеры обычно вообще индицируют только готовность. Второй индикатор, если есть — тупо индикатор питания.
0
Вот мигание с разной частотой это вообще та ещё хрень. Во всяком случае задокументировать такое достаточно сложно.
Кстати можно ещё упростить набор, объединив «жду» и «ошибка». ведь для конечного пользователя в целом порядок действия одинаков: достань и вставь ещё раз.
0
Ее не нужно документировать. Пишешь «мигает: идет заряд». Автор же сказал, половина режимов нужна только ему для диагностики.
«Готов» и «ошибка» объединять не надо. В случае ошибки обычно вставлять заново смысла нет. Мой зарядник например выдает ошибку если напряжение на банке превысит некий порог, но dv/dt детектор не сработал.
0
У вас собственной разработки зарядник? Если да, то нету ли статейки, интересно было бы почитать )
Мигание с разной частотой было бы сложнее реализовать в моём коде, куда проще было добавить цветов. А если диагностических сигналов много, а диод один, то можно ещё сделать как в автомобильных «мозгах», там лампочка моргает некоторое число раз, в соответствии с номером ошибки.
Но мне это не надо, во время отладки я УАРТом пользовался — куда удобнее, а в готовом девайсе моргалки так, на всякий случай )
0
Нет, упомянутый зарядник — Varta Cube Charger. Кстати, второй зарядник — Sysmax Intellicharge i4 — ошибку индицирует так же. Режим заряда первый индицирует заполняющейся шкалой (там СИДы расположены в виде линейной шкалы), а разряда — миганием (отличается от ошибки частотой мигания), по завершении заряда светится вся шкала. У второго на каждый аккум по три СИДа, отображающие прогресс заряда, пока он идет — верхний из них мигает, по завершению все три горят.

Короче, кроме как «пусто/работаю/зарядил/ошибка» ничего отображать не требуется.
0
Сам являюсь сторонником простоты и минимализма, даже в облостях где я «профессионал». Не к чему лишний раз загружать мозги ненужной информацией, пусть они будут свободны для полезных вещей. По этому я и говорю что для блондинки :)
0
Тогда под/вместо смайлик(ом/а) на этикетке напиши: «Заряжать до полного заряда! (по 5 минут не подзаряжать!)». Чтоб не получилось как у Minkfan-а.
0
А оно всё равно не сажает ) Это моя, видимо, недоработка. Если поставить батарею посаженную ниже порога разрядки, то разрядка идёт ровно один цикл, а потом переключается на зарядку. Где-то не доглядел, или не знаю в чём дело. Ещё предстоит разобраться.
Или, возможно, вырежу разрядку вообще. Как я уже упоминал, в фонаре стоит DC-DC драйвер, который выпивает батарейку до дна.
0
У меня есть зарядка в которой предполагается использование 2-х или 4-х Ni-MH аккумуляторов. Из-за того, что часто путаю пары, получается что все заряжены по разному, не полный разряд, ну в общем хана пришла аккумуляторам. В магазинах не видел нормальных зарядок с индивидуальными каналами, а если и видел, то по такой цене, что проще выбросить старые аккумуляторы и купить коробку новых.

Хочу сам собрать зарядку. Сейчас много всяких специализированных микросхем для зарядки аккумуляторов. У кого нибудь есть опыт работы с ними? Может кто-нибудь посоветовать простую и надежную микросхему?
0
MAX713, LM3647, LT1510, LT1513, LT4008, LT4010. Это те, что я искал и не нашёл в родных пенатах ) Поскольку не нашёл, ничего основанного на своём опыте о них сказать не могу. Среди них есть попроще, есть посложнее. Могу только посоветовать почитать даташиты и выбрать максимально удобную под вашу задачу.
0
Еще есть MC33340/MC33342, она дешевле.

Про нее и про MAX713 я писал статейки.
0
Спасибо за ответы!
С наличием данных микросхем действительно туго. В Екатеринбурге ничего из приведенного списка не нашел. Но я сейчас в командировке в Питере, потому и возник у меня такой вопрос. Здесь MAX713 можно найти без проблем. MC33340 дешевле, но есть только в ЧИП-ДИП.
0
В Промэлектронике они почти все когда-то водились, но ща «нет в наличии». MAX713 я там и брал, MC33340 — в icdarom.ru. Я ее за рублей 40 брал, так что ориентируйся. В отличие от MAX713 она не имеет встроенных стабилизатора питания (для себя) и тока (для аккумуляторов) и не позволяет одновременно использовать термодатчик и таймер. Но в их качестве можно использовать дешевые LM317, MC34063, или вообще управлять сетевым преобразователем.
0
У Li-Ion и Li-Pol нет эффектов памяти никаких, плюс от частой полной разрядки они вздуваются. Личный опыт.
0
А еще я теперь знаю скотскую логику производителей зарядок ) ткнешь фотик на 5 мин перед выходом зарядить, так его тебе еще и разрядит!
0
Наверняка, где-нибудь в мануале, мелким шрифтом под знаком *, в самом дальнем углу, об этом сказано :)
0
Никогда не читал мануалы на батарейки :D
0
Теоретическая часть у меня касается только Ni-MH аккумуляторов, так как именно под них я делал зарядку. Ni-Cd имеют некоторые отличия, но в целом описанная теория и алгоритм к ним подходят. Знаю точно, что зарядка литий-всяких аккумуляторов имеет свои особенности, как и, например, зарядка свинцовых, и эта статья не о них точно. Стоило, наверное уточнить это, но я как с самого начала начал писать о Ni-MH, так о других и не вспомнил :)
0
Ну просто мало ли народ обобщит )
0
Да, вы правы. Уточнил в стстье.
0
то есть в статье )
0
«Каждое измерение выполняется 10 раз и результатом является среднее арифметическое десяти замеров. „
Блин, ну почему же не хотябы не 8 или 16?
0
а какая разница? делить не умеете? так делить то в принципе не обязательно. если делимое больше, то и частное будет больше (или равно). в сравнение можно сделать некий «запас».
0
Никаких объективных причин, просто подумал «пускай десяток раз снимается АЦП», и так и сделал. 8 или 16 возможно сэкономили бы пару байт, так как деление на 8 или 16 можно выполнить сдвигом, но у меня такой потребности не возникло. Впрочем, не знаю, как gcc реализует деление, и насколько была бы эффективна такая экономия, просто предположил )
0
суть не в экономии «байт» а в скорости. сдвиг делается одной командой.
0
желательно вообще где можно сдвигом умножать/делить
0
тогда делайте как я написал выше. Даже сдвигов не надо!
0
ну при усреднении показаний ацп и вправду делить ни к чему
0
Впрочем, не знаю, как gcc реализует деление, и насколько была бы эффективна такая экономия, просто предположил )
Сотня циклов и полсотни-сотня байт вместо одной команды. Довольно заметно.
Вот на ARM или MCS51 это значения не имеет.
0
если есть свободное время и место — почему-бы и нет?
0
Вообще да, но здесь такой случай, когда других критериев выбора практически нет, а локальная оптимизация довольно заметна, и потому разумно руководствоваться ей при выборе значения константы.
А на размер кода оно даже практически не повлияет, если деление используется где-то еще.
0
Если нет разницы — зачем платить больше?
0
да при чем тут место то? сколько эти циклы проходить будут. в этом вопрос.
0
а «свободное время» — это я о чем, а? ;)
0
времени много не бывает ;)
0
да никто и не спорит ведь. я о том, что такой подход тоже имеет право быть.
понятно, что лучше писать сразу оптимально.
0
Преждевременная оптимизация — …
0
Тоже не критично, в данном случае. Но вообще, спасибо, что указали на это, я как-то не придавал значения реализации арифметики, хотя и знаю, что она софтовая. Просто не доводилось наступать на эти грабли, не было задач, критичных к скорости. В другой раз буду знать :)
0
если есть свободное время и место — почему-бы и нет?
Логика похожа на: «А если квартира большая почему-бы не намусорить?»
Надо стремится к совершенству. В первую очередь в своих умениях, да и от повторного использования кода ни одна программа не застрахована.
Если подбирать константу, то, если возможно, выбирать степень двойки. Если невозможно, то заменять деление умножением. Например двухбайтовое число разделить на 10 по формуле A*((65536)/10+1)>>16
0
Логика похожа на: «А если квартира большая почему-бы не намусорить?»
«В замке было столько комнат, что никто никогда не убирался. Просто переходили в следующую.» ;)
0
Извини за брюзжание.
Это из какой-то книжки? Гугл не нашёл.
0
Было аналогичное у Носова в «Незнайка на луне». Самый конец.
0
Помню. Только там они посуду не мыли. А про уборку комнат не помню.
0
Ну не только посуду не мыли, но и комнаты загаживали, переходя в следущую. А так я тоже собирался погуглить откуда оно такое, про замок)
Мож просто цитата по памяти примведена?
0
угу. по памяти.
0
А соус таки Незнайка?
0
да, что-то оттуда. мб влияние носова тоже сказалось. или наоборот. вспомнить не получается. но точно помню, что когда читал, отметил себе этот момент. мб у хайнлайна, мб у шекли…
0
О, тоже не знал, вернее знал, что бывает, но не знал как :) Спасибо!
0
(полез доставать STM32VLDISCOVERY) :)
0
Чем режете текстолит? Срез у Вас ровный и не лохматит.
0
Куски нарезаю ножницами по металлу. А вытравленные платы подравниваю по контуру так: по линейке несколько раз прохожусь канцелярским ножом с обеих сторон, чтобы получились достаточно глубокие борозды, потом отламываю лишнее плоскогубцами и при необходимости прохожусь напильником.
0
Решил повторить данный проект. Возник такой вопрос.
Если аккумуляторы имеют емкость 780 миллиампер, то они должны заряжаться
1) током 0.1С (78 mA) 14-16 часов.
2) током 0.2С (156 mA) 7 — 8 часов.
В данном проекте ток заряда 100 mA то есть 0.12С почему тогда аварийный таймер ограничен по времени 8 часами? при таком токе за 8 часов аккумуляторы не зарядятся.
В статье написано «При зарядке программа включает зарядный ток на 490 ms.»
Возник вопрос — Что происходит в остальное время секунды? Если к примеру в оставшиеся 510 миллисекунд зарядка не производится то время заряда можно увеличить вдвое.
0
Добрый день!
Получается так: какое-то время занимает серия измерений напряжения, усреднение значения, и вообще вся работа программы. Всё вместе тянет где-то на 10ms. А потом в зависимости от режима работы прпограмма либо включает зарядку, либо разрядку, и ждёт 490 ms. То есть в целом весь цикл занимает где-то полсекунды. Потом всё повторяется. Во время пред. зарядки циклы получаются немного дольше.
Ток заряда измерялся на железе и он у меня немного отличается от расчётного. Предельное время работы подбирал экспериментально. Практика показала, что зарядка выключается раньше по падению напряжения.
Впрочем, возможно, имеет место быть недоработка алгоритма определения конца зарядки. Я отдал устройство, но оно практически не использовалось, поэтому статистики его работы я не набрал. Если у вас есть возможность, то повторите сначала на макетной плате, заодно разберётесь что к чему, может быть внесёте свои изменения.
0
Схема хорошая и перспективная. Железа мало, открытый и хорошо задокументированный исходник. Поэтому повторять буду однозначно. Немного подгреб константы и токи. Еще есть вопрос насчет фьюзов — если понипрогом шить какие галочки выставлять? В разных программах галочки выставляются по разному.
0
Понипрог не пользовал, про него не скажу :) Фьюзы, помнится мне, были дефолтные.
0
Также в фонаре, последовательно с аккумулятором стоит диод, видать для защиты от возможной переполюсовки зарядки. Так вот, не знаю почему, но с этим диодом моя зарядка думала, что на аккумуляторе всего около 500mV, при реальных 5.2V.
При заряде положительный ток от зарядки нормально проходит через диод в прямом включении (анод-катод). При измерении когда нужно чтобы положительный ток шел от батареи к резистивному делителю и далее на АЦП, ток упирается в катод диода и результате ничего не меряется, диод на свалку — схема работает :)
0
И правда, чего-то я стормозил :) Интересно, а как тогда работает оригинальная зарядка? :) Она вроде умная, судя по инструкции, показывает окончание зарядки.
0
Динамическое сопротивление открытого диода мало и следить за динамикой напряжения не сильно мешает, надо полагать.
Другими словами, напругу надо мерять при включенном токе заряда. И стабилизировать оный, иначе колебания тока, выделившиеся на дифсопротивлении диода, могут превысить изменение напряжения на аккуме.
0
В схеме стабилизатор тока есть, так что с этим все впорядке. Когда рисуют графики изменения напряжения и температуры на аккумуляторе, эти графики снимаются когда на аккумулятор действует зарядный ток, а не когда аккум отключили от зарядки и побежали в другую комнату мерять напругу :) Так что скорей всего схема чего то там недозаряжала. Надо будет переделать алгоритм измерения, чтобы мерять не снимая ток заряда
0
MC33340 меряет напряжение при снятом токе заряда, так что допустимо и так, и так. Но с диодом можно мерять только при подключенном токе заряда.
0
Изменяюсь за возможно за глупый вопрос. Но может подскажите схему регулировки микроконтроллером силы тока в ходе зарядки?
0
Точно так же, как и напряжение. Только АЦП мерять нужно, разумеется, ток, а не напряжение (т.е. добавлять в цепь шунт и мерять падение на нем).
0
  • avatar
  • Vga
  • 12 сентября 2012, 23:02
может в очередной раз глупый вопрос но с напряжение мне все понятно есть ШИМ. И как измерять сам ток тоже ясно, но вот как программно управлять силой тока это пока загадка?(((
0
хочу уточнить — программно управлять силой тока при неизменном напряжении! Вот.
0
хочу уточнить — программно управлять силой тока при неизменном напряжении! Вот.
Это невозможно. Или ты стабилизируешь ток, или напряжение. Так что все просто — крутишь ШИМ так, чтобы ток оставался постоянным. Точно так же, как при стабилизации напряжения, только измеряешь и стабилизируешь ток.
0
  • avatar
  • Vga
  • 20 сентября 2012, 15:39
Пополню копилку ламерских вопросов)))
1) понятно что заряжать аккумы нужно током 0.1С, а какое мин напряжение для этого нужно подавать на LM317 для зарядки одного обычного ni-mh аккумулятора.
2) Для чего кондер С2
3) Почему транзистор Q2 — pnp и можно ли заменить его на npn или вообще на полевик?
0
понятно что заряжать аккумы нужно током 0.1С
Не обязательно. Можно больше.
а какое мин напряжение для этого нужно подавать на LM317 для зарядки одного обычного ni-mh аккумулятора.
Напряжение на аккумумуляторе (максимальное, 1.9В) плюс минимальное падение напряжения на LM317 (смотри в даташите, порядка 2-3В) плюс 1.25В на шунте плюс 0.5-0.7В на ключевом транзисторе. Итого — вольт семь.
2) Для чего кондер С2
Этот вопрос уже обсуждался, читай комменты.
3) Почему транзистор Q2 — pnp и можно ли заменить его на npn или вообще на полевик?
Так надо. На P-канальный полевик заменить в принципе можно, но только при определенных условиях (в частности, не менее 4 банок если полевик логический и 8-10 если обычный) и вообще нежелательно. В принципе, если заряжать батареи из более чем одного аккумулятора — его можно исключить. В этом случае коллектор Q1 подключается напрямую к IC2.ADJ. R10 и R12 в этом случае не нужны, а Q2 следует заменить диодом.

А вообще — этот вариант я бы не советовал повторять. Он кривоват. Правда, я уже забыл чем именно.
0
  • avatar
  • Vga
  • 21 сентября 2012, 11:45
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.