Это устройство изготавливалось как “довесок” к зарядному устройству для шуруповерта. Как всем известно – лучшее – враг хорошего. И после того как аккумуляторы на шуруповерте стали заряжаться по-человечески, со стороны владельца поползли тихие и мягкие намеки что, дескать, “было бы неплохо лампочку…” или “вот если бы когда зарядится загорелось бы чего…”. В общем нервы у меня не железные да и индикация процесса зарядки вещь довольно полезная, но излишне усложнять не хотелось, да и было желание сделать чего-нибудь более-менее унифицированное, чтобы можно было применить позже. Вот что получилось:
Да снова на микроконтроллере. Все кто желает собрать такое же, но на два рубля дешевле на компараторе – до конца имеет право не читать. Принцип работы такой – при отсутствии аккумулятора зарядное устройство из 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
Архив с исходниками
Прошивка
Андрей, как зашить tiny13 с помощью avr910?
Сори, уже нашёл сам.
Атмеловский AvrProg не знает что такое tiny13, avrdude (как напрямую, так и через Burn-O-Mat) отказался шить или читать фьюзы, под предлогом что tiny13 “device not supported”.
Воспользовался AvrOspII (только софт для программирования) – он сам опознал программатор, сам опознал микросхему, и благополучно зашил. Брал здесь – http://www.serasidis.gr/circuits/usbAvrProg/usbAvrProg.htm (ссылка в самом низу).
Полезная штучка вчера собрал-работает! Можно прилепить на многие “девайсы”, особено нравится програмное изменение установок порогов срабатывания. Спасибо.
Вот бы ещё одну ножку чипа в работу пустить, связав её с пороговым срабатыванием и красным светом дабы она управляя релюшкой размыкала зарядное устройство и аккумулятор тем самым препятствуя перезарядке элементов …
А что ж Вам мешает прицепить ключик с реле к ножке, на которой при зеленом светодиоде появляется высокий уровень? Единственное что придется изменить – подключить вход АЦП после контакта реле, а вход питания до контакта, т.е. чтобы при размыкании реле устройство продолжало питаться, а вход АЦП оставался подключенным к аккумулятору а не источнику питания.
Електра, подскажите пожйлуста, какие строки изменить в прошивке, чтобы светодиод на 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в – светит. Зеленый то трогать не хочется, его поведение вполне устраивает. Кстати, не нашел ниодного способа связи с Вами, если можно на почту скиньте, хоть какие-то координаты.
Андрей, вернитесь, мы все простим 🙂
RE (при напряжении 13.5 и выше вольт не горит не один – устройство думает, что аккумулятор не подключен
А можно добавить 3й св диод желтый, который начинает мигать при 13.5в, над которым написать – аккум. заряжен полностью
Андрей.
Не пойму на чем написана программа? Я только учусь. Можно ли добавить таймер скажем на 10 – 15
часов. Например: При падении напряжения когда загорается красный светодиод включается таймер на 5 ноге
включая зарядку. По окончании времени зарядка отключится. Это для резервного питания на пальчиковых аккумуляторах.
Ответь пожалуйста.
Писано на ассемблере. Перепутать с чем-то еще очень сложно 🙂
Добавить конечно же можно, как раз тот случай поупражняться в такой простой затее для начинающего. Исходник у Вас есть, попробую направить:
1. В прерывании таймера, он один у tiny13 и уже настроен на частоту 586 гц нужно уменьшать 4-х байтное число (должно хватить на 25-30 часов), которым задается нужное время. По факту достижения нуля – нужно выставить порт (5 нога) в положение ноль.
2. Запускать процесс нужно проверяя логическую единичку на нужном “пине” путем выставления логической единицы в порт (5 нога) и записью числа в четырехбайтную переменную. Число считаем примерно так: 15 (часов) * 60 (минут) * 60 (секунд) * 586 (тиков таймера) = 31 644 000. Столько тиков должен отсчитать МК для того чтобы получилось 15 часов при выбранных параметрах таймера.
Как-то так. Дерзайте.
Хотя для резервного питания все конечно же немного сложнее…
Андрей.
Может как-то примерчиком подскажите ??? Я на С еле что-то изменить могу а ассемблер темный лес.
Извольте. Самое сложное. Четырехбайтное вычитание:
;—————————————————————————–
;задаем в секции .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
Все, дальше сами, а то я и так почти все написал. Самое интересное пропустите 😉
Скажите а как можно переделать данное устройство для контроля наприжения АКБ 24В? и контролировать 21-22В. Если просто в прошивке изменить на 24В это не повредит остальным smd элементам?
Нужно будет заменить L1087 на что нибудь более высоковольтное. Например 78L05
Может я наглею, но осмелюсь попросить. не могли бы вы переделать прошивку чтобы при появлении напряжении на 3 ножки, вне зависимости от напряжения питания светодиоды гасли. Зачем мне это нужно?: хотел приспособить для управления дневным светом на автомобиле. Включаем зажигание, напряжение меньше 13в, двигатель завели напряжение в бортовой сети увеличилось, сработал порог, на порт вместо светодиода управление нагрузкой через полевой транзистор. При включении габаритов напряжение поступает на 3 ножку, транзистор закрывается и все работает по штатной схеме авто.
ответил на почту
к сожалению ничего не получил
Жаль… Два часа работы по “допиливанию” прошивки коту под хвост.
Если “допиливания” сохранились, можете повторить на другую почту
Здравствуйте! А можно ли как-то изменить схему под использование 2-ух разных по цвету светодиодов вместо 1 двухцветного?
Не надо ничего менять. На одну ногу МК анод одного светодиода, на другую другого и катоды на землю.
electra, не могли бы вы, пожалуйста, отправить и мне на почту, то что отправляли Сергею. Спасибо.
Удалил как неподтвержденное по работоспособности.
Подскажите пожалуйста как увеличить гистерезис? Как я понял он сейчас равен 1 вольту. Нужно чуть побольше.
Не совсем понял о каком гистерезисе идет речь.
Здравствуйте , не могли бы вы подправить прошивку , нужно чтобы переключение между ножками контроллера происходило через интервал временихотя бы в 1 секунду. Т.е когда произошло переключение на РВ2 на PB1 был высокий уровень примерно 1 секунду. Хочу применить в сигнализации переключение между аккумуляторами.
Андрей, а насколько сложно добавить регулируемые программно гистерезисы
на пороги срабатывания?
Что конкретно Вы имеете ввиду, Юрий? Если можно, на примере применения в устройстве. Так понятнее будет чего нужно добиться. Примерно я так понимаю нужно чтобы светодиод загорался (к примеру) при 12 вольтах, а гас при 11.8, скажем?
Здравствуй Андрей,
совершенно верно, и желательно иметь возможность менять величину гистерезиса программно (как пороги). Думаю, это увеличит функциональность и расширит сферу применения данного устройства. В первую очередь, необходимость в гистерезисе возникает при использовании исполнительных устройств (реле) вместо индикаторов и кто-то уже интересовался этим.
В любом случае, благодарю за внимание.
Юрий