Select Language!
LadegerätCharger

Ladegerät

Um den Bleiakkus ein möglichst langes Leben zu geben, sind beim Laden und Entladen wichtige Punkte zu beachten. Wird der Akku immer nur halb entleert sollte er 500 Zyklen lang halten. Bei voller Entleerung nur 200. Eine Entladung unter 10 Volt führt bereits zu bleibenden Schäden im Akku. Überladen kann zur Explosion oder dem Austritt giftiger Dämpfe führen. Zu hoher Ladestrom reduziert ebenfalls die Lebensdauer.

Deshalb haben wir ein prozessorgesteuerts Ladegerät entwickelt.

In der Zwischenzeit ist daraus in Zusammenarbeit mit Uwe Hofmann und Dr. Thomas Scherer ein Artikel in Elektor entstanden. Hard- und Software wurden nochmal deutlich verbessert.

Schaltplan

Die Reglerplatine wird vom leeren Akku versorgt. Ist dieser Tiefentladen kann er nicht geladen werden. Je nach Ladezustand regelt der Controller den Ladestrom und zeigt den Fortschritt an den LEDs an. Bei vollem Akku geht der Lader auf Erhaltungsladung. Die Regelung ist verpolungssicher und schützt auch das Netzteil vor Verpolung.

Platine

Quellcode Ladegerät

' ------------------------------------------------------------------------------
'  _____ _     _   _              _ _ _ _           _ _
' |   __| |___| |_| |_ ___ ___   | | | | |_ ___ ___| |_|___
' |   __| | -_| '_|  _| . |  _|  | | | |   | -_| -_| | | -_|
' |_____|_|___|_,_|_| |___|_|    |_____|_|_|___|___|_|_|___|
'
' ------------------------------------------------------------------------------
' ------------------------------------------------------------------------------
' Purpose
'   Elektor-Wheelie charger board source code
'
' Changes Log
'  - 0.9b first Beta version
'
' Notes
'  Finetuning
' ------------------------------------------------------------------------------

$regfile = "attiny24.dat"
$crystal = 8000000

'Den A/D-Wandler und die Timer einrichten
Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Start Adc

'Die Hardware-PWM für den Ausgang
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Prescale = 1

'Die Stoppuhr für das zeitlich begrenzte Aufpeppeln bei Unterspannung
Tccr1b = &B00000101
Tccr1a = &B00000000
On Timer1 Timer1_interrupt                                  'Wenn der Timer überläuft wird ein Interrupt ausgelöst
Timsk1.toie0 = 1
Enable Interrupts

'Mit Aliasen wird der Code lesbarer
Pwm_ausgang Alias Ocr0a
Hauptschalter Alias Porta.4
Led_fehler Alias Portb.0
Led_unterspannung Alias Portb.1                             'Unterspannung und Überladung leuchten beide = Schnelladung
Led_ueberladung Alias Porta.7
Led_fertig Alias Porta.3

'Ein paar Konstanten um den Code noch lesbarer zu machen...
Const Aus = 0
Const Ein = 1
Const Unterladung = 1
Const Schnellladung = 2
Const Ueberladung = 4
Const Erhaltungsladung = 5
Const Fehler = 6
Const Voll = 7

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Pina.7 = Output

'###################################################################################################################################
'Mit diesen Konstanten sind die Ladeparameter festgelegt
Const Zellenschluss = 689                                   'unter 10V wird der Akku nicht mehr geladen, eine Zelle könnte Kurz sein
Const Unterspannung_unten = 825                             'ab 12V wird schnell geladen
Const Unterspannung_oben = 835                              'ein 2. Wert leicht versetzt als Hysterese
Const Erhaltungsspannung = 939                              '13.65V Erhaltungsspannung
Const Ladeschlussspannung = 1011                            '14,7V Ladeschlußspannung
Const Schellladestrom = 200                                 '2,5A Schnelladestrom
Const Unterladestrom = 47                                   '0,5A bei Unterladung
Const Schnellladestrom_min = 65                             '0,7A Ladestrom
Const Unterspannung_timeout = 108                           'Multiplikator für 8,3 Sekunden Timout
Const Schnellladung_timeout = 900
'###################################################################################################################################

'Variablen
Dim Ladestatus As Byte                                      'welcher Ladestatus ist aktuell
Dim Old_ladestatus As Byte                                  'der Ladestatus der vorigen Messung für die Hysterese
Dim Ladestrom As Word                                       'Strommessung (Word wegen der 10Bit Genauigkeit des A/D-Wandlers)
Dim Batteriespannung As Word                                'Spannungsmessung
Dim Unterspannung_stoppuhr As Word
Dim Unterspannung_stoppuhr_start As Bit
Dim Schnellladung_stoppuhr As Word
Dim Schnellladung_stoppuhr_start As Bit
Dim Korrektur As Word                                       'Zählvariable für den Timeout
Dim Interval As Bit
                                                           'Korrektur der Spannungsfehlermessung
'Die Subs verhindern einen Überlauf beim Rauf- und Runterdimmen
Declare Sub Dim_up()
Declare Sub Dim_down()
Pwm_ausgang = 0
'Die Hauptschleife
Do
   'Messung der Batteriespannung und des Ladestroms
   Ladestrom = Getadc(1)
   Batteriespannung = Getadc(2)
   Korrektur = Ladestrom / 12                               'um das Spannungsteilerverhältnis der Spannungsmessung reduzieiern
   Batteriespannung = Batteriespannung - Korrektur          'Korrektur der Spannungsfehlerschaltung

   'Es wird die Batteriespannung gemessen, und entschieden welcher Lademodus angewandt wird.
   Select Case Batteriespannung
      Case Is < Zellenschluss                               'unterhalb dieser Spannung wird nicht geladen
         Ladestatus = Fehler
      Case Zellenschluss To Unterspannung_unten             'langsam aufpeppeln bis zur Unterladung-Grenze
         Ladestatus = Unterladung
      Case Unterspannung_unten To Unterspannung_oben        'Hysterese um ein hin- und herspringen beim Übergang zu verhindern
         If Old_ladestatus = Unterladung Then
            Ladestatus = Unterladung
         Else
            Ladestatus = Schnellladung
         End If
      Case Unterspannung_oben To Ladeschlussspannung        'jetzt volle Pulle laden, wenn nicht schon voll
         If Ladestatus = Ueberladung Then
            If Batteriespannung > Erhaltungsspannung And Ladestrom < Schnellladestrom_min Then
               Ladestatus = Voll
               If Ladestrom < 2 Then
                  Ladestatus = Fehler
               End If
            End If
         Elseif Ladestatus = Voll Then

         Else
            Ladestatus = Schnellladung
         End If
      Case Is > Ladeschlussspannung
         If Ladestatus = Schnellladung And Ladestrom < Schnellladestrom_min Then
            Ladestatus = Ueberladung
         End If
   End Select

   'Die Stoppuhren prüfen
   If Ladestatus = Unterladung Then
      Unterspannung_stoppuhr_start = 1
      If Unterspannung_stoppuhr > Unterspannung_timeout Then       'Wenn das Aufpeppeln zu lange dauert abbrechen
         Ladestatus = Fehler
      End If
   Else
      Unterspannung_stoppuhr_start = 0
   End If
   If Ladestatus = Schnellladung Then
      Schnellladung_stoppuhr_start = 1
      If Schnellladung_stoppuhr > Schnellladung_timeout Then       'Wenn die Schnellladung zu lange dauert abbrechen
         Ladestatus = Ueberladung
      End If
   Else
      Schnellladung_stoppuhr_start = 0
   End If

   'Zum Detektieren einer steigenden oder fallenden Spannung für die Hysterese
   Old_ladestatus = Ladestatus

   'Je nach Ladestatus wird der Ausgang Pwm_ausgang mit einer Konstanten verglichen und ausgeregelt
   Select Case Ladestatus
      Case Schnellladung
         Hauptschalter = Ein
         Led_fehler = Aus
         Led_unterspannung = Ein                            'Unterspannung und Überladung leuchten beide = Schnelladung
         Led_ueberladung = Ein
         Led_fertig = Aus
         If Ladestrom < Schellladestrom And Batteriespannung < Ladeschlussspannung Then
            Dim_up
         Else
            Dim_down
         End If
      Case Unterladung
         Hauptschalter = Ein
         Led_fehler = Aus
         Led_unterspannung = Ein
         Led_ueberladung = Aus
         Led_fertig = Aus
         If Ladestrom < Unterladestrom Then
            Dim_up
         Else
            Dim_down
         End If
      Case Ueberladung
         Hauptschalter = Ein
         Led_fehler = Aus
         Led_unterspannung = Aus
         Led_ueberladung = Ein
         Led_fertig = Aus
         If Batteriespannung < Erhaltungsspannung Then
            Dim_up
         Else
            Dim_down
         End If
      Case Voll
         Hauptschalter = Ein
         Led_fehler = Aus
         Led_unterspannung = Aus
         Led_ueberladung = Aus
         Led_fertig = Ein
         If Batteriespannung < Erhaltungsspannung Then
            Dim_up
         Else
            Dim_down
         End If
      Case Fehler
         Hauptschalter = Aus
         Pwm_ausgang = 0
         Led_fehler = Ein
         Led_unterspannung = Aus
         Led_ueberladung = Aus
         Led_fertig = Aus
   End Select
   Waitms 100                                               'nur kein Stress ;-)
Loop

'Beim Überlauf des Timer1 wird dieser Interrupt ausgeführt
Timer1_interrupt:                                           'alle 8,3 Sekunden (bei 8 MHz)
   If Unterspannung_Stoppuhr_start = 1 Then
      If Unterspannung_stoppuhr < 65535 Then
         Incr Unterspannung_stoppuhr
      Else
         Unterspannung_stoppuhr = 65535
      End If
   Else
      Unterspannung_stoppuhr = 0
   End If
   If Schnellladung_stoppuhr_start = 1 Then
      If Schnellladung_stoppuhr < 65535 Then
         Incr Schnellladung_stoppuhr
      Else
         Schnellladung_stoppuhr = 65535
      End If
   Else
      Schnellladung_stoppuhr = 0
   End If
   Toggle Interval
Return

'Das Rauf und Runterdimmen wird begrenzt um Überläufe zu verhindern.
Sub Dim_up()
   If Pwm_ausgang < 255 Then
      Incr Pwm_ausgang
   Else
      Pwm_ausgang = 255
   End If
End Sub

Sub Dim_down()
   If Pwm_ausgang > 0 Then
      Decr Pwm_ausgang
   Else
      Pwm_ausgang = 0
   End If
End Sub