Translate

15 Juli 2013

Sekundentakt bzw Uhr mit 4,0960 MHz Quarz

....ein kleiner Sommerloch-Füller......Sekundentakt, auch so kann mans machen:

Wie schon öfter zuvor war wieder mal für ein ganz anderes Projekt
eine halbwegs exakte Zeitmessung gefragt.
Weil hier aber aus verschiedenen Gründen eine klassische Lösung mit einem
"Uhrenquarz" nicht in Frage kam und die Schaltung weiterhin mit
ca 4MHz betrieben werden sollte (wg.PWM) musste eine andere Lösung her.

(es gibt die Möglichkeit, einen 32.768 kHz Quarz als Taktgeber nur für die Uhr
anzuschliessen und den Atmega über den internen Oszillator zu takten, aber
ich kann in diesem Fall mit 1 oder 8 MHz nichts anfangen, ich brauche
einfach ca. 4MHz um eine PWM-Frequenz von etwa 8 kHz zu erhalten)

Bisher habe ich hierzu einfach einen Timer laufen lassen und
die erhaltenen takte gezählt und dann entsprechend in Minuten
umgerechnet. Das ist aber nie wirklich genau geworden, nur so bis
etwa +- eine Minute pro Tag. Es hat zwar locker gereicht, und
war auch absolut ganggenau, nur eben mit fester Abweichung aber
eine wirkliche Uhr wars halt nicht
Diesmal wollte ich das ein bisschen eleganter hinbekommen.
So richtig mit zuvor ausrechnen und dann passts.
Das bisherige Verfahren war gar nicht so schlecht, nur der Abgleich
war nicht so toll gelöst und nicht fein genug, weils halt einfach nicht passte.
Der 4MHz Takt und die Teilung durch 1024 ergeben einfach kein
"Stunden-Kompatibles" Ergebnis, irgend ein Rest bleibt immer.
eine Sekunde pro Stunde macht einfach schon fast eine halbe Minute
pro Tag. Damit kann man heutzutage niemand mehr beeindrucken!
Aus meiner Charger-Steuerung hatte ich noch 4,0960 MHz Quarze übrig.
(da war ein 1,0 kHz Rechteck zu erzeugen)
Das passt hervorragend, weil damit bei einem Prescaler von 1024
eine Taktfrequenz von exakt 4kHz am Timer entsteht. ( 4 * 1,024 = 4,096)
Damit kann man was anfangen, das sind "gerade" Zahlen zum runterteilen.
Ein anderer gängiger Wert der gut geeignet wäre sind 3,6864 MHz.
(ein typischer "Baudratenquarz" mit dem fast alle gängigen Baudraten möglich sind
Der Hauptvorteil des 3,6864 MHz Quarzes wäre eine größere Anzahl an Baudraten
die perfekt passen würden. Damit ergibt sich nach dem Vorteiler 1024
eine Frequenz von 3600Hz am Timer.Das ist auch als Zeitbasis bestens geeignet.

Es kommt halt immer drauf an, was man denn letztendlich haben will.
Ich habe den 4.0960 MHz Quarz genommen, weil ich den ganz einfach schon
da liegen hatte und derzeit die serielle Schnittstelle nicht benötigt wird.
Falls man die serielle Schnittstelle braucht, dann wäre der 3,6864 MHz Quarz auf alle
Fälle vorzuziehen. Die Abweichung der PWM-Frequenz ist normalerweise
das geringere Problem.Da werde ich mir mal ein paar besorgen wenn ich wieder
mal Bauteile bestelle. Ich muss mal eine Liste erstellen, was wofür geeignet ist.
(Baudraten, PWM-Frequenzen und geradzahlige Taktfrequenzen)

erst mal einen Timer initialisieren:

Config Timer2 = Timer , Prescale = 1024          'Konfiguriere Timer2
Enable Timer2
On Timer2 Count_von_timer2

Dann für Ordnung nach dem Einschalten sorgen

Timer2 = 6            '250 Schritte
 'Timer2 = 31        '225 Schritte
Count0 = 0
Countmin = 0
Sek = 0

und das dazugehörige Unterprogramm:

Count_von_timer2:
Timer2 = 6                                 '=250 Schritte mit 4kHz =16Hz
'Timer2 = 31                                   '=225 Schritte mit 3,6kHz =16Hz
Incr Count0
If Count0 >= 16 Then                 ' 16 Schritte = 1 Sekunde
Incr Sek
Count0 = 0
End If
If Sek >= 60 Then
Incr Countmin                            '  "long-Variable, läuft nicht so schnell über....
Sek = 0
End If
Return

So habe ich ein sehr exaktes Sekunden und Minutensignal.
In drei Tagen weniger als eine Sekunde Abweichung! Noch besser als erwartet!
Nachtrag: mittlerweile fast 100Stunden gelaufen, noch immer keine feststellbare Abweichung!
Die Umrechnung in Stunden geschieht im Hauptprogramm,
aber das ist dann eh nur fürs Display. Hier wird intern in Minuten gerechnet,
da gehts eigntlich gar nicht sooooooogenau, aber ich wills diesmal korrekt haben,
auch im Hinblick auf ein demnächst mal aktualisiertes Franzbox-Programm
wo die Genauigkeit der Messungen verbessert werden soll.

Nachtrag: Aber auch mit den 4 MHZ der Franzbox bekäme man einen brauchbaren Takt hin!
.......oder wenn für Arduino-Kompatibilität 8 bzw sogar16 MHz-Quarze eingesetzt würden.
Ich war nur damals einfach noch nicht so weit das anders zu machen.....
Das muss ich bei einem der nächsten Updates mal korrigieren.
Mit 16MHz ist z.B. ein exakter 500Hz Takt möglich  also 125Hz bei 4MHz.
ich habe im Box-Programm aber versucht, die Messung direkt vom Timer aus zu steuern
und habe den Timer deshalb möglichst langsam laufen lassen mit ewa 15 Durchläufen pro Sekunde.
Das funktioniert auch, aber es schafft auch noch ganz andere Probleme auf die ich hier aber nicht
eingehen will. Besser wäre es gewesen, mit 125Hz zu takten und dann die auszuführenden Aktionen
auf den Durchlauf so zu verteilen dass es nicht zu Timimgproblemen kommt.Manche Dinge müssen
nicht gar so oft erfolgen insbesondere das Schreiben ins Display oder Messungen der 12V-Batterie


05 Juli 2013

Drehzahlmessung im IGBT-Controller-Programm (in Bascom)

Wie ich schon erwähnte fehlt in meinem IGBT-Controller noch eine Drehzahlmessung
und Drehzahlbegrenzung.

Als Grundvoraussetzung wird hier ein Taktgeber mit einem Impuls pro Umdrehung
angenommen. (üblich sind meist zwei oder mehr Impulse, aber so ist es noch
besser verständlich, und ich will später die Taktzahl pro Umdrehung ohnehin noch konfigurierbar machen)

Es gäbe da verschiedene Möglichkeiten, die Drehzahl zu erfassen.
Da kommt es halt auch immer darauf an, was man am Ende haben will.
Schnelle Erfassung oder solls sehr genau sein, was hat man an Hardware zur Verfügung

Die einfachste Möglichkeit wäre, in einem festen Zeitfenster die Takte zu zählen.
Das dauert aber zu lange! hier kommt es auf schnellste Reaktion bei Überdrehzahl an.
Dazu muss ich z.B die Zeit zwischen zwei Impulsen messen.
So erfasse ich die Dauer jeder einzelnen Umdrehung! Das ist schon viel schneller!

Im Layout der Miniatur-Franzbox habe ich hierfür einen Interrupt-Eingang zur Verfügung.
Den kann ich nutzen um bei jeder fallenden Flanke am Pin eine Aktion zu starten.
Hier wird der Wert eines Zählers ausgelesen und dann der Zähler wieder auf Null gestellt.
Der Zähler zählt dann quarzgenau weiter und beim nächsten Impuls wiederholt sich das Ganze.

Hier braucht man natürlich auch erst mal einen Zähler, der erst mal initialisiert werden muss

mit
Config Timer1 = Timer , Prescale = 256
wird der eingeschaltet

Dann muss der Interrupt-Eingang initialisiert werden
Config Int1 = Falling
Enable Interrupts
Enable Int1

On Int1 Dzmcalc

Wenn die Bedingung für den Interrupt erfüllt ist, hier eine fallende Flanke am Eingang INT1
dann wird das Unterprogramm Dzmcalc ausgeführt

Dzmcalc:
Imp = Timer1           >>> Die Variable IMP übernimmt den Zählwert des Timers
Timer1 = 0              >>> Der Timer wird wieder auf 0 gesetzt
Return

ein bisschen Theorie: Timer1 beim Atmega168 ist ein 16bit-Timer,
der zählt von 0 bis 65535  Prescale = 256 bedeutet, 256Prozesortakte entsprechen einem
Zählschritt. Der Prozessor läuft mit 4MHz (weil ich damit auf ca. 8kHz PWM-Frequenz komme)
Der Zähler taktet also mit 15625Hz und es würden knapp 4,2 Sekunden vergehen, bis es
zu einem Überlauf kommt. das reicht bis herunter auf 15 U/min.

um jetzt die Frequenz in Hz zu erhalten braucht man nur die Konstante 15625 durch den Zählwert
zwischen zwei negativen Flanken zu teilen.
bei 3000 u/min wären es 50Hz also ca 312 Takte in 1/50 Sekunde
15625 / 312 = 50,08

um eine U/min Anzeige zu erhalten muss man nur als Konstante 60 x 15625 = 937500 nehmen.

.........dann gilt es noch, einen Überlauf des Zählers zu verhindern
da habe ich es mir einfach gemacht und nur im Hauptprogramm die Zeile

If Timer1 > 60000 Then Timer1 = 60000  

eingefügt. das genügt fürs Erste. so geht die Anzeige nicht unter 15 U/min aber das
stört hier nicht weiter. Natürlich kann man das "edler" lösen.
Ein bisschen nachbessern muss ich da noch, damit die Zahl nicht an irgend einem undefinierten
Wert hängen bleibt wenn der Motor steht, oder wenn zwischendurch mal eine
Störung eingefangen wird. Alles machbar........
Eine Kompensation der Programmlaufzeit habe ich auch nicht, das ist hier ebenfalls
bedeutungslos und vernachlässigbar gering

500,0 mHz ergeben eine Anzeige von 29 U/min
1,0 Hz ergibt 59U/min
10 Hz ergibt 599U/min
100Hz ergibt 6009 U/min

das ist vollkommen ausreichend genau ein paar Takte gehen während des Auslesens und
dem anschliessenden Nullsetzen verloren und bei höheren Frequenzen kommt man bereits
in Bereiche wo die Messauflösung spürbar wird. Da Bascom nicht aufrundet
wird die kleinere Zahl angezeigt solange das Ergebnis kleiner ist als die nächste ganze Zahl.
Bei deutlich mehr Takten je Umdrehung wäre ein Prescaler von 64 vorteilhaft.
......das ist mittlerweile schon geändert, so ist die Auflösung bei hohen Drehzahlen besser
allerdings wird weniger als 60 U/min nicht mehr gemessen.aber das ist eh
annähernd Stillstand! wen interessiert das überhaupt!???

Die paar Zeilen habe ich vorhin dem Controllerprogramm hinzugefügt und auf der
Miniatur-Platine erfolgreich getestet. Einen Menuepunkt zum Einstellen der Drehzahlgrenze
muss ich erst noch einfügen aber das geht einfach.Nur zum sauberen Herunterregeln bei
Überdrehzahl muss ich mir noch was einfallen lassen. das muss auch da angreifen wo ich jetzt
schon den Strom bei Überstrom zurückregle. mal sehen obs schnell genug reagiert aber
bei einer einzigen Störung nicht gleich anfängt zu ruckeln oder sonst wie überreagiert.


 Da ist alles drauf was man für einen PWM-Controller braucht!
Hier fällt es gar nicht gleich auf, wie winzig die Platine tatsächlich ist

Das Display ist noch recht provisorisch, da gebe ich einfach die Zahlenwerte der wichtigsten
Variablen und Zwischenwerte aus
Pot127  das "Gaspoti" steht auf dem korrigierten Wert 127 (0-1023)
LEM44  der Wert des LEM-Wandlers nach der Nullpunktkorrektur ( -512  0   512 )
PWM0  Die PWM steht gerade auf  0 (0-255)
Amp68  Die Stromstärke beträgt 68A
max10 Strombegrenzung bei 10A (defaultwert nach Programmierung, bis 600A einstellbar)
N6009  Drehzahl 6009 U/min (eingespeist 100Hz)
ADC546 der echte AD-Wandler-Wert des "Gaspoti" (0-1023)
lo100  nullstellung "Gaspoti"   Offseteinstellung
hi1000 100%-Stellung des "Gaspoti"   Offseteinstellung

Die Meldung Throttle?  Err:1  ist eine Fehlermeldung, weil das "Gaspoti" beim Einschalten
nicht auf Null stand. Hier gibt es mehrere konfigurierbare Grenzwerte und Offseteinstellungen
sowohl beim Start als auch während des Betriebs.
(Nullstellung, Kurzschluss bzw Drahtbruchüberwachung etc.)
und auch eine "IDLE"-Funktion also so was wie eine Start-Stop-Automtik ist mit drauf,
falls man auf die Idee kommt die Servopumpe am Fahrmotor zu betreiben oder
ein Automatikgetriebe verwendet

Schade, dass im Augenblick mein Prüfstand nicht betriebsbereit ist, weil ich gerade ein paar der
Akkus für andere Zwecke brauche.
Unter Laborbedingungen funktionieren alle Ein- und Ausgänge wunderbar, aber
in der Praxis wars dann trotzdem schon maches Mal ganz anders

Die Meldungen im Zusammenhang mit der "IDLE"-Funktion sind mittlerweile auch ein bisschen
überarbeitet so dass sie mehr Sinn ergeben.An ein paar Stellen ist der Ablauf noch nicht
flüssig genug bzw wird gelegentlich das Display gelöscht wenns eigentlich nicht nötig ist.
Ausserdem gibt es jetzt auch einen Schaltausgang für eine Warnleuchte welche anzeigt, dass
der Motor gerade trotz "Idle = On" angehalten wurde.Nach einschalten der "Zündung"
steht der Motor zunächst, wenn man dann "Gas" gibt bleibt die PWM auf einem voreingestellten Mindestwert.Der Motor läuft im Stand weiter. ein Druck auf den Bedienknopf hält den Motor an
Die Warnleuchte geht an und eine Meldung ( "IDLE STOP!! " ) wird in der Statuszeile
angezeigt. Das ganze "IDLE-Zeug" ist eine Spielerei, weil ich einfach mal gerne einen E-Motor
mit einem Automatikgetriebe koppeln möchte. (VW 4-Gang mit Wandlerüberbrückung und
womöglich sogar Fliehkraftkupplung statt Wandler oder eine externe Pumpe und gar kein Wandler...
........momentan noch reine Gedankenspiele,  nichts reell geplantes!!!!)

ein paar Kleinigkeiten fehlen noch, aber das ist nicht so wichtig, reine Kosmetik.
Nach dem Einschalten steht noch nichts in der "Statuszeile"
Irgendwo gibt es einen Überlauf oder so was ähnliches, wenn ich im Idle-Modus 800A simuliere,
das finde ich auch noch, ich habs gerade eben bemerkt, das kommt ja normal nicht vor,
drum fiel es bisher auch nicht auf.(..... mal die Variablen  checken)
 Überhaupt muss ich mal schauen, was dann am Ende noch an Ports frei ist.
So wäre zum Beispiel eine Temperaturanzeige sinnvoll. (hatte ich ja schon mal in der 1.Franzbox)
und weil ich ohnehin gerade mit Drucksensoren zu tun habe, eine Unterdruckmessung und Ansteuerung
einer Saugpumpe für den Bremskraftverstärker bringe ich da auch noch unter wenn die
Anschlüsse reichen.......
Das heb' ich mir aber alles auf für später!

Ich bin jetzt erst mal sehr zufrieden, dass meine Miniatur-Franzbox-Platine bisher
ohne echte Probleme in Betrieb zu nehmen war und alle Komponenten das machen
was sie sollen, wenngleich manches noch verbesserungsfähig ist.
.................und dieses 3,3 Volt Problem nervt ganz gewaltig!




03 Juli 2013

Neues von der Miniatur-Franzbox

....nur ein kleines Update.....
Heute habe ich mal die Funktion des Emus-Displays auf der Platine getestet.
Insbesondere der Eingang der Seriellen Schnittstelle war noch zu testen.
Es hat geklappt! Ich habe da ja nur einen simplen Transistor als Inverter drin.
Leider wieder mal nur ein Test am Simulator, aber das sollte jetzt schon passen!
Beim letzten Praxistest hatte ich es mit einem Optokoppler am Eingang versucht, das lief wunderbar
mit meinem Simulator, aber der Ausgang des Emus-Controllers ist nicht so leistungsfähig
oder halt durch Widerstände geschützt.Für die LED im Optokoppler hat es jedenfalls nicht gereicht
Jetzt funktioniert das auch mit 10k in der Leitung

 Allzuviel musste ich da nicht bestücken.....
ein Atmega328  (Das Programm ist nicht groß, aber der Speicherbedarf für den riesigen
Eingangspuffer, deshalb gehts nicht mit dem Atmega 88 zumindest nicht ohne Optimierung
wozu ich aber gerade keine Zeit und Lust habe)
ein 5V Längsregler + 2 x 100nF
(hier habe ich anstelle des SMD-Teiles einen LP 2950 CZ5 eingebaut,
der braucht gleich ein paar mA weniger.....Atmega + Display brauchen ca 5mA @ 5V,
die Beleuchtung ca 10 mA)
zwei Elkos (einer reicht wohl auch)
Quarz mit zwei Kondensatoren
ein Transistor mit Pull-up und Vorwiderstand als Inverter für RS232
Ein Poti für den Kontrast
Auf der Rückseite noch zwei Suppressor-Dioden
und der Vorwiderstand für die Beleuchtung.
.......ein paar "Stützkondensatoren" à 100nF gehören der Ordnung halber noch drauf,
und ein Pull-Up für die Reset-Leitung, aber es geht auch schon ohne diese Teile

Hier ist zur Abwechslung mal ein blaues Display drin. Ich mag die blauen nicht so sehr, weil
die in heller Umgebung sehr schlecht ablesbar sind. Schwarz auf Grünlich oder schwarz auf weiss
ist da viel besser geeignet. Die sind auch ohne Hintergrundbeleuchtung lesbar, so dass man das Licht
so einstellen kann dass es nachts nicht stört und tagsüber selbst bei direkter Sonne trotzdem
gut ablesbar ist.

Demnächst folgt mal wieder ein Praxistest am EMUS-Controller

.....und dann werd ich da mal mein IGBT-Controller-Programm anpassen.
Da fehlt noch eine Drehzahlmessung und Begrenzung,
das krieg ich auch noch hin...... ursprünglich wollte ich die Drehzahl-Impulse
einfach nur zählen, aber das ist recht ungenau und vor allem langsam so dass ich wohl doch
per Timer die Zeit pro Umdrehung auswerten werde........mal beides testen.....
Einen Interrupt-Eingang (der bisher am Drehgeber verschwendet war weil da nur einer nötig ist)
habe ich bei dieser Platine noch zur Verfügung.

Nachtrag vom 4.7.13:
Die Schaltausgänge (Transistoren, Open Collector) funktionieren auch, und das bisherige
Controller-Programm konnte auch problemlos auf die Platine angepasst werden.
eigentlich musste dazu nur die vom Interrupt-Eingang D.3 auf C.3 verlegte Leitung der
Encoder-Auswertung korrigiert werden.
Den frei gewordenen Interrupt-Eingang D.3 (Int1) habe ich einfach mal mit den Schaltausgängen
verknüpft um diese umzuschalten. Das hat auch geklappt.

Jetzt ist eigentlich alles was auf der Platine vorgesehen ist erfolgreich getestet bis auf den Ausgang
der seriellen Schnittstelle!

Ich muss mir da jetzt noch einen Adapter bauen, um die beiden Analogeingänge und
die Drehzahlimpulse per Bandkabel auf den Micro-match-Stecker einzuspeisen.
Auch der Drehencoder für die Bedienung/Konfiguration könnte über dieses Kabel laufen.
Das ist bereits als Alternative so vorgesehen.(auch bei der "großen" Franzbox)

Aus Sicherheitsgründen (Na ja, ich glaube ja eher nicht dran, das mal auf öffentlichen Straßen zu
betreiben) werde ich hier wohl später auf das gesteckte Bandkabel verzichten
und die Leitungen direkt einlöten. Ein Einsatz als Modellbau-Fahrtregler-Steuerung ist schon viel
wahrscheinlicher! da gehts dann ja nicht sooooooo genau.......der Funktionsumfang ist aber der gleiche.

So weit ist alles bestens, jetzt gehts an die Drehzahlmessung
(ganz gemütlich, ich habe derzeit noch ein paar wichtigere Dinge zu erledigen)