Translate

31 Januar 2013

Franzbox meets Arduino !!!!!!!

Heute hab ich mal erste Gehversuche mit Arduino unternommen!
Zunächst mal das "Blink"-Programm zum Test ob überhaupt was läuft.....
Das "hello world-Programm" , aber mit angepasster Display-Belegung sollte zeigen, ob ich
da irgendwas mit der Display-beschaltung der Franzbox zum Laufen bekomme,
und weil ich schon mal dabei war einiges einzufügen um auch die Initialisierung des doch
als ein bisschen zickig bekannten EA DIP204 Displays korrekt ablaufen zu lassen habe ich
da auch noch eine Zeile Text hizugefügt. Die Zeilenzuordnung passt noch nicht.
Das altbekannte Problem bei diesen LCDs 
Bei echten Standarddisplays lauten die Startadressen 0x00, 0x40, 0x14, 0x54
Beim EA DIP204 jedoch: 0x00, 0x20, 0x40, 0x60
(Das erklärt schon mal, warum der Text in der dritten anstatt in der zweiten Zeile auftaucht)

Mal sehen was da noch auftaucht.......
Dieses Display hat mich schon so oft genervt, weil der KS0072 Chipsatz nicht wirklich
Standard ist, sondern leider ein paar gemeine Unterschiede in der Adressierung hat.
Kein Problem, wenn man den Treiber selber programmiert, aber in Bascom und Arduino
ist genau das nicht wirklich vorgesehen.......
In Bascom reicht es, das Display als 20 x 4a zu definieren und den Chipsatz als KS072 zu
definieren. (ich habe da keine 0 vergessen!!!!) wie es bei Arduino läuft weiss ich noch nicht.
Da gibt es sicher irgend eine Lösung, die EA DIP204-Displays sind einfach so weit verbreitet
(und auch  preiswert, hochwertig und zuverlässig  wenn sie denn erst mal korrekt laufen)

Vor allem gings mir dabei um die Frage ob die Franzbox denn nun tatsächlich Arduino-Kompatibel
ist, wie geplant und ob ich da auch die Display-Ports so frei wählen kann wie in Bascom.
Ich habe meine Display-Pins allesamt auf den PortB gelegt, damit ich das LCD am STK500
mit einem einzigen 10pol Kabel betreiben kann und weil ich bisher noch fast alles mit den übrigen
Pins des Atmega erledigen konnte. Allerdings ist dadurch der SPI-Anschluss belegt.
also entweder Software-SPI verwenden oder das Display anders anschliessen.

Eine weitere Frage war, ob ich auf vorprogrammierte Bausteine angewiesen bin und dieses
ganze Bootloader- und USB-Adapter-Zeug etc.wirklich unbedingt brauche.......
Die Franzbox wurde eigentlich für ISP-Programmierung ausgelegt.
(zwar mit nicht normgerechter Pin-Belegung, aber das hat schon seinen Grund!)

