PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brushlessmotor Controller Softwareablauf



D35troy3r
02.05.2014, 22:27
Hallo,

ich hab mir einen Brushlessmotor Controller auf einem Steckboard mit 3x IR2101(Mosfethalbbrückentreiber), 6x F3205Z(Mosfets) und einem Atmega8A aufgebaut. Kommutierung erfolgt über eine BEMF-Schaltung.
Genauso aufgebaut wie auf dieser Seite: http://www.mikrocontroller.net/articles/Brushless-Controller_f%FCr_Modellbaumotoren#BEMF-Schaltung

Meine Software ist in Bascom geschrieben und funktioniert. Ich weiß nur nicht ob das Glück ist oder ein Denkfehler meinerseits.

Situation bei meinem Aufbau:
-lege Spannung an
-Motor fiept hörbar (obwohl die PWM-Frequenz bei ca 30khz liegt)
-wenn der Motor angestoßen wird dreht er hoch und kann auch belastet werden

Mich hat dieses fiepen verwundert. Das rührt daher das im Stillstand der Komparator ständig auslöst, ununterbrochen. Es werden also alle 6 Zustände durchgeschalten.
In dem Artikel über Brushlesscontroller steht "So, das war jetzt die Beschreibung für einen Motor, der bereits läuft. Bis der Motor allerdings mal dreht, muss man anders vorgehen, weil der stillstehende Motor ja keine Komparator-Interrupts auslöst, da keine BEMF vorhanden ist."
Bei mir scheint allerdings eine BEMF vorhanden zu sein:confused:.

Gut, mal ganz einfach etwas ausprobiert--> Kommutierungszustand 1 eingeschalten. Das heißt Phase A liegt mit dem PWM-Signal an Vcc, Phase B hängt in der Luft und Phase C ist auf GND. Nun hab ich mir bei einem Komparatorinterrupt etwas via UART ausgeben lassen. Wenn ich die in der Luft hängende Phase messe löst ständig der interrupt aus, unabhängig ob der Motor gedreht wird oder nicht. Wenn ich allerdings Phase A messe, funktioniert es. Der Interrupt löst erst aus wenn der Motor mit Hand gedreht wird.
Doch das ist doch falsch?!
Wenn ich nun alles umschreibe und via Admux auf die anderen Phasen (also nicht auf die in der Luft hängenden) umschalte, funktioniert es fast garnicht. Nur mit sehr niedriger PWM bekomm ich ihn von Hand gestartet.

Hoffe das ist irgendwie verständlich geworden ;):confused:.
Mir fehlt auch noch im Programm eine 30Grad verzögerte Kommutierung. Doch bevor ich das in Angriff nehme will ich mir sicher sein keinen Fehler gemacht zu haben.

D35troy3r

derNeue
03.05.2014, 09:37
Ich kann dir bei Bascom nicht wirklich weiter helfen, ich bin in C unterwegs, habe allerdings gerade auch einen BLDC REgler fertig gestellt. Ich nutze auch IR2101. Meine PWM ist 8-bit breit. Ich lade in das PWM-Register den Wert 20, also einen Duty-Cycle von etwa 6-8% zum starten. Mal ein kleiner Tip: Ich bestrome ganz zum Anfang mit diesem niedrigen Duty-Cycle zwei Phasen. Also U und V an PWM, W an Masse, etwa 300ms lang. So zuckt der Motor mal kurz und du hast ihn erstmal in einer festen Position. Dann V einfach wieder unbeschaltet lassen und etwa 20x noch starr kommutieren, mit Timer-Interrupt oder so. Und dann alles laufen lassen. klappt bei mir wunderbar. Natürlich musst du bisschen rumspielen mit ein paar Werten, aber einfach mal als Ausgangspunkt.

Aber ehrlich gesagt ist der Atmega8 nicht wirklich geeignet dafür, der Atmega88 geht da wesentlich besser. Der hat einfach ein paar Timer-Modi mehr, die du für

eine 30Grad verzögerte Kommutierung
gut gebrauchen kannst. Das ist auch ganz einfach gelöst. In der Funktion, in der du die Phasen umschaltest setzt du einen Timer auf Zählerstand 0. Kommt der Komparator-Interrupt, liest du den Zählerstand aus, schreibst diesen Wert in ein OCR-Register und stellst den Timer-Modi auf CTC und mit Top-Wert auf das gerade beschriebene OCR-Register. Ich hoffe, das war halbwegs verständlich, ansonsten frag einfach nochmal nach, was du nicht genau verstanden hast.


Dennis

D35troy3r
03.05.2014, 10:49
Hey,

Danke für die Antwort! :)
Ich hab gestern noch eine Diplomarbeit über Brushlessregler gefunden. Dort gibt es folgenden Abschnitt:


Befindet sich ein Motor im Normalbetrieb, muss die Update-Funktion überprüfen,

ob dieser stehengeblieben ist. Dazu wird der Wert des Timercounter ausgelesen, den
dieser im letzten Kommutierungszyklus erreicht hat (capture-Register). Aus diesem
wird ein gleitender Mittelwert über die letzten 10 Messwerte gebildet. Erreicht dieser
den maximalen Wert des Counters, wurde keine Kommutierung mehr erkannt und der
Motor steht. Es kommt aber auch häufig vor, dass das System unkontrolliert schwingt,
weil bei stehendem Motor die durch eine Kommutierung ausgelöste Umschaltung der
Phasen sofort die nächste Kommutierung auslöst und der Messwert somit ein Minimum,
nämlich die eingestellte Blockierzeitspanne, erreicht. Es muss also auch auf
Erreichen dieses Minimums geprüft werden. Wird erkannt, dass der Motor steht, wird
dieser in den Anlauf-Zustand versetzt.



Sehr gut, somit weiß ich schon mal das kein Fehler vorhanden ist, meine Schaltung jediglich bei einem stillstehenden Motor schwingt.

Echt gute Tipps von dir! :)...die mit der Software werde ich mir sofort mal einfügen. Einen Atmega88 hab ich leider nicht hier, der muss erst bestellt werden.
Doch da das ganze später in SMD aufgebaut werden soll, kaufe ich vorerst keinen atmega88 in DIP.

Die 30Grad Verzögerung teste ich heute mal aus. Ich berichte nachher darüber.

D35troy3r

derNeue
03.05.2014, 14:12
Hast du einen Link zu der Diplomarbeit?

Weil was hier angesprochen wird, sollte man schon auch detektieren, dass der Controller abschaltet, wenn sich der Motor offensichtlich nicht mehr dreht. Mich würde eben interessieren, was so alles an Fehler detektiert werden kann, da hab ich nicht so wirklich eine Vorstellung davon.


Dennis

D35troy3r
03.05.2014, 14:45
http://www8.informatik.uni-wuerzburg.de/fileadmin/10030800/user_upload/quadcopter/Abschlussarbeiten/BLCTRL_Erik_Dilger_DA.pdf

Sehr gute Arbeit von ihm.
Mein Controller schaltet sich nicht ab, lediglich die BEMF Spannung schwingt im Stillstand.

Zu der Verzögerung:
Den CTC Mode habe ich in Bascom leider nicht aktiviert bekommen. Hab das ganze anders gelöst.
-Timer0 misst die Zeit zwischen einer Kommutierung und einem AC-Interrupt
-diese Zeit wird in den Timer1 geladen, dieser löst dann die nächste Kommutierung nach der Zeit aus

Meine Frage wäre jetzt nurnoch, woher weiß ich welche Zeit 30Grad entspricht? Muss ich dazu nicht die Polpaarzahl wissen?

derNeue
03.05.2014, 14:54
Nein, musst du nicht. Für deinen Regler gibts nur die elektrische Umdrehung. Ich habe Motoren mit 7 Polpaaren. Soll heißen, ich benötige 7 elektrische Umdrehungen für eine mechanische. Alle 60 Grad schaltest du auf eine neue Phase(eben die 6 Zustände, die es gibt, hab kein passendes Wort gerade dafür). Und du möchtest genau 30 Grad nachdem der Komparator sich gemeldet hat kommutieren. Somit kannst du die Zeit, die er von der Kommutierung bis zum Komparator-Interrupt braucht, messen. Das ist dann genau die Zeit, die der Motor für 30Grad braucht. Deswegen reicht es zu, diese Zeit einfach nochmal abzuwarten, und dann erst umzuschalten. Die Grad-Angaben beziehen sich alle auf die elektrische Umdrehung. Manche fangen dann an, bei höheren Drehzahlen die Kommutierungszeitpunkt auf 25 oder sogar 20 Grad zu schieben. Ist nicht unbedingt nötig, wäre eben ein zusätzliches Feature, was nicht unbedingt gebraucht wird.


Den CTC Mode habe ich in Bascom (http://www.rn-wissen.de/index.php/Bascom) leider nicht aktiviert bekommen.

Das hat doch mit Bascom nichts zu tun. Das liegt am Atmega8, weil der Timer0 keinen CTC Modus hat. Deswegen ja auch den Atmega88. Oder eben wie du es gelöst hast. Ist umständlich, aber geht. Du kannst aber auch gleich mit dem Timer1 die Zeit messen, da hast du mehr Spielraum, weil der Timer 16bit breit ist.


Dennis

D35troy3r
09.05.2014, 19:12
Okay danke, soweit hab ich alles verstanden. Den Ablauf und alle zusammenhänge :)

Nun bin ich an einem Punkt angekommen einen Atxmega mit AweX zu nutzen. In meinem Versuchsaufbau werden meine drei IR2101 von 6 AweX Pwm-Pins angesteuert.
Damit das funktioniert wurden 3 invertierte AweX Pins erneut invertiert um auf allen 6 Pins die gleichen PWM-Flanken zu erzeugen.
Ausgegeben bekomme ich ein 12Bit 31,6Khz PWM-Signal.

Nun würde ich gerne, soweit es möglich ist, die Ansteuerung des Brushlessmotors komplett über das DMA- und Eventsystem laufen lassen. Da meine Erfahrung diesbezüglich
gleich null ist bräuchte ich eure Hilfe wie der Ablauf sein muss. So richtig weiß ich nicht welches Event was auslösen soll bzw wie ich das DMA benutze :confused:.

Mein Gedanke ist:

1. Analog Comparator auf Event_Ch0
2. Timer1 wird bei jedem Event_Ch0 interrupt ausgelesen und in den Timer2 kopiert (mithilfe vom DMA?), anschließend wird Timer1 gestoppt.
3. Timer2 startet bei einem Event_Ch0 interrupt mit 0 und zählt bis zu dem zuvor reinkopierten "Timer2-Wert"
4. Timer2 interrupt löst das DMA aus, dieses kopiert eine Variable(mit den nötigen Bits für die richtigen Phasen) in das Awexc_outoven Register. Anschließend muss Timer2 wieder von 0 gestartet werden.

Wofür ich keine Lösung habe ist bei dem setzen der Variable damit später die richtigen HS- und LS-Mosfets geschalten werden. Und ein weiterer DMA-Kanal muss das umstellen des AC_Mux Register vornehmen.

Oh Gott, ich Blick das bald nicht mehr :D. Ist es überhaupt möglich einen Brushless-Motor gänzlich mit dem Event- und DMA-System anzusteuern?
Tja also, welcher DMA-Kanal und welcher Event-Kanal muss WAS machen?
Leider gibt es keinen Code: http://www.jtronics.de/avr-projekte/xmega-brushless-controller.html

Vielen Dank im vorraus! :)

derNeue
09.05.2014, 20:17
Also bei ATXmega bin ich raus. Ich möchte zwar auch demnächst einen verwenden, aber bis jetzt habe ich noch keinen in der Hand gehalten, geschweige denn programmiert. Ich denke aber, dass du hier niemanden finden wirst, der dir diesbezüglich helfen kann/will. Ich denke, das musst du allein hinbekommen. Mach halt eins nach dem anderen, also zuerst muss es funktionieren, dann eine kleine Änderung. Funktioniert es immer noch, war die Änderung erfolgreich, funktionierts nicht, musst du nochmal nachbessern. Es hilft vielleicht auch, die Abläufe sich aufzumalen. Allerdings denke ich auch, dass ein ATXmega für einen Brushless Regler bisschen overkill ist.


Dennis

D35troy3r
09.05.2014, 20:23
Mist, ich hab es geahnt lol. Sehr viel habe ich bisher mit einem Atxmega auch noch nicht gemacht, jedoch bin ich von der Leistung bisher sehr überzeugt!
Eben noch entdeckt: Atxmega16d4 für 1,13Euro das Stück bei Voelkner. Ein Atmega88 kostet bei Reichelt 1,80Euro.
Also kann ich auch gleich einen Brushlesscontroller mit dem Atxmega aufbauen und erhalte ein schönes 12Bit 32Khz PWM-Signal.

Falls doch jemand noch eine Idee hat, bitte melden!
Wie gesagt, ich blick das nur nicht mehr mit dem Ablaufplan, welches Event und welcher DMA Kanal wo verknüpft werden müsste.