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

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

Да снова на микроконтроллере. Все кто желает собрать такое же, но на два рубля дешевле на компараторе – до конца имеет право не читать. Принцип работы такой – при отсутствии аккумулятора зарядное устройство из 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 коментарів до “Индикатор заряда аккумулятора

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Извольте. Самое сложное. Четырехбайтное вычитание:
      ;—————————————————————————–
      ;задаем в секции .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.

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

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

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

        • Переменные добавляется в секцию .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

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

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

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

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

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

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

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

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

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

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

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

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