Ergebnis: Volltreffer! Wenngleich ich das Arduino Hauptprogramm nicht dazu überreden konnte
mit irgend einem der mir zur Verfügung stehenden Programmer zusammenzuarbeiten, und auch die
anderen Programme welche ich so durchprobierte nicht gerade intuitiv zu bedienen waren..........
(AVRdude, als Kommandozeilen-Tool, das ist was für hartgesottene Freaks
und Ponyprog, das sollte eigentlich auch funktionieren, aber da ist so viel zum Einstellen,
das ist schwer überschaubar!
MyAvr Progtool gefällt mir sehr gut. Da versteht man sogar die Bedeutung der einzelnen Fuses.

So ist es mir dann doch noch gelungen die Dateien mit dem MyAvr Progtool und dem guten alten STK500 über eine serielle Leitung auf einen fabrikneuen Atmega168 zu brennen!!!
.....und das ohne den Bootloader und ohne irgend ein "original Arduino" Teil

Nachtrag 1.Feb2013: jetzt hat das Brennen auch mit meinem Eigenbau-Parallel-Port-Programmer
und dem Atmega168 auf einer Franzbox-V1-Platine geklappt mit MyAvr Progtool und der Einstellung
STK200 an LPT1. Warum Brennen aus Arduino IDE heraus nicht klappt habe ich aber
noch nicht herausgefunden.

Nachtrag 8.März 2013:
Mittlerweile habe ich mir natürlich auch einen echten Arduino UNO besorgt und ein bisschen damit
herumgespielt.Auch hier klappte der Upload zunächst nicht, obwohl ich mir sicher war,
alles richtig gemacht zu haben, bis ich dann irgendwo den Hinweis fand, dass Arduino IDE
mit Win2000 einige Probleme hat....... (Der USB-Treiber von WIN 2000 ist nicht kompatibel )
Also den Rechner mit XP und später auch noch Vista neu gestartet,
Multi-Boot-Umgebung machts möglich, aber 2000 ist halt am schnellsten.....
und siehe da, hier klappt alles problemlos! 

Ich hab den Atmega168 übrigens zum Arduino Mini mit Atmega168 erklärt, der ist ja so ziemlich 
ähnlich in der Grundschaltung und hat kein USB drauf 
Die seriellen Leitungen sind bei der Franzbox  auf dem kleinen 
roten Micro-Match-stecker rausgeführt. (ganz links unten im Bild)
Einer Programmierung seriell per Bootloader steht also nicht viel im Weg, fehlt nur ein passender USB 
auf Seriell-Adapter, aber darum kümmere ich mich ein andermal.
Da muss ich noch so einiges an Infos zusammentragen, z.B wie mn den Bootloader ggfs auf
einen neuen Chip gebrannt bekommt und welche Fuses warum wie gesetzt sein sollten.
Mit den Fuses ist noch so manches unklar, Bootloader flashen klappte auch nicht wie vorgesehen
weil weder das STK500 (warum nicht?) noch mein selbstgebauter STK200/300 Parallel ISP-Adapter
korrekt erkannt wurden. Da muss man offenbar noch was an den Konfigurationsdateien ändern.

Nachtrag:
Eine höchst interessante Seite hierzu:  http://avrprogrammers.com/bld-arduino-max232.php
Den seriellen Adapter werde ich demnächst mal nachbauen, vielleicht klappt dann der
serielle Upload per Bootloader auch noch irgendwann

Für heute reicht das aber und jetzt muss ich erst mal einen Überblick über all die Eigenheiten 
von Arduino bekommen. Aber für die allerersten vier Stunden mit Arduino als völliger Neueinsteiger
in dieser Programmiersprache kann ich sowieso erst mal mit dem Erreichten mehr als zufrieden sein.
Ich brauche in naher Zukunft eine CAN-Schnittstelle, und da ist Bascom derzeit noch ein bisschen
schlecht dafür gerüstet, und das ganze Steuerprogramm für den CAN-Controller selber zu schreiben
ist mir momentan doch noch eine Nummer zu groß! 
deshalb der Ausflug in Richtung Arduino, da gibt es schon eine funktionierende 
LIB für die SPI-CAN-Controller von Microchip......Und interessiert hat mich das schon sehr lange!
Eigentlich bin ich ja ein großer BASCOM-Fan, aber Arduino hat halt auch seine Stärken (und Schwächen)
Ich verspreche mir halt Vorteile im Bereich CAN, bei grafischen Displays mit Touchscreen,
beim Einbinden von Speichermedien (SD) und eventuell auch in Sachen Bluetooth, weil da ganz einfach
einiges an fertiger preiswerter Hardware und passenden Libraries zur Verfügung steht.
Ich werde aber wohl jetzt nicht alles auf Arduino umstellen!Es gibt einige Dinge, die sind offenbar
mit Bascom um vieles einfacher bzw besser zu lösen! Z.B. das Einstellen der Prescaler bei den Timern.
Diese gerade für PWM-Geschichten äusserst wichtige Einstellung ist beim Arduino nicht vorgesehen.
Zumindest nicht mit den ganz "normalen" Einstellmöglichkeiten. Da muss man so richtig in die 
Register reinschreiben, und dann ist es immer noch nicht ganz gewiss, ob das Programm damit
zurechtkommt, weil es einfach nicht vorgesehen ist, dass irgend ein Timer plötzlich anders läuft.
Schon das Ändern der Quarzfrequenz ist eigentlich auch nicht vorgesehen! Ein Arduino taktet mit
16MHz und damit Basta! Sicher ist alles irgendwo einstellbar, aber eben nur durch die Hintertür.
Eigentlich sehr schade, es ist ja die selbe Hardware, also sollte man da auch die selben Möglichkeiten
haben möchte man meinen. Bascom entspricht einfach viel besser meiner Denkweise, drum werde ich
auch dabei bleiben so lange es irgendwie geht.


Nachtrag 1.Feb.2013:


Falls es jemanden interessiert, ich habe eine Anleitung gefunden, wie man das EA DIP204
in Arduino korrekt initialisiert bekommt und vor allem auch die Zeilenanordnung anpassen kann.
ich hab das noch nicht in der Library geändert, drum waren bei mir die Zeilen verrutscht.
Es widerstrebt mir aber jetzt, die originale LiquidCrystal.cpp zu modifizieren.
Die müsste man doch auch unter anderem Namen speichern können??????
EADIP204.ccp wäre gut
Aber so eine Library besteht aus mehreren Dateien..........
.ccp und .h die irgendwie zusammengehören da muss ich auch noch ein bisschen forschen!


// Franzbox Belegung:
LiquidCrystal lcd(12, 13, 8, 9, 10, 11);

void setup()
{
lcd.begin(20, 4);

{
lcd.command(0x01);//clear display
delay(02);
lcd.command(0x24);//function set RE=1
delay(50);
lcd.command(0x0C);//control, display on, cursor off, blinken off
delay(50);
lcd.command(0x20);//function set RE=0
delay(50);
lcd.command(0x06);//entry mode segment bidirectional
delay(50);
lcd.command(0x24);//function set RE=1
delay(50);
lcd.command(0x09);//extended function set, 4 lines, 5-dot fontwith
delay(50);
lcd.command(0x20);//function set RE=0
delay(20);
lcd.command(0x01);//clear display

}
}


Dann in der liquidCrystal.cpp-Datei folgendes ändern:
( Arduino-1.0.3\libraries\LiquidCrystal.cpp )

int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
in int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };

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

