Translate

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!




Keine Kommentare:

Kommentar veröffentlichen