LiFePo Limiter (einfacher Equalizer) für Sender mit sehr geringem Ruhestrom

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

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
 
Hallo Micha
Ich habe keine Erfahrungen mit PIC, aber das wäre ja mal ein Anfang.
Womit compilierst Du die PICs ? Mplap ? oder gibt es da auch leichtgewichtigere Alternativen ?
Bei den AVR nutze ich Geany und AVR-GCC über makelfile.

(es wird ja eh Gerüchteweise vermutet das mittelfristig das AVR-Studio ins Mplap kommen soll, kann dann also nur besser werden. Das AVR-Studio funzte ja nie unter Linux, also wars eh Kernschrott;))
 
Hallo Holger,

ich programmiere in gcbasic.

http://gcbasic.sourceforge.net/Typesetter/index.php/Home

Leider hab ich bisher keinen gescheiten open source c compiler für pic's gefunden. Der asm-code vom gcbasic ist sehr kompakt. Ich hab früher mal einen c-compiler cc5x (limitierte version) getestet, das gcbasic program (hex file) war kleiner. Mplab verwende ich zum
debuggen und zum brennen.

Gruß Micha

Noch ein Pic vom Sender mit Limiter.
IM001205.JPG
 
Sender 3S LiFePo Ladegerät

Sender 3S LiFePo Ladegerät

Hallo,

zum laden meiner Sender hab ich mir ein einfaches Ladegerät mit einem einstellbaren Spannungsregler gebaut. Ich hatte noch ein
LM317 sowie ein 12V Steckernetzteil übrig. So muss ich nichts einstellen, eine sogenannte Resteverwertung.

Gruss Micha

LiFePo-Charger.jpg
 
Leider hab ich bisher keinen gescheiten open source c compiler für pic's gefunden.

Hallo,

kennt jemand vieleicht einen vernünftigen Open Source C Compiler für pic's. Beruflich hab ich früher mal unter anderem Software
für eine redundante Motorsteuerung (6 Zylinder Flugmotor) entwickelt. Das war aber zu Zeiten eines Motorola 68376.

Gruss Micha
 
Hallo Micha
Das einzige was ich bisher Thema finden konnte, war das https://www.mikrocontroller.net/articles/PIC_C-Compilervergleich
Zum testen bin ich noch nicht gekommen.
Wenn ich das richtig verstehe, ist der XC ohne Pro free ? Aber alles irgendwie vergleichsweise "aufgeblasen".

Interessant sind ja auch die neuen kleinen Attinys (0-Series / 1-Series), irgendwie halb AVR halb PIC halb wassweissich ;) Ein Kompromiss zweier Welten, oder weder Fleisch noch Fisch ?
Übersicht: http://ww1.microchip.com/downloads/en/appnotes/00002515b.pdf

Der Attiny212/412 Soic8 ist für meine Sachen sehr Interessant, aber leider noch nicht kaufbar. Besonders Modellbaufreundlich: OneWire-Update Über das Servokabel, gleich mit onboard, ( UPDI - Unified Program and Debug Interface) spart gleich noch doch den AVRootloader/sonstige Bootloader, das tönt doch schon mal super :)
Bin in Versuchung den grösseren attiny814 zum spielen und lernen zu bestellen, bis die kleinen 8Pinner erhältlich sind.
http://ww1.microchip.com/downloads/en/DeviceDoc/40001911A.pdf

Mit dem DFP Package rennen "die Neuen" Codes schonmal im AVR-GCC
http://distribute.atmel.no/tools/opensource/Atmel-AVR-GNU-Toolchain/3.5.4/
http://packs.download.atmel.com/#collapse-Atmel-ATmega-DFP-pdsc
 
Hallo Holger,

den xc8 hab ich mal ausprobiert. Der ist arsch langsam beim compilieren, die IDE läuft auf meinem Recher irgenwie
nicht richtig. Zum debuggen verwende ich noch eine alte Mplab Version. Im prinzib bin ich
mit dem gcbasic sehr zufrieden. Hab so einige Sachen wie serielle Kommunikation, Display Routinen teilweise in Assembler
geschrieben. Durch open source kann man ja vieles auf die eigenen belange anpassen. Schade das es
das nicht für c gibt. Ich hab mir für meine Frsky D8 RX,TX die Telemetrie (Dashboard, Spannung, Stromsensor, Vario) mit gcbasic selbst programmiert und gebaut.

Gruss
Micha
 
Hallo,