17 Januar 2013

SAE J1772 und IEC 61851 Steuersignale (Hardware)


Im letzten Blog sprach ich über die Steuersignale, jetzt geht es darum,wie man die
erzeugen und auswerten kann.

Ich habe auf alle Fälle vor, das mit ein paar Microcontrollern und einigen Analogen
Bauteilen (Transistoren und Operatiosverstärker) zu machen.
Da das Puls-Pausenverhältnis einstellbar sein soll werde ich das Rechtecksignal
mit einem Microcontroller erzeugen.
1kHz Takt ist hierbei eher langsam.....ich muss überhaupt erst mal überlegen,
wie ich am besten auf diese Frequenz komme.Bisher hatte ich eher das Problem,
nicht hoch genug mit der Frequenz zu liegen.......

Da die PWM-Frequenz bei einer 8-Bit-PWM mit Prescaler1 etwa doppelt
so viele kHz hat wie der Prozessortakt in MHz sollte also ein ca 4MHz Quarz
mit Teilung durch 8 zum Erfolg führen.
(Entweder Timer-Prescaler1 und Teiler beim Prozessortakt durch 8 oder
Prozessortakt 4MHz und Timer-Prescaler 8
Da so ein ATtiny bzw Atmega bevorzugt zwischen 1 und 10MHz getaktet werden sollte
gefällt mir die Lösung mit 4MHz und Timer-Prescaler 8 am besten,
obwohl 0,5MHz und Prescaler1 sicher auch noch schnell genug wäre,
wenn da kein Display dran hängt.

Da der Timer nicht bis 250 sondern bis 256 (0-255) zählt, muss das korrigiert werden
und ein Quarz mit 4,096 MHz eingesetzt werden. (ein absolut handelsüblicher Wert)

Berechnung
Quarz = 4.096 MHz ; Prescaler = 8 ; Timer = 8 Bit ergibt: (512000Hz/1) / (256*2) = 1000Hz

Als Treiber an +-12V will ich ev. einen TC4431 nehmen, eigentlich ein Mosfet-Treiber,
aber der schaltet sehr schön bis zu 30V und kann mit 5V angesteuert werden.wofür
aber hier ein Optokoppler benötigt wird.Ein Motortreiber L293 wäre auch geeignet,
oder vielleicht tuts sogar ein simpler OP, wobei der sogar noch den Vorteil hätte, dass
man noch nicht mal einen Optokoppler braucht....das ist weitere Überlegungen wert!
Da könnte ein (1)  4-fach OP reichen. Einen als Treiber, einer für den positiven max-Wert
einer für den negativen Max-Wert und einer als Inverter zum Messen der
negativen Spannung. (Der Atmega kann ja nur im positiven Bereich von 0 bis 5V messen)
Die Last von 12mA bei 12V an 1k ist dabei eher zu vernachlässigen, aber die Umsetzung
eines 5V TTL-Signals gegen GND auf ein +-12V Rechteck ist gar nicht so trivial,
wie man zunächst meint.......ein OP hat das Problem, dass er nicht ganz auf die
Versorgungsspannung durchschaltet, und hier muss die Spannung aber exakt passen,
genauer gesagt beide Spannungen, weil ja +12V und -12V gegen GND ausgewertet werden.
Die + und -12V kann ein DC-DC-Wandler liefern oder ein entsprechendes Netzteil.
aber hier ist wieder das Problem, dass die Spannungen abgeglichen werden müssen,
weil die Ausgänge nicht ganz bis zur Versorgung durchschalten.
Treiberbausteine wie der TC4431 oder der L293 wiederum schalten zwar noch
schöner als der OP, aber ihre Steuersignale sind auf die Masse des IC bezogen,
also da wo unsere -12V liegen.Es muss also noch irgend eine Umsetzung
zwischen Microcontroller und Treiberbaustein rein, damit der Potentialunterschied
überwunden werden kann.......erst mal wird der OP getestet, der ist ohnehin
schon in der Schaltung und erzeugt das Signal, und wenn das mit dem Pegel
passt bzw anzupassen ist dann reicht das ja schon so. Aber mit einem ordentlichen Treiber
am Ausgang wäre das einfach eleganter gelöst, und so richtig robust und überdimensioniert
solls am Ende auch noch sein, schliesslich läuft diese Messleitung später zusammen mit Leitungen
auf denen womöglich mehrere hundert Ampere per PWM getaktet fliessen in einem Strang!
Das muss man ganz sicher schirmen und schützen!

 Vielleicht betreibe ich ja den OP weiterhin an der ungeregelten Spanung des DC-DC-Wandlers
um ein paar Volt Spielraum zu haben und steuere damit einen TC4432 an (nicht invertierend)
der an geregelten +-12V hängt oder ich baue gleich eine Halbbrücke, wie ich sie auch schon in der
Franzbox drin habe.... aber das ist eigentlich viel zu viel Aufwand.......
Der LT1014 schaltet schon mal ganz gut nach -12V durch, nur am oberen Ende fehlen die
berühmten 0,7V.Das könnte man durch eine Diode in der Masseleitung des +12V-Reglers
kompensieren. Ich habe gerade keinen "Rail to Rail" OP zur Hand, der auch die 24V
Versorgung aushält und von der Pinbelegung passt
Man könnte ja auch Verstärkung und Offset einstellen, aber das finde ich nicht
ganz so ideal.Da führen wieder mal viele Wege zum Ziel! Hier wird sich sicher noch so
manches ändern
. .......mal schauen was bei den Tests rauskommt!


Ja, ja, wieder mal die selben Teile.......ein Atmega....welche Überraschung   ;-)
Aber das ist halt auch wieder mal ein ganz typischer Fall für die Grundschaltung
der Franzbox, und die hat sich mittlerweile sehr gut bewährt, auch wenn ich hier
wegen der Verstärkergeschichte die Schaltung erst mal auf einer Lochrasterplatine
aufbauen werde und ausserdem wieder mal ein Design-Update immer näher rückt
Da werde ich wohl beim nächsten Update der Franzbox-Platine vermutlich vom
Atmega48 bis 168 auf einen Atmega16 oder 32 in SMD umsteigen.
Ich hätte gerne mehr Schnittstellen insbesondere zur Kommmunikation zur Verfügung.
Wie schon mehrfach erwähnt fehlen mir da Ausgänge für RS232, RS485,
sowie die Möglichkeit einer galv.getrennten Spannungsmessung.
und Anschlüsse für I²C und /oder SPI wobei I²C schon machbar ist,
aber (noch) nicht galv.getrennt. Wobei I²C nicht ideal ist sobald die Leitungen länger
werden oder wenn galv.Trennung gefordert wird.(dafür ist I²C eigentlich nicht vorgesehen)
Trotz alledem werde ich aber demnächst noch eine Erweiterung zur bisherigen Franzbox
zu bauen versuchen, wo ein 4-Fach AD-Wandler MCP3428 mit einem I²C Isolator
vom Typ ADUM1250 oder 1251 angesteuert galv.getrennte Messungen ermöglichen soll.
als delta sigma ADC mit programmierbarem "Gain" könnte der MCP3428 sogar Shunts in
einer Auflösung von 62,5µV in 16bit ; 250µV in14bit und 1mV in 12bit auswerten.
falls das in der Praxis tatsächlich so funktioniert wie angepriesen
Mal sehen wie ich das alles zeitlich hinbekomme.......
aber von den bisherigen Platinen habe ich keine mehr, und weil ich die als Prototypen
fertigen liess, ist es eigentlich preislich egal, ob ich wieder mal was ändere oder nicht

