В последнее время для устройств с батарейным питанием все чаще используются 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