В последнее время для устройств с батарейным питанием все чаще используются LiOn аккумуляторы. Вот и я надергал элементов 18650 из старых батарей от ноутбуков, собрал элементарную зарядку на lm317 (кстати тут на выходных моделировал в протеусе защиту для них во время зарядки - если доделаю выложу). Однако при всех преимуществах литья для долгой службы надо следить за напряжением во время разряда - должно на элементе оставаться не меньше 3 вольт, иначе можно их быстро выбросить...

В железе пока не опробовал, моделирование в протеусе не всегда соответствует железу увы...
Вот архив с моделью, hex-файлом и исходником.
Поясню:
При включении или резете загорается столбик из светодиодов соответствующий половине напряжения на входе ( у меня 2 банки последовательно). Зажигаем на время в секундах в ячейке 3 eeprom. В первых трех хранятся коэффициенты срабатывания светодиодов, соответствующие напряжениям 4, 3.5 и 3 вольта. Соответственно можно эти коэффициенты поменять под свои элементы и/или напряжение питания. adc настроен на 8 бит оцифровки, т.е. 255 = напряжению питания. После того как замер напряжения показан - pic уходит в цикл, 2.3 секунды "спит", потом меряет напругу, если оно стало меньше 3 вольт, начинает моргать красный светодиод.
update:
Собрал в железе, для более простой разводки поменял местами некоторые пины, поправил исходник. Схему не рисовал - по исходнику понятно что куда подключается:
'@device = pic12F675, intrc_osc_noclkout, wdt_on, mclr_on, protect_off
led_full var GPIO.0
led_half var GPIO.1
led_low var GPIO.2
led_empty var GPIO.5
trisio=%00010000 ' отключаем GPIO.4
ANSEL = %00111000 ' внутренний RC генератор, AN3
adcon0=%00001101 ' опорное - питание, An3, модуль АЦП включен
CMCON = 7
define adc_bits 8
define adc_clock 3
define adc_sampleus 50
led_empty = 1
led_low = 1
led_half = 1
led_full = 1
adval var byte
full var byte
half var byte
lowb var byte
show var byte
data @0,204,178,153,3 ' значения для 4, 3.5, 3 вольт (full,half,low) (51 для 1 вольта)
read 0,full
read 1,half
read 2,lowb
read 3,show ' сколько секунд показывать напряжение
adcin 3, adval
if adval < lowb then led_empty = 0
if adval > lowb then led_low = 0
if adval > half then led_half = 0
if adval > full then led_full = 0
pause 1000*show ' показывает напряжение на батарее и ждем 3 секунды
led_empty = 1
led_low = 1
led_half = 1
led_full = 1
main: nap 7 ' спим 2.3 секунды
adcin 3, adval
if adval > lowb then main
avaria: led_empty = 0
nap 5
led_empty = 1
nap 5
goto avaria
end

2918 просмотров
комментировать