Zum Auswerten müssen Ops die Spannung verstärken und über Dioden
Kondensatoren aufladen so dass der max-Wert messbar wird
Die Spannungsmessung und Auswertung macht der Microkontroller, der auch die
Rechteckspannung erzeugt.

In etwa so sollte der Analogteil letztendlich werden.
(Achtung, das ist nur mal ein erster Entwurf mit Bauteilwerten "aus dem Bauch raus")

...........so siehts aus......und der Verstärkerteil funktioniert schon mal grundsätzlich,...nur die Spannung ist
ohne Spannungsregler etwas zu hoch weil der DC-DC-Wandler ein ungeregelter ist, und mit 12V Festspannungsregler fehlt etwa ein halbes Volt. Da muss eine andere Regelung her!
No Problem !.....oder etwa doch????

Update vom 21.01.2013:
Ich hab jetzt hinter den Ausgang des OP noch einen TC4432 drangehängt und
 versorge den mit exakt +12,04 und -12,02V (ausgesuchte 7812 bzw. 7912)
Der OP hängt aber jetzt an der ungeregelten Spannung,damit da noch etwas Reserve zum Verstärken
bzw Umpolen der Meßspannung bleibt. (könnte man auch runterteilen, muss sowieso noch geschehen)
aber ich wollte den vollen Wert haben. zumindest vorerst mal)
Der TC4432 schaltet das nach -12,02 und +11,67V (der OP kam nur auf 11,35 V)
Das ist zwar nicht viel mehr, aber ich liege immerhin schon innerhalb der Spezifikation von 11,5V-12,5V
Das lass ich mal so, bis mir noch was Besseres einfällt.
Eine Halbbrücke aus zwei Mosfet wäre ja der totale "Overkill" !

