lastdownxxl
User
Hallo,
ich hab mir heute einen 3S LiFePo Limiter für meine Sender mit LiFePo gebaut. Der Limiter wandert in den Sender da der Ruhestrom
vom Limiter nur wenige uA beträgt. Somit muss ich das Balancerkabel nicht herausführen. Der Limiter pro Zelle besteht aus einem PIC 12F1572
mit einem Lastwiderstand und einem IRLML2502. Siehe dazu auch RC-Schalter (Load Switch).
Funktion vom Limiter:
Der PIC1572 hat eine interne Referenzspannung mit 1.024 Volt. Gegen diese Referenzspannung messe ich die Versorgungsspannung vom PIC,
diese ist die Spannung einer LiFePo-Zelle. Gleichzeitig ist die Spannung der LiFePo-Zelle die Referenzspannung vom ADC.
Mit steigender Spannung wird der gemessene Wert der Referenzspannung kleiner und umgekehrt. Falls die Spannung 3.6 Volt
erreicht, wird der Lastwiderstand mit 27 Ohm / 2W parallel zur Zelle geschaltet. Damit der Limiter dauerhaft am Akku verbleiben kann,
wird der PIC nur zum Messen der Spannung und der eventuellen Reaktion aus dem Schlaf geholt. Ansonsten ist der PIC im low power sleep mode
und benötigt daher nur wenige uA (< 8 uA) für den Wachdog Timer. Bei einer Zellspannung kleiner 3.45V verweilt der PIC 1 sec im sleep mode.
Diese Spannung ist bei einem geladenem LiFePo relativ schnell nach Ladeende erreicht. Bei einer Zellspannung > 3.45 V
wird der Watchdog Timer (WDT) auf 32 ms Schlafzeit gesetzt. Somit ist eine ausreichend schnelle Reaktion der Schaltung beim Laden
gewährleistet.
Die Referenzspannung ist leider nicht sehr genau, aber sie besitzt eine gute Wiederholpräzision. Hab dazu vor über einem Jahr messungen incl.
dem Einfluss der Umgebungstemperatur gemacht.
Mit einer Mittellung über 4 Messwerte im 8bit Mode vom ADC steht das letzte BIT der Messung. Bei der Inbetriebnahme hab ich die Schaltschwelle
mit einem kalibriertem DVM kalibriert. Im Moment hängt der Limiter zum Test an meiner uralten FC16 mit 3S LiFePo. Ich werde mal im weiteren, falls interesse besteht, meine Langzeiterfahrung mitteilen.
Gruss Micha
ich hab mir heute einen 3S LiFePo Limiter für meine Sender mit LiFePo gebaut. Der Limiter wandert in den Sender da der Ruhestrom
vom Limiter nur wenige uA beträgt. Somit muss ich das Balancerkabel nicht herausführen. Der Limiter pro Zelle besteht aus einem PIC 12F1572
mit einem Lastwiderstand und einem IRLML2502. Siehe dazu auch RC-Schalter (Load Switch).
Funktion vom Limiter:
Der PIC1572 hat eine interne Referenzspannung mit 1.024 Volt. Gegen diese Referenzspannung messe ich die Versorgungsspannung vom PIC,
diese ist die Spannung einer LiFePo-Zelle. Gleichzeitig ist die Spannung der LiFePo-Zelle die Referenzspannung vom ADC.
Mit steigender Spannung wird der gemessene Wert der Referenzspannung kleiner und umgekehrt. Falls die Spannung 3.6 Volt
erreicht, wird der Lastwiderstand mit 27 Ohm / 2W parallel zur Zelle geschaltet. Damit der Limiter dauerhaft am Akku verbleiben kann,
wird der PIC nur zum Messen der Spannung und der eventuellen Reaktion aus dem Schlaf geholt. Ansonsten ist der PIC im low power sleep mode
und benötigt daher nur wenige uA (< 8 uA) für den Wachdog Timer. Bei einer Zellspannung kleiner 3.45V verweilt der PIC 1 sec im sleep mode.
Diese Spannung ist bei einem geladenem LiFePo relativ schnell nach Ladeende erreicht. Bei einer Zellspannung > 3.45 V
wird der Watchdog Timer (WDT) auf 32 ms Schlafzeit gesetzt. Somit ist eine ausreichend schnelle Reaktion der Schaltung beim Laden
gewährleistet.
Die Referenzspannung ist leider nicht sehr genau, aber sie besitzt eine gute Wiederholpräzision. Hab dazu vor über einem Jahr messungen incl.
dem Einfluss der Umgebungstemperatur gemacht.
Mit einer Mittellung über 4 Messwerte im 8bit Mode vom ADC steht das letzte BIT der Messung. Bei der Inbetriebnahme hab ich die Schaltschwelle
mit einem kalibriertem DVM kalibriert. Im Moment hängt der Limiter zum Test an meiner uralten FC16 mit 3S LiFePo. Ich werde mal im weiteren, falls interesse besteht, meine Langzeiterfahrung mitteilen.
Gruss Micha
Code:
' LiFePo Limiter Tx, 8bit ADC read out
' 21.01.2018, Compiler v95.01
' -----------
' V+ -| 1 8 |- GND
' RA5 -| 2 7 |- RA0 DISCHARGE
' RA4 -| 3 6 |- RA1
' RA3 -| 4 5 |- RA2
' -----------
'
#chip 12F1572,4
#config OSC = INTOSC, PWRTE = ON, WDTE = ON
#define VOLT_3P57 146 'nom 147
#define VOLT_3P45 150 'nom 151
#define DISCHARGE PORTA.0
dir DISCHARGE out
#define FAST_MODE PORTA.2
'dir FAST_MODE out
'Variables
dim Ref_Count as byte
Ref_Count = 0
'ADC Init
movlw B'01010000' ;Left justify, FOSC/16, Vref = Vdd
movwf ADCON1
'FVR is ADC input
bsf ADCON0,CHS0
bsf ADCON0,CHS1
bsf ADCON0,CHS2
bsf ADCON0,CHS3
bsf ADCON0,CHS4
;Low-Power Sleep mode
bsf VREGCON,VREGPM1
Do
set DISCHARGE off
Ref_Count = VFVR
if (Ref_Count < VOLT_3P57) then set DISCHARGE on 'Vdd > 3.57V
SLEEP_Mode
Loop
'------------------------------------------------------------------------------
sub SLEEP_Mode
if (Ref_Count < VOLT_3P45) then 'if Vdd > 3.45 Volt
'set FAST_MODE on
clrwdt
movlw b'00001010' ;WDT Interval 32 ms nominal
movwf WDTCON
else
'set FAST_MODE off
clrwdt
movlw b'00010100' ;WDT Interval 1 s nominal
movwf WDTCON
end if
sleep
end sub
'------------------------------------------------------------------------------
sub Delay_44_US
dim A_Delay as byte
movlw 13
movwf A_Delay
decfsz A_Delay,f
goto $-1
end sub
'------------------------------------------------------------------------------
function VFVR as byte
dim TempSum as word
dim TempLoop as byte
bsf FVRCON,FVREN ;Turn On Fixed Voltage Reference
bcf FVRCON,ADFVR0 ;10 = ADC FVR Buffer Gain is 2x, VADFVR = 2x VFVR
bsf FVRCON,ADFVR1 ;10 = ADC FVR Buffer Gain is 2x, VADFVR = 2x VFVR
Delay_44_US ;wait for stable FVR
clrf TempSum
clrf TempSum_h
;Repeat 4 Times
movlw 4
movwf TempLoop
RepeatLoop1:
bsf ADCON0,ADON ;Turn ADC On
Delay_44_US ;Acquisiton delay
bsf ADCON0,ADGO ;Start conversion
btfsc ADCON0,ADGO ;Is conversion done?
goto $-1 ;No, test again
movf ADRESH,w
movwf VFVR
;TempSum = TempSum + VFVR
movf VFVR,w
addwf TempSum,f
movlw 0
addwfc TempSum_h,f
;End Repeat
decfsz TempLoop,f
goto RepeatLoop1
;REPEAT 2 Times , divide by 4
movlw 2
movwf TempLoop
RepeatLoop2:
bcf STATUS,0
rrf TempSum,f
bcf STATUS,0
rrf TempSum_h,f
btfss STATUS,0
goto L_ELSE
movlw 128
addwf TempSum,f
L_ELSE:
;finished
;End Repeat
decfsz TempLoop,f
goto RepeatLoop2
'TempSum = VFVR
movf TempSum,w
movwf VFVR
bcf FVRCON,FVREN ;Turn Off Fixed Voltage Reference
bcf FVRCON,ADFVR0 ;Turn Off ADC FVR Buffer
bcf FVRCON,ADFVR1 ;Turn Off ADC FVR Buffer
bcf ADCON0,ADON ;Turn ADC Off
end function