hab schon vor über einem Jahr einen Limiter 4S gebaut. Der hängt seit dem an meiner tragbaren 12 Volt Supply, die ist schön leicht.
Durch die LED's sehe ich, ob der Limiter arbeitet. Geladen wird der LiFePo von einer 30W Solaranlage oder mit einem KFZ Bleiakku Ladegerät.
Da der Limiter einwandfrei funktioniert, hatte ich mich dazu entschlossen, den Limiter in kleiner Ausführung für meine Sender zu bauen.

Gruss Micha

Zwischenablage-3.jpg

Bild vom zweiten Sender Limiter in der uralten FC18 vom Pappa.

Zwischenablage-1.jpg
 
Hallo,

eine der beiden Sender mit dem Limiter ist jetzt seit etwas mehr als 2 Monaten nicht
benutzt worden. Heute hab ich die Akkuspannung gemessen. Die Spannung hat sich innerhalb der 2 Monate praktisch nicht verändert, minus 10 mV. Der Ruhestrom liegt also wie berechnet bei nur wenigen µA. Der Limiter eignet sich natürlich auch für LiFePo oder LiIon
Empfänger Akkus die im Modell verbleiben. Somit genügt eine einfache Ladebuchse (ich verwende 3.5 mm Klinkenstecker und Buchse)
zum Laden im Flieger.

Gruß
Micha
 

Julez

User
Ich find das Projekt schon sehr cool. Könntest du einen Schaltplan zeichnen von einer Einzelstufe?
Und hab ich das richtig verstanden, dass du je nach Spannungsreferenztoleranz ein individuell parametrisiertes Programm auf den Chip schreibst?
 
Hallo Julez,

hier ist der gewünschte Schaltplan einer Einzelstufe. Beim Anschluß an die Balancer Buchse vom Akku muß auf eine
gute Verbindung geachtet werden. Die Versorgungsspannung vom PIC 12F1572 (Voltage Range 2.3V to 5.5V) kommt ja von dort.
Beim Schalten vom FET entsteht ein Spannungsabfall am Balancer-Stecker. Daher sollte der Ausgleichsstrom nicht zu groß gewählt werden.
Die Messung der Zellenspannung erfolgt natürlich stromlos. Ich verwende gerne Stiftleisten mit einem RM von 2.54 mm als
Balancer Stecker.

Bei der Inbetriebnahme überprüfe ich die Einschaltschwelle mit einem geregeltem Netzteil. Eventuell muß der Wert für die nominelle
Einschaltschwelle VOLT_3P57 in der SW um 1 bis 2 digits nach oben oder unten korrigiert werden. Dies ist natürlich individuell pro
Einzelstufe. Zum Abschluß überprüfe ich die Genauigkeit vom Limiter an einem 3S LiIon Akku mit einer Spannung von ca. 3.7 Volt pro Zelle.
Nach dem Entladevorgang überprüfe ich nochmals die Genauigkeit mit einem kalibriertem DVM.

Anstelle vom IRLML2502 kann man auch ein npn-Transistor verwenden. Zum Beispiel ein 2N2222 oder BC237 mit 470 Ohm anstelle von 200 Ohm an der Basis.


Stüli pro Einzelstufe, Bauteile von Reichelt Elektronik
--------------------------------------------------
Lastwiderstand 18 Ohm 2W, Artikel-Nr.: 2W METALL 18, 0.14 €
Widerstand 200 Ohm 0.6W, Artikel-Nr.: METALL 18, 0.082 €
PIC 12F1572 PDIP-8, Artikel-Nr.: PIC 12F1572-I/P, 0.99 €
SMD-MOSFET IRLML2502, Artikel-Nr.: IRLML 2502, 0.21 €
Stiftleisten 2,54 mm, Artikel-Nr.: MPE 087-1-004, 0.10 €

LiFePo-Limiter.jpg

Gruss
Micha
 

Julez

User
Super Micha, vielen Dank dafür erstmal. Ich hab gerade einen 16s Ebikeakku in Betrieb genommen, den ich nicht gerne immer bis 3,6V aufladen würde (wo das von mir verwendete BMS balanct), sondern eher bis 3,45-3,50V. Mein aktueller Plan sieht so aus, regulär bis 3.45V zu laden, und alle paar Wochen mal bis 3,6V zum Balancen. Ich muss mal schauen wie das so klappt, und behalte dabei deinen Plan im Hinterkopf. :)
 
Ansicht hell / dunkel umschalten
Oben Unten