Andererseits....muss man denn überhaupt gezielt nach -12V schalten? Die negative Halbwelle wird ja
gar nicht belastet.... wieso nicht einfach die Masse eines 24V-Reglers auf -12V beziehen
und die +12V ein und ausschalten.......ein Widerstand nach -12V würde wohl reichen
um den Ausgang sauber nach GND(hier -12V) zu ziehen
Es gibt ja auch Spannungsregler mit Enable-Eingang. Hier würde der endlich mal Sinn machen!

Wie ich oben schon erwähnte könnte ich den 12V-Regler noch etwas "feintunen" mit einer
Schottky-Diode am Masseanschluss. Die Spannungsverluste in den Dioden der Meßschaltung
kann ich im Auswerteprogramm berücksichtigen. das ist jetzt weniger schlimm.
Die Elkos an den Messleitungen reagieren auch noch etwas langsam, da wären wohl 10K
oder 22k als Last die bessere Wahl bzw 100µF statt 220µF.Das stört aber vorerst mal nicht.
Wenn ich oft genug messe, und immer den höchsten Wert nehme, dann könnte man vielleicht
auch auf die Analoge Maximumermittlung verzichten! Einen OP zum invertieren der negativen
Spannung werde ich aber immer brauchen

Update vom 22.01.2013:
Da habe ich was interessantes entdeckt:
(warum denn nicht schon früher?)

http://code.google.com/p/open-evse/        höchst interessant, incl Schaltpläne etc!

....immer wieder interessant, was rauskommt, wenn verschiedene Leute das Selbe erreichen wollen!
Da wurde zunächst auch die OP-Variante probiert! aber mittlerweile ist da ein DG419 im Einsatz.
Das ist ein bidirektionaler Umschalter für Analogsignale, der ein eigenes Massepotential
zum Ansteuern hat! Also einen Eingang auf-12V, den Anderen auf +12V (=Versorgung)
und dann den Ausgang zwischen den beiden Eingängen hin und herschalten
Ideal für diesen Zweck! den Baustein kannte ich noch nicht so genau! Bzw. hätte ich so einen hierfür
eigentlich überhaupt nicht in Betracht gezogen. Scheint aber bestens geeignet zu sein! und ist billig!
Ca. 1,50 Euro, das ist OK ein "richtig guter" OP kommt fast auf 10Euro! Wieder was gelernt!
Der wird sogar ab und zu in meiner Firma verbaut, aber in einer anderen Abteilung,
deswegen war mir der bislang nicht geläufig. Ich habe aber manchmal mit dem DG408 zu tun,
Aber ich wäre nie auf die Idee gekommen, den hier für diesen Zweck einzusetzen.



 Das sind die offiziellen Spannungs-Sollwerte wie sie seit 2001 gültig sind:
