Помните моё зарядное устройство на Arduino, про которое я писал пару месяцев назад? Так вот пришло время рассказать о том, как я его слегка доработал.
Зачем устройству доработка?
Всё дело в том, что при подключении к нему сильно разряженного аккумулятора, оно, естественно, выбирало самую высокую мощность и лупило на ней до тех пор, пока напряжение на аккумуляторе не достигало 14,8 вольт. И всё было бы нормально, если бы не одна маааленькая проблемка - устройство при этом нагревалось как печка. Ну ещё бы, ведь сильно разряженный аккумулятор брал очень большой ток - зарядное могло бы просто не выдержать продолжительной эксплуатации при таких условиях... Даже установленный сзади кулер не спасал ситуацию, хоть и крутился на максимальных оборотах.
Чтобы бороться с перегревом, мне приходилось периодически выключать устройство и давать ему остыть, причём занимало это как минимум полчаса - кулер-то при этом не крутился! И тогда я начал думать, как-бы так по уму устранить этот обжигающий недочёт...
Первая и самая банальная идея - просто запретить устройству работать на двух последних режимах работы. Но тут проблема в том, что нагрев устройства нельзя привязывать просто к текущему уровню мощности.
Во-первых, нужно помнить про температуру окружающего воздуха. В зарядном же, всё-таки, кулер стоит и даже при одинаковом токе на выходе устройства температура последнего будет сильно различаться при продувании через его корпус воздуха с температурой -10°, например, когда процесс зарядки происходит зимой в гараже, и с температурой +25°, когда процесс зарядки происходит летом либо в тёплом помещении.
Но и это не главное. На одной и той же максимальной мощности ток всё равно будет меняться в зависимости от степени разряженности аккумулятора и его способности "брать ток". Например, я как-то случайно очень сильно высадил свой Bosch S6, сделанный по технологии AGM (поставил машину в гараж на полторы недели и забыл закрыть багажник, в итоге всё это время в нём горела лампочка). Так вот когда я потом заметил это и подрубил аж 2 (!) мощных зарядных устройства, включив их на максимум, и ток, который они подавали на аккумулятор, превысил 15А, что бы вы думали? Напряжение поднялось с 11В всего лишь до 11.8В! Феноменальная прожорливость! Если бы подключили таким образом не-AGM аккумулятор такой же ёмкости и в таком же разряженном состоянии, например тот же Bosch S4, то при подключении этих же зарядных устройств ток на нём не превысил бы и 10А и напряжение при этом было бы не 11.8, а вольт 13, не меньше. Соответственно и зарядные устройства бы грелись не так сильно, хоть и работали бы в тех же самых режимах.
Короче, после долгих размышлений единственным нормальным способом сделать защиту от перегрева оказалось встраивание в систему датчика температуры.
Выбор датчика температуры
Можно было бы, конечно, использовать хороший цифровой датчик температуры, я в своё время приобрёл парочку таких на ebay. Они очень точные и стоят менее $2 за штуку. Можно даже с измерением влажности! Но нам тут точность абсолютно ни к чему, так что незачем переплачивать лишние деньги. Поэтому в дело вступил старый отцовский запас радиодеталей, из которого я успешно выудил несколько терморезисторов - они-то нам и нужны!
Выражаясь простым языком, терморезистор - это такая волшебная штука, которая изменяет своё сопротивление в зависимости от температуры своего корпуса. Ну в общем-то можно было бы и из названия догадаться))) Но как считывать данные с терморезистора, если у Arduino аналоговые входы меряют не сопротивление, а напряжение? Легкотня, скажу я вам - вспоминаем про такое замечательное изобретение, как делитель напряжения!
Для создания делителя напряжения с участием терморезистора нам нужно подобрать обычный резистор, сопротивление которого соизмеримо с сопротивлением выбранного терморезистора при комнатной температуре, желательно даже чуть больше. Например, сопротивление терморезистора ~300 Ом, значит берём резистор например на 560 Ом и соединяем их последовательно. Свободный контакт резистора подключаем к +5В, свободный контакт терморезистора тыркаем в землю, а от места их соединения тянем проводок к аналоговому входу нашего микроконтроллера, вот и всё!
Калибровка датчика с помощью Arduino
Когда всё это дело спаяно и подключено - нужно провести процесс калибровки. Для этого я взял отдельную Arduino с шилдом и написал простой скетч, который раз в секунду выводит в последовательный порт показания с нужного аналогового входа. Показания эти можно смотреть как на компьютере через монитор порта (например, в среде разработки), так и подключив Arduino к смартфону, через аналогичный монитор последовательного порта, коих в Google Play больше десятка.
Установка датчика температуры в зарядное устройство
Теперь остаётся лишь приделать терморезистор в то место, в котором будет измеряться температура, включить зарядное и запустить мониторинг. Первоначально я думал прикрепить терморезистор непосредственно к трансформатору:
Но после проверки оказалось, что наиболее горячим компонентом моего зарядного устройства является амперметр (видимо, в нём перегревается шунт, когда показания зашкаливают), поэтому я намазал терморезистор термопастой...
...и приклеил его к амперметру:
Далее я включил устройство и когда тепература на ощупь стала уже очень неприятной (градусов 60, наверное) - я запомнил показания из монитора последовательного порта и принял их за максимум, при превышении которого мощность зарядки должна автоматически снижаться, то есть мне пришлось слегка переделать прошивку. Её финальный вариант вы можете забрать вот тут, но вам всё равно придётся проводить калибровку, ведь её результат зависит от параметров созданного вами делителя напряжения, то есть у каждого будет своё, у резисторов же номиналы разные...
После всех этих манипуляций и тщательной проверки работоспособности устройства я вновь замотал плату управления бумажным скотчем (для изоляции)...
...и собрал корпус обратно.
Программная часть (скетч Arduino)
Вот как-бы и вся работа руками, об изменениях в прошивке особо распинаться нет смысла, там и так всё понятно из комментариев, скажу лишь о двух моментах для более быстрого понимания:
В зависимости от того, в какую сторону будет меняться сопротивление терморезистора при нагревании и от того, какой стороной будет подключен "делитель" напряжения из резистора и терморезистора, значение аналогового выхода, к которому подключён этот самодельный датчик температуры может как увеличиваться при нагреве, так и уменьшаться, в моём случае оно уменьшается, поэтому не стоит впадать в замешательство при виде выражений вроде
if (temp < maxTempUp) {analogWrite(fanPin,255);}
В моём случае знак "меньше" означает, что температура больше. Кстати, эта строчка запускает на полную вентилятор, когда температура превышает предельно допустимую температуру повышения мощности.
Ну и ещё один вопрос может возникнуть после прочтения этой строки:
if (temp > maxTemp - tempHop) {isBurning = false;} else {isBurning = true;}
Что, блин, такое tempHop? Фишка в том, что температура - это не напряжение, при понижении мощности она не будет сразу же понижаться, нагрев устройства обладает некоторой инерцией, то есть на то, чтобы датчик отреагировал на действие автоматики нужно определённое время, и если мы не дадим этого времени прошивке, то она просто сразу же может уменьшить мощность до нуля. Это не шутка - так и было при первом тестировании. Эту проблему можно было бы решить, добавляя задержки после каждого понижения, но игры со временем - не самая эффективная тактика в данном случае, намного проще "простить" зарядному несколько градусов после понижения, то есть при достижении 60 градусов мы уменьшим мощность и в следующий раз мы уменьшим её только при достижении 62-х градусов, потом при достижении 64-х и т.д. - практика показала, что это отлично решает данную проблему. Так вот этот сдвиг как раз и хранится в переменной tempHop. Кстати, при любом повышении мощности эта переменная обнуляется и при превышении напряжения всё происходит заново.
Думаю, что после изучения прошивки других вопросов ни у кого возникнуть не должно, но ежели я всё-таки что-то пропустил - спрашивайте в комментариях, я всегда готов помочь!
Искусство.
Я тоже к ардуинам неравнодушен.
А можно переписать программку - отказаться от индикаторов и через USB смотреть на компе?
Да, но для этих целей проще возьмите себе оригинальный Imax B6 mini за $30-$35. Он, конечно, менее мощный, чем моё устройство, но абсолютно универсальный. Да и у него есть более мощные и более дорогие аналоги, если нужно.