Translate

24 Januar 2013

SAE J1772 und IEC 61851 Signale auswerten (Software)


Das Programm läuft mittlerweile auch schon!
Das Grundgerüst steht und funktioniert


Ich hab noch ein Video dazu aufgenommen
(bereits die neueste Programmversion, schon brauchbar bis auf kleine Schönheitsfehler)
.....da hab ich mich doch tatsächlich vertippt und 1442 statt 1772 geschrieben und dann
hab ich meinen eigenen Fehler abgelesen.....weia.....

Und dann muss ich noch abklären, wie denn die Codierung des max.Stromes
in der neuesten Version tatsächlich definiert ist. Da scheint mal wieder die Norm
geändert worden zu sein um auch höhere Stromstärken codieren zu können
Hier wurde die Umrechnung der PWM-Verhältnisse von 0 - 10%  und von
80% bis 100% anders festgelegt als in alten Entwürfen


<3 fehler="" p=""> 3% - 7% Digitale Kommunikation erforderlich (das war früher bei 90% PWM !)
10% 6A
20% 12A
30% 18A
40% 24A
50% 30A
60% 36A
70% 42A
 80% 48A   Bis hier wie "früher" 6A je 10%
darüber andere Umrechnung
84% 50A
86% 55A
88% 60A
90% 65A
92% 70A
94% 75A
96% 80A
>96 Error


Weiter unten habe ich die allererste Basis-Version des Programms eingefügt
So Dinge wie Ansteuerung der Kontrolleuchten und Relais und ein kleines Menue
zum Konfigurieren des maximalen Stromes fehlen da noch, aber ich habe das alles
mittlerweile größtenteils als Unterprogramme in der "Select Case - Schleife ausgeführt.
Mehrere Befehle einer "Case" -Bedingung zuzuordnen geht meiner Meinung am elegantesten,
wenn man in ein Unterprogramm springt und da die entsprechenden Aktionen ausführt.
PWM ist jetzt einfach mal fest  auf 50% eingestellt, die Abschaltung des Taktes
wenn nichts dran hängt sowie ein paar andere Kleinigkeiten müssen noch rein,
aber das ist Routine.Die Erkennung aller Zustände arbeitet jedenfalls korrekt,
 und dann noch irgendwas zu schalten sollte jetzt nicht das Problem sein.
Eine kleine Anmerkung: Da muss noch so manches in Unterprogramme gepackt
werden. Der "Spaghetticode" (alles hintereinander) ist nicht optimal, weil eigentlich immer
wieder das Selbe passiert, aber an verschiedenen Stellen unterschiedlich reagiert werden
muss ist es von Vorteil, wenn man so Dinge wie Messen und Anzeigen in Unterprogramme
steckt und diese dann an der jeweiligen Stelle des Programmablaufs ausführt.
Die ganze Verschachtelung der Abläufe bleibt dann verständlicher, wenn das Programm
erst mal immer umfangreicher wird mit Wartezeiten hier und da, länger nach dem Einschalten,
aber sofort auf Störungen reagieren etc. gerade mit den Wartezeiten ist das so eine Sache....
Man ist immer versucht, einfach "Wait"-Befehle zu setzen, aber das ist nur dann gut
wenn der Prozessor dann wirklich nichts zu tun hat.....er tut nämlich dann gar nichts!
Hier muss aber immer möglichst sofort auf Fehler reagiert werden und deshalb
braucht man da andere Möglichkeiten um gewisse Dinge zu verlangsamen.
Meist handelt es sich eh nur ums langsamere Schreiben ins Display oder zum
dämpfen einer Reaktion auf ein Ereignis. da sind dann "For....Next-Schleifen besser
oder wie ich es auch schon mehrmals machte, man zählt einfach einen Wert pro
Durchlauf um eins hoch "INCR" und schreibt dann bei bestimmten Zahlen ins Display
am besten immer zeilenweise verteilt. Rechenoperationen laufen auf dem Atmega
mit sehr hoher Geschwindigkeit, aber schreiben ins Display ist ein recht langsamer
Vorgang im Vergleich zu Rechenoperationen. ähnlich mache ich es auch oft, um
eine gewisse Hysterese und Zeitverzögerung in Umschaltvorgänge hineinzubekommen
wenn eine Bedingung erfüllt ist, hochzählen ansonsten runter, den Wert z.B. zwischen
0 und 10 halten und dann z.B. bei kleiner 4 ausschalten und bei größer 6 einschalten.
.........und schon sind einzelne Aussetzer eliminiert und Zeitschleifen geschaffen die
Das Programm im Ablauf kaum behindern. So ein Durchlauf selbst von längeren
Programmen ist eine Sache im 1/100 Sekundenbereich wenn nicht gerade ins Display
geschrieben wird!

ansonsten: erstaunlich kurz das Programm..............
Die entscheidenden Teile sind halt so noch am allerbesten zu erkennen

Mittlerweile ist das Programm natürlich schon wesentlich weiter entwickelt und
bis auf ein paar Schönheitsfehlerchen läuft es jetzt schon fast perfekt
Es gibt eigentlich nur noch ein paar Timing-Problemchen,
weil die Anzeige scheller reagiert, als sich die Messwerte der Auswerteschaltung
einpegeln.z.B. weil sich die negative Spannung erst aufbauen muss nachdem
zuerst ein Fahrzeug erkannt wurde und dann der Signalgenerator gestartet wurde.
Da blitzen halt noch gelegentlich Fehlermeldungen auf. Die muss ich noch unterdrücken.
Hierbei handelt es sich vor allem um die Meldungen zwischen den "guten" Messwerten,
Ich habe diese Meldungen eigentlich eh nur zum "Debuggen" da drin. man könnte die also
auch problemlos ganz entfernen schliesslich werden die Spannungen ohnehin angezeigt
und das reicht ja im Fehlerfall um zu erkennen wo es nicht passt.
Dann müssen die ganzen "wait" -Befehle noch raus und durch
Warteschleifen ersetzt werden aber das ist eigentlich eine reine Fleissaufgabe

Jetzt aber im Folgenden erst mal nur das Programm in Bascom in der allerersten Version.


$regfile = "m88def.dat"   'Atmega88,  (Atmega48 müsste auch reichen)
$crystal = 4000000     ' wird noch zu 4096000 für 1kHz PWM-Takt
$baud = 9600

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Timer0 = Pwm , Pwm = On , Compare A Pwm = Clear Down , Prescale = 8

Config Pinc.2 = Output        'LED gn
Config Pinc.3 = Output        'LED rt
Config Pind.6 = Output      'PWM

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

'achtung: Belegung LCD ist individuell, insbesondere E und Rs

Config Lcdbus = 4

Config Lcd = 16 * 2

Config Pind.2 = Input      'dn
Config Pind.3 = Input      'up
Config Pind.4 = Input      'enter

Portd.2 = 1     'Pullups für Tasten
Portd.3 = 1
Portd.4 = 1

Cls

Dim U1 As Long       ' Long ist großzügig, aber schöner zum Rechnen
Dim U1a As Long
Dim U1s As String * 4

Dim U2 As Long
Dim U2a As Long
Dim U2s As String * 4

Ocr0a = 128              'PWM
'10% =25 20%=51 30%=76 .....90%=229 100%=255

Cls       'zeit gewinnen beim Starten, sonst Fehlermeldungen
Locate 1 , 1
Lcd " J 1772 "
Locate 2 , 1
Lcd " Charger"
Wait 2
Cls
Locate 1 , 1
Lcd "by Franz"
Locate 2 , 1
Lcd " Fischer"
Wait 2
Cls

Do

Startpunkt:

'Einlesen sollte in ein Unterprogramm dann kann man öfter lesen

U1 = Getadc(5)       'pos.Halbwelle einlesen
U1a = U1 * 100
'U1a = U1a / 493
U1a = U1a / 485     'Abgleich der Verstärkung  4k7 + 2k7
U1a = U1a + 7   'Korrektur der Diodenspannung
If U1a < 10 Then U1a = 0    'damit bei 0V auch 0V im Display steht
U1s = Str(u1a)     'Fürs Display, mit Komma
U1s = Format(u1s , " 0.0")

U2 = Getadc(4)     'neg.Halbwelle einlesen, bereits invertiert im OP
U2a = U2 * 100
'U2a = U2a / 505
U2a = U2a / 501     'Abgleich der Verstärkung  4k7 + 2k7
U2a = U2a + 7    'Korrektur der Diodenspannung
If U2a < 10 Then U2a = 0    'damit bei 0V auch 0V im Display steht
U2s = Str(u2a)     'Fürs Display, mit Komma
U2s = Format(u2s , " 0.0")

Locate 2 , 1
Lcd " H " ; U1s ; "V"

Gosub Meldung

Wait 1    'Wait ist nie gut......noch ändern, zählen oder so......

Locate 2 , 1
Lcd " L-" ; U2s ; "V"

Gosub Meldung

Wait 1     'Wait ist nie gut......noch ändern, zählen oder so......

Loop

Meldung:   'Unterprogramm für Display und Auswertung
Locate 1 , 1
If U2a < 100 Then  'falls negative Halbwelle < 10V
Lcd "ErrorNeg"
Locate 2 , 1
Lcd " L-" ; U2s ; "V"
Wait 2
Return
End If

Locate 1 , 1
Select Case U1a     'Auswertung pos.Halbwelle
                               ' in 1/10 V wg Kommastelle
Case 0 To 19 : Lcd "ErrorGND"
Case 20 To 40 : Lcd "Chrg+Fan"
Case 41 To 49 : Lcd "Error CD"
Case 50 To 70 : Lcd "Charging"
Case 71 To 79 : Lcd "Error BC"
Case 80 To 100 : Lcd "OK Idle "
Case 101 To 109 : Lcd "Error AB"
Case 110 To 130 : Lcd "No Car "
Case Is > 130 : Lcd "Error hi"
End Select
Return

1 Kommentar:

  1. Ich möchte mir eine Wallbox für IEC 62196-2 selber bauen und diese unter Bascom realisieren da ich seit vielen Jahren die unterschiedlichsten Programme unter Bascom realisiert habe. Nac lägerem Suchen bin ich auf diesen Blog gekommen und würde gern den Kontakt zu Dir / Ihnen aufnehmen. Außerdem wüßte ich gerne ob das Projekt inzwischen fertiggestellt ist und ob damit schon ein Auto geladen wurde. Sind noch irgendwelche spezielle Probleme aufgetaucht?
    Mit freundlichen Grüßen
    Michael von Gersdorff

    AntwortenLöschen