(ursprünglich waren die Spannungen 9V 6V und 3V mit +-1V definiert, mit jeweils 1V ungültigem Bereich
zwischen den Sollwerten, das wurde aber irgendwann geändert und etwas enger definiert, 
insofern ist es zweckmäßig, die Auswertung auf die alten Grenzen auszurichten, 
aber die tatsächlichen Signale im "neueren" Bereich zu halten)


minimum
nominal
maximum
Positive Spannung Zustand A (offen)               
11.40
12.00
12.60
Positive Spannung Zustand B  (Auto erkannt)
8.36
9.00
9.56
Positive Spannung Zustand C  (Anforderung)
5.48
6.00
6.49
Positive Spannung Zustand D (mit Lüftung)    
2.62
3.00
3.25
Negative Spannung - Zustände B, C, D, und F
-11.40
-12.00
-12.60


Im Zustand A (Leitung offen) wird die Taktung nach einigen Sekunden abgeschaltet



16 Januar 2013

SAE J1772 bzw IEC61851 Signale auswerten

So, jetzt wirds langsam ernst! Im Rahmen eines Charger-Projekts gilt es,
Steuersignale zu generieren und auszuwerten wie sie auch im Falle von SAE J1772
und IEC 61851 benutzt werden. In diesem ganz besonderen Fall ist es gar nicht das Ziel,
später zu 100% kompatibel mit diesen Normen zu sein, aber wenn man schon so was ähnliches baut,
dann sollte man es so machen, dass man es später auch noch entsprechend anpassen kann.

Diese Signale hat sich jemand sehr schlau ausgedacht und es ist so herrlich analog in seiner
Grundstruktur.Es hat was geniales in seiner Einfachheit, auch wenn es letztendlich nicht
ausreicht umfassende Steuerfunktionen zu übernehmen wie sie mittlerweile benötigt werden
Ich glaube nicht, dass das heute auch noch so festgelegt werden würde,
sondern inzwischen irgendwas in der Art von CAN oder gleich was Drahtloses genommen
würde, so wie das auch schon bei den diversen Erweiterungen dieser Systeme geschehen ist.
Ich will mich hier aber auf die Steuer-Signale beschränken, da gibt es schon genug zu erzählen.

Wer das alles noch ausführlicher lesen will kann hier nachschauen:
http://de.wikipedia.org/wiki/SAE_J1772#Signalisierung
http://de.wikipedia.org/wiki/IEC_62196
....... oder einfach mal SAE J1772  oder  IEC 62196 in einer Suchmaschine eingeben.

grundsätzlich ist der SAE J1772 Stecker in den USA verbreitet und für einphasigen
bzw den in den USA weit verbreiteten 2-phasigen 110/220V Wechselstrom ausgelegt,
während der Stecker nach IEC 62196 Stecker ( bekannt als "Mennekes Stecker")
in Deutschland und Europa üblich ist und für 220/380V Drehstrom ausgelegt ist.
Die Steuersignale sind aber elektrisch die Gleichen, so dass die beiden Systeme zumindest
per Steckeradapter für einen einphasigen Betrieb miteinander kompatibel sind.

Zunächst mal der "Standardfall" die Fahrzeugerkennung am Pilotkontakt CP

Kernstück dieses Steuersignals ist ein Rechtecksignal mit 1kHz und einer Amplitude von
+ und - 12V gegenüber GND, das in der stationären Ladestation generiert wird
Das 1kHz-Signal geht über einen Vorwiderstand von 1kOhm zum Ladestecker.
In der Ladestation wird nun ausgewertet, wie hoch die maximale Spannung der positiven und
negativen Halbwelle ist. (getrennt voneinander)

Wenn nichts angeschlossen ist, ist die Amplitude natürlich jeweils 12V
(oder einfach nur +12V wenn der Rechteckgenerator abgestellt wird. Mehr dazu später)

Fahrzeugseitig befinden sich eine Diode und ein Widerstand von 2,74kOhm (offizieller Wert)
sowie ein weiterer Widerstand von 1,3kOhm der per Relais dem 2,74kOhm-Widerstand
parallelgeschaltet werden kann. (hier gäbe es noch einen Sonderfall wo 270Ohm anstelle des
1,3kOhm Widerstandes parallelgeschaltet werden, aber das erkläre ich ebenfalls später.

Wenn nun das Fahrzeug angesteckt wird, dann belastet der Widerstand von 2,7kOhm
das Signal von 12V an 1kOhm so dass es auf +9V absinkt. Spätestens jetzt
wird der Rechteckgenerator gestartet und es liegt dann ein Rechtecksignal von
+9V und-12V auf der Leitung. -12Vdeshalb, weil durch die Diode nur die positive
Halbwelle belastet wird. Dies hat in erster Linie den Zweck unterscheiden zu können
ob tatsächlich ein Elektrofahrzeug angeschlossen ist oder nur eine ohmsche Last
(z.B. ein Kind mit Schraubendreher bzw ein defektes Gerät oder sonst was).

Aus dem Signal erkennt die Ladestation, dass ein Auto angesteckt wurde,
und das Auto erkennt daraan, dass eine Ladestation angesteckt ist.
Zu diesem Zeitpunkt gehen beide Seiten in Bereitschaft, alle Sicherheitssyseme und dergleichen
können jetzt die Arbeit aufnehmen und alles checken. Erst dann wird im Fahrzeug
ein Relais angesteuert, das  den 1,3kOhm Widerstand dazuschaltet. (macht ca.880 Ohm)
Nun bricht die Positive Spannung ein auf 6V und die Ladestation erkennt, dass das Fahrzeug
bereit ist und schaltet den Ausgang ein. Der zuvor erwähnte Sonderfall mit 270 Ohm
lässt die Spannung auf 3V zusammenbrechen. Das Signalisiert, dass eine Zwangsbelüftung
eingeschaltet werden muss. (nur bei gasenden Akkus, kaum noch gebräuchlich)

Dies ist das einfache Verfahren an Standard-Ladestationen. Eine Art Grundfunktion.
Damit kann man mit max 16A laden bei 120 oder 220V je nach Land und Stromnetz
Hier gilt gewissermaßen die gleiche Begrenzung wie bei normalen Haushaltssteckdosen
Wenn der Ladevorgang beendet ist, dann öffnet das Relais im Auto wieder und die
Ladestation schaltet ab.

Was ich aber hier noch nicht erwähnt habe ist das Puls-Pausenverhältnis der
Rechteckspannung.
Damit signalisiert die Ladestation dem Ladegerät, wieviel Strom maximal entnommen
werden darf.
Je 10% PWM sind das 6A, so dass ein Puls-Pausenverhältnis von je 50%
eine maximale Stromstärke von 30A bedeutet und 80% entsprechend 48A signalisieren.
So kann auch ein wesentlich leistungsfähigeres Ladegerät an einem 16A-Anschluss
betrieben werden ohne dass es zu Problemen kommt und im einfachsten Fall die
Sicherung durchbrennt.
Ein Sonderfall ist ein Verhältnis von 90%PWM. Damit signalisiert die Ladestation,
dass sie für DC-Hochstrom-Laden eingerichtet ist, und dann gelten völlig andere
Regeln und Signale als hier erklärt werden sollen

Damit sind alle Möglichkeiten ausgeschöpft möchte man meinen, aber da gibts noch etwas:
Den "Proximity-Kontakt" Das war ursprünglich nur ein vorauseilender Kontakt zur
Erkennung dass ein Stecker angesteckt wurde. mittlerweile wird aber auch der
Widerstandswert dieser Verbindung zur Masse des angeschlossenen Fahrzeugs
ausgewertet, weil damit das Fahrzeug bzw das Anschlusskabel die maximal zulässige
Stromstärke an die Ladestation melden können. Das ist z.B. bei Verlängerungskabeln
eine äusserst wichtige Funktion, weil die anderen Signale darauf nicht reagieren.
Soweit zu den Signalen...... weiter gehts mit der Hardware!




11 Januar 2013

Das Display läuft!


Das war nicht ganz einfach, aber jetzt funktioniert das Display!





















Diese wunderbaren Frontplatten samt LCD, Schaltern und Buchsen
gibt es derzeit in einem Bastelladen für 9,95€

Das Layout war schnell rausgemessen und ist ganz Benutzerfreundlich

Fehlt nur die passende Ansteuerung des Ganzen.
Ein Atmega steuert das Display an und misst eine Spannung


























Das Ergebnis wird dann noch ausgewertet, umgerechnet und kommentiert

















Hier wird eine Störschleife überwacht bei der elf  Schalter in Reihe
liegen und einen Widerstand über den Öffnern haben.
620 Ohm sind noch zusätzlich in Serie drin, um auch Kurzschlüsse zu erkennen.
Die Schleife wird mit 2,5mA, max 30V bestromt, das sind dann 1,5V an 620 Ohm
und weil die Widerstände über jedem Öffner verschieden sind,
von ca 3k6 bis 10k  kann man aus der Spannung an der Schleife auch noch den
geöffneten Kontakt ermitteln. Das ursprüngliche Problem war dass die
originale Auswerteschaltung die Fehler nicht speicherte und man bei
Wacklern oder durchgescheuerten Kabeln ewig nach dem Fehler suchen musste.
Deshalb der "Aufwand" mit dem Microcontroller. Früher war da einfach nur
eine Spannungsmessung per OP (Fensterdiskriminator) und per Taster
konnte die Schleife auf eine Led-Reihe (mit UAA170, kaum noch zu bekommen)
umgeschaltet werden. Die alte Schaltung muss hier weiter im Einsatz bleiben,
da hängt zu viel sonstiges mit dran, aber diese Überwachung läuft
jetzt ständig nebenher mit und zeigt etwaige Fehler an.
Auch eine Ausgabe von Meldungen über die serielle Schnittstelle zum
Mitprotokollieren wäre mit wenig Aufwand einzubauen.
Apropos Aufwand, die alte Analogschaltung ist so groß wie eine Schuhschachtel!
mit all den Klemmen, Trafos und Relais die da drin sind.

Dieses Programm zu schreiben hat hat sehr viel Spass gemacht!
Vor allem, weil ich das sehr gut als Basis für eine ganz andere Sache verwenden.kann,
oder um es anders auszudrücken ein anderes Projekt praktisch fast das selbe Programm braucht.
Und zwar:

Die Auswertung des Signals wie es bei  SAE J1772 aber auch bei IEC61851 verwendet wird.

Wie funktioniert das?

nun, das ist eine längere Geschichte, deshalb mehr dazu im nächsten Blog






07 Januar 2013

Probleme mit einem 16 x 1 Display

.....Der Weihnachtsurlaub ist vorüber, und ich kann endlich wieder Löten und Schrauben......

Heute habe ich mich mit einem sehr störrischen Display befasst, das ich unbedingt in Gang
bringen wollte, weil ich gerade günstigst an ein paar Frontblenden kommen kann, in denen ein
16 x 1 Display, ein paar Taster und Buchsen drin sind und die Teile geradezu darum betteln
für irgendwas sinnvolles eingesetzt zu werden. Ich hätte da gerade ein paar kleine Projekte
wo die Dinger exakt passen würden.
Aber da war nichts mit "haben wir gleich!!"

 Ich programmiere  mit Bascom, und da muss man halt nehmen was vorgegeben ist
und das Beste draus machen. (eigene LCD-Treiber will ich hier nicht programmieren)

Das Display hat einen KS0066 Chip drauf, der eigentlich 100% Industriestandard kompatibel
sein müsste, aber dieses Display ist offenbar in zwei 8 x 1 Gruppen aufgeteilt.
So soll das Layout enfacher sein, aber nötig wärs nicht. Der Chip könnte mehr!
............billiger Schrott oder so.....was zum Ärgern halt!

Das ist aber in meinem Fall sehr schlecht, weil ich es unbedingt "in einem Rutsch" beschreiben
will, wenn z.B längere Messwerte oder so dargestellt werden sollen.

Ich habe dann mal versucht alle 16 Zeichen zu beschreiben, bzw wollte ich überhaupt
rausfinden wie ich alles positionieren musste um auch die zweite Hälfte zu beschreiben

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Update :  Stop!!!! Nehme alles zurück!!!!
Der "Workaround" funktioniert nicht mehr wenn längere Variablen geschrieben werden!
Das ging wohl rein zufällig mit reinem Text!
Also doch auf zweimal 8 Zeichen aufteilen............
Wäre zu schön gewesen!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
und dabei kam ich eher zufällig auf einen Workaround, den ich hier veröffentliche,
weil das in den diversen Foren offenbar noch keiner so gelöst hat.

Bei den Schreibversuchen fiel mir auf, dass mit bestimmten Einstellungen abwechselnd
erst 8 und dann 16 Zeichen geschrieben wurden.
Ich habe dann das 16 x 1a ausgewählt und einfach immer zweimal hintereinander den Text geschickt.
........und schon gings! Zwar sicher nicht die feine Art, aber es erfüllt seinen Zweck.
So brauche ich Zahlen etc nicht erst mit einem Zeilenumbruch versehen, was wirklich nicht
lustig wäre.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Das war wohl auch der Grund, warum diese Displays in der Wühlkiste gelandet sind!