Индикатор заряда аккумулятора

Это устройство изготавливалось как “довесок” к зарядному устройству для шуруповерта. Как всем известно – лучшее – враг хорошего. И после того как аккумуляторы на шуруповерте стали заряжаться по-человечески, со стороны владельца поползли тихие и мягкие намеки что, дескать, “было бы неплохо лампочку…” или “вот если бы когда зарядится загорелось бы чего…”. В общем нервы у меня не железные да и индикация процесса зарядки вещь довольно полезная, но излишне усложнять не хотелось, да и было желание сделать чего-нибудь более-менее унифицированное, чтобы можно было применить позже. Вот что получилось:

Да снова на микроконтроллере. Все кто желает собрать такое же, но на два рубля дешевле на компараторе – до конца имеет право не читать. Принцип работы такой – при отсутствии аккумулятора зарядное устройство из LM317 и одного резистора ничем не нагружено (кроме собственно этого устройства) и потому напряжение на выходе примерно равно напряжению на входе, т.е. >13.5 вольт. Это первый порог срабатывания. При подключении посаженного аккумулятора напряжение падает (скажем до 10в) и растет по мере заряда. NiCd аккумулятор считается заряженным при 12 вольтах. Это второй порог срабатывания. Т.е. При напряжении меньше 12 вольт – идет зарядка – горит красный светодиод, в диапазоне напряжений 12.0…13.5в – аккумулятор заряжен и подключен – горит зеленый, при напряжении 13.5 и выше вольт не горит не один – устройство думает, что аккумулятор не подключен. Кроме конкретно моего применения – можно использовать в массе аналогичных случаев. Путей изменения порогов срабатывания – два. Первый – изменение параметров делителя R1R2, но тогда нельзя поменять пороги друг относительно друга. Второй более сложный, но гораздо более продуктивный. Опишу подробно:
1. Качаем и устанавливаем AVR Studio 4.
2. Качаем, разархивируем в отдельную папку файл с иходником. Двойным щелчком открываем файл с расширением *.aps из этой папки. Запустится студия и откроет этот проект.
3. Константы находятся во второй и третьей строчке (см. скриншот)

Константа red_led, как вы уже поняли отвечает за порог срабатывания для красного светодиода, green_led зеленого. Значение выше green_led, это область где светодиоды не горят. 135=13.5 вольта. 75 будет равно 7.5 вольта. Максимальное значение равно 255, т.е без дальнейших изменений можно контролировать до 25.5 вольт.
4. Меняем. Жмем F7 (компилируем).  В этой же папочке (откуда запускали проект) забираем новый hex файл для прошивки. Как дополнительный бонус имеем возможность настройки порога программно, а не подбором резистора в делителе. Впаяли “на глаз” примерно подходящее, а дальше по кругу: поменяли —> откомпилировали —> прошили —> проверили. Все просто.

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

Теперь о конструкции. Все расположено на одной ооочень маленькой плате размером 13 x 22 мм. Питание организовано на линейном стабилизаторе L1087 в корпусе SOT89. В обилии попадается на дохлых материнских платах, но будьте внимательны, бывает с разным расположением выводов! На моей плате – самый распространенный, но лучше перестраховаться – впаять все детали без контроллера, померять напряжение и только убедившись в наличии пяти вольт ставить контроллер. Резисторами R5 R6 задается выходное напряжение. В нашем случае 5в. R1, R2 – делитель входного напряжения, о нем я уже писал выше. Светодиод – любой двухцветный (нужных вам цветов) с двумя выводами. Можно также использовать трехногий – с общим катодом, среднюю ногу (катод) паяем к земле через резистор R4. Учитывая что оба светодиода мы светить не планируем – это нормально.

Вот в общем и все. Разве что пару слов о фузах. Если контроллер новый, можете вообще все оставить по умолчанию BODEN на 2.7 вольта совсем не обязателен. Ну либо так как на картинке:

Готовое устройство:

Файлы:
Схема в SPlan 7
Печатная плата в Spint Layout 5
Архив с исходниками
Прошивка

35 коментарів до “Индикатор заряда аккумулятора

  1. Андрей, как зашить tiny13 с помощью avr910?

  2. Сори, уже нашёл сам.

    Атмеловский AvrProg не знает что такое tiny13, avrdude (как напрямую, так и через Burn-O-Mat) отказался шить или читать фьюзы, под предлогом что tiny13 “device not supported”.

    Воспользовался AvrOspII (только софт для программирования) – он сам опознал программатор, сам опознал микросхему, и благополучно зашил. Брал здесь – http://www.serasidis.gr/circuits/usbAvrProg/usbAvrProg.htm (ссылка в самом низу).

  3. Полезная штучка вчера собрал-работает! Можно прилепить на многие “девайсы”, особено нравится програмное изменение установок порогов срабатывания. Спасибо.

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

  5. А что ж Вам мешает прицепить ключик с реле к ножке, на которой при зеленом светодиоде появляется высокий уровень? Единственное что придется изменить – подключить вход АЦП после контакта реле, а вход питания до контакта, т.е. чтобы при размыкании реле устройство продолжало питаться, а вход АЦП оставался подключенным к аккумулятору а не источнику питания.

  6. Електра, подскажите пожйлуста, какие строки изменить в прошивке, чтобы светодиод на 7-й ноге(красный) вел себя кардинально наоборот. Спасибо.

  7. Если я Вас правильно понял нужно поменять характер мигания в зависимости от напряжения. Смотрите секцию led_control, начиная с метки rled ну и дальше по смыслу… Обратите внимания на константы rledmin, rledmid, rledmax – фактически это пороги согласно которым меняется поведение программы. Не знаком с Вашим уровнем подготовки, потому на этом пока и ограничусь, думаю разберетесь.

  8. Спасибо за оперативность, но лучше как с первоклашкой. В секции led_control вышеупомянутых констант не нашел (, поэтому прошу пояснить более детально)

  9. Извините, Петр полез не в ту степь, смотрел исходник на этот проект http://radio.aliot.com.ua/?p=666. Это там светодиоды мигают, константы есть и т.д… Здесь же все гораздо проще – два порога срабатывания вынесены в самый верх исходника. Вот только теперь мне не понятно что значит “кардинально наоборот”? Не светился до 12в а начинал светиться после 13.5в красный светодиод? Если я правильно Вас понял, то просто поменяйте местами метки (не содержимое!!!) led_red и led_off.

  10. Красный, вроде как 7-я нога, который горит до 12в и гаснет, при 12в и выше, вот его и хотелось бы затронуть, а точнее поменять поведение на противоположное. Тобиш меньше 12-тишина, больше 12в – светит. Зеленый то трогать не хочется, его поведение вполне устраивает. Кстати, не нашел ниодного способа связи с Вами, если можно на почту скиньте, хоть какие-то координаты.

  11. Андрей, вернитесь, мы все простим 🙂

  12. RE (при напряжении 13.5 и выше вольт не горит не один – устройство думает, что аккумулятор не подключен
    А можно добавить 3й св диод желтый, который начинает мигать при 13.5в, над которым написать – аккум. заряжен полностью

  13. Андрей.
    Не пойму на чем написана программа? Я только учусь. Можно ли добавить таймер скажем на 10 – 15
    часов. Например: При падении напряжения когда загорается красный светодиод включается таймер на 5 ноге
    включая зарядку. По окончании времени зарядка отключится. Это для резервного питания на пальчиковых аккумуляторах.
    Ответь пожалуйста.

  14. Писано на ассемблере. Перепутать с чем-то еще очень сложно 🙂
    Добавить конечно же можно, как раз тот случай поупражняться в такой простой затее для начинающего. Исходник у Вас есть, попробую направить:

    1. В прерывании таймера, он один у tiny13 и уже настроен на частоту 586 гц нужно уменьшать 4-х байтное число (должно хватить на 25-30 часов), которым задается нужное время. По факту достижения нуля – нужно выставить порт (5 нога) в положение ноль.

    2. Запускать процесс нужно проверяя логическую единичку на нужном “пине” путем выставления логической единицы в порт (5 нога) и записью числа в четырехбайтную переменную. Число считаем примерно так: 15 (часов) * 60 (минут) * 60 (секунд) * 586 (тиков таймера) = 31 644 000. Столько тиков должен отсчитать МК для того чтобы получилось 15 часов при выбранных параметрах таймера.

    Как-то так. Дерзайте.
    Хотя для резервного питания все конечно же немного сложнее…

  15. Андрей.
    Может как-то примерчиком подскажите ??? Я на С еле что-то изменить могу а ассемблер темный лес.

  16. Скажите а как можно переделать данное устройство для контроля наприжения АКБ 24В? и контролировать 21-22В. Если просто в прошивке изменить на 24В это не повредит остальным smd элементам?

  17. Нужно будет заменить L1087 на что нибудь более высоковольтное. Например 78L05

  18. Извольте. Самое сложное. Четырехбайтное вычитание:
    ;—————————————————————————–
    ;задаем в секции .dseg пять байт нужные нам для работы
    tmr_digit: .byte 4 ;собственно 4 байта значения таймера
    tmr_flag: .byte 1 ; служебный байт, 0 – таймер тикает, 1 – таймер завершил работу
    ; (например). Будет нужен чтобы проверять текущее положение вещей

    ;—————————————————————————–
    sub4b:
    lds r16,tmr_flag ;проверим значение флага таймера
    cpi r16,0
    brne end_sub4b ;если не равно нулю – значит таймер свое отъездил / не нужен
    lds r16,tmr_digit ;загрузим в r16 младший байт
    subi r16,1 ;вычтем из него единицу
    brcs sub4b_1 ;если переход через 0 (с=1) уходим на sub4b_1
    sts tmr_digit,r16 ; если нет сохраняем

    end_sub4b:
    ret

    sub4b_1:
    sts tmr_digit,r16 ;или тут сохраняем
    lds r16,tmr_digit+1 ;загрузим в r16 второй байт
    subi r16,1 ;вычтем из него единицу
    brcs sub4b_2 ;если переход через 0 (с=1) уходим на sub4b_1
    sts tmr_digit+1,r16 ; если нет сохраняем
    ret ;и выходим

    sub4b_2:
    sts tmr_digit+1,r16 ;или тут сохраняем
    lds r16,tmr_digit+2 ;загрузим в r16 третий байт
    subi r16,1 ;вычтем из него единицу
    brcs sub4b_3 ;если переход через 0 (с=1) уходим на sub4b_1
    sts tmr_digit+2,r16 ; если нет сохраняем
    ret ;и выходим

    sub4b_3:
    sts tmr_digit+2,r16 ;или тут сохраняем
    lds r16,tmr_digit+3 ;загрузим в r16 старший байт
    subi r16,1 ;вычтем из него единицу
    brcs sub4b_complete ;если переход через 0 (с=1) значит настал долгожданный момент…
    sts tmr_digit+3,r16 ; если нет сохраняем
    ret ;и выходим

    sub4b_complete: ;именно сюда мы доберемся только тогда, когда дотикает таймер
    ldi r16,1 ;загрузим в r16 значение отличное от нуля
    sts tmr_flag,r16 ;и сохраним в переменную флага нашего таймера. Важно помнить, что
    ; 0 – таймер работает, 0 мы пишем сюда тогда, когда хотим запустить таймер
    cbi portb,0 ; именно в этой точке можно было бы выключить зарядку аккумулятора
    ret
    ;—————————————————————————————————
    Далее вызываем эту процедуру из уже существующего прерывания таймера 0. В момент появления “1” на PB1 (красный светодиод) загружаете нужное Вам значение в четыре байта, устанавливаете байт флага в ноль, выводите “1” в PortB,0 (включаете зарядку) При флаге равном нулю перестаете проверять значение PB1.

    Примерно такая логика. Как раз упражнение для начинающего. Ну а старый-добрый спор с какого языка нужно начинать изучать микроконтроллеры мы тут пожалуй спорить не будем…

  19. Может я наглею, но осмелюсь попросить. не могли бы вы переделать прошивку чтобы при появлении напряжении на 3 ножки, вне зависимости от напряжения питания светодиоды гасли. Зачем мне это нужно?: хотел приспособить для управления дневным светом на автомобиле. Включаем зажигание, напряжение меньше 13в, двигатель завели напряжение в бортовой сети увеличилось, сработал порог, на порт вместо светодиода управление нагрузкой через полевой транзистор. При включении габаритов напряжение поступает на 3 ножку, транзистор закрывается и все работает по штатной схеме авто.

  20. к сожалению ничего не получил

  21. Жаль… Два часа работы по “допиливанию” прошивки коту под хвост.

  22. Если “допиливания” сохранились, можете повторить на другую почту

  23. Андрей.
    !!!!!!ОГРОМНОЕ СПАСИБО !!!!!!! За пример, не мог раньше ответить были проблемы с интернетом.
    Не могли бы ВЫ еще разок помочь примерчиком : куда поконкретней вот это дописать (31 644 000 записать число в четырехбайтную переменную).
    И где искать, куда дописать этот момент ?
    (В момент появления «1″ на PB1 (красный светодиод) загружаете нужное Вам значение в четыре байта, устанавливаете байт флага в ноль, выводите «1″ в PortB,0 (включаете зарядку) При флаге равном нулю перестаете проверять значение PB1).

    Заранее ОГРОМНОЕ СПАСИБО !!!!!!

  24. Переменные добавляется в секцию .dseg :

    .dseg
    tmr_digit: .byte 4
    tmr_flag: .byte 1

    Первоначальные данные удобно загружать в виде отдельной подпрограммы:

    ………
    rcall load_tmr
    ………
    load_tmr: ;(располагается в тексте программы произвольно)
    ldi r16,$60
    sts tmr_digit,r16
    ldi r16,$d9
    sts tmr_digit+1,r16
    ldi r16,$e2
    sts tmr_digit+2,r16
    ldi r16,1
    sts tmr_digit+3,r16

    Обработку зарядки вставляете в секцию main, который крутится циклически. Обзовите ее к примеру charger. Вот кусочек:

    charger:
    lds tmr_flag,r16
    cpi r16,0
    breq end_charger
    ;———тут проверяем ножку и т.д.———————–

    ;———————————————————-
    end_charger:
    ret

    Все, дальше сами, а то я и так почти все написал. Самое интересное пропустите 😉

  25. Здравствуйте! А можно ли как-то изменить схему под использование 2-ух разных по цвету светодиодов вместо 1 двухцветного?

  26. Не надо ничего менять. На одну ногу МК анод одного светодиода, на другую другого и катоды на землю.

  27. electra, не могли бы вы, пожалуйста, отправить и мне на почту, то что отправляли Сергею. Спасибо.

  28. Удалил как неподтвержденное по работоспособности.

  29. Подскажите пожалуйста как увеличить гистерезис? Как я понял он сейчас равен 1 вольту. Нужно чуть побольше.

  30. Не совсем понял о каком гистерезисе идет речь.

  31. Здравствуйте , не могли бы вы подправить прошивку , нужно чтобы переключение между ножками контроллера происходило через интервал временихотя бы в 1 секунду. Т.е когда произошло переключение на РВ2 на PB1 был высокий уровень примерно 1 секунду. Хочу применить в сигнализации переключение между аккумуляторами.

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

  33. Что конкретно Вы имеете ввиду, Юрий? Если можно, на примере применения в устройстве. Так понятнее будет чего нужно добиться. Примерно я так понимаю нужно чтобы светодиод загорался (к примеру) при 12 вольтах, а гас при 11.8, скажем?

  34. Здравствуй Андрей,
    совершенно верно, и желательно иметь возможность менять величину гистерезиса программно (как пороги). Думаю, это увеличит функциональность и расширит сферу применения данного устройства. В первую очередь, необходимость в гистерезисе возникает при использовании исполнительных устройств (реле) вместо индикаторов и кто-то уже интересовался этим.
    В любом случае, благодарю за внимание.
    Юрий

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *