Forum: Mikrocontroller und Digitale Elektronik BEMF BLDC Motor Control Hilfe!


von Markus E. (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich versuche gerade einen BLDC Motor mittels BEMF Verfahren anzusteuern.
Ich verwende einen ATmega32M1 und ein kleines Treiberboard. Die BEMF 
Signale werden in den AnalogComparatoren ausgewertet und sehen auf dem 
Oszi soweit ganz gut aus, wenn ich sie im Programm auf I/Os lege.

Für die Regelung hab ich mir folgendes Konzept ausgedacht:
Nach dem Motoranlauf messe ich Periodendauern in 6 Variablen und zwar 
jeweils von der steigenden Flanke des ersten Komparators bis zur 
nächsten steigenden Flanke des ersten Komparators. Und das selbe für die 
fallenden Flanken sowie für Komparator 2 & 3.

Daraus kann ich mir die Delays zwischen zwei Kommutationen ausrechnen 
(gemittelte Periodendauer / 6).

Die Kommutation erfolgt in einem OutputCompare Interrupt eines Timers. 
In dieser ISR wird dann auch der nächste Interruptzeitpunkt bzw 
Kommutationszeitpunkt festgelegt, basierend auf dem errechneten Wert der 
AnalogComparatoren.


Laut der Theorie müsste ja die Drehzahl des Motors bei konstanter Last 
(oder unbelastet) proportional zum PWM-Duty Cycle sein. Wenn ich aber 
mit dem obigen Konzept vom Motoranlauf (PWM Dutycycle + Delays 
vorgegeben) in den Regel Status wechsle (PWM Dutycycle vorgegeben + 
Delays berechnet mit AnaComp), wird der Motor nicht schneller, wenn ich 
den Dutycycle erhöhe.
Im Gegenteil: ich kann sogar den PWM Dutycyle auf das maximum Erhöhen 
und die Drehzahl bleibt konstant oder geht runter.

Wo liegt der Fehler in meinem Konzept?
In Application Notes habe ich gelesen, dass der Kommutationszeitpunkt 
und der ZeroCross-Zeitpunkt (also meine AnaComp-Flanke) um 30 Grad 
verschoben sind.
In meinem Programm wird der Kommutationszeitpunkt nicht aus dem 
ZeroCross Zeitpunkt errechnet, sondern nur die Delays zwischen zwei 
Kommutationen, kann das vielleicht die Ursache sein?

Ich habe dieses Verfahren bewusst so gewählt, da ich auf dem Oszi 
gesehen habe, dass die Komparatorflanken und die echten Hallsignale (an 
deren Flanken im Idealfall eine Kommutation stattfinden sollte) eben 
nicht um 30 Grad verschoben sind, sondern in der einen Drehrichtung fast 
identisch sind.
Siehe Oszi Bild: Die beiden unteren Signale sind der echte Hallsensor 
und der AnaComp Ausgang auf einem I/O.

Danke fürs Lesen und jede konstruktive Idee!

Gruß
Markus

von Rolf Magnus (Gast)


Lesenswert?

Markus E. schrieb:
> Wo liegt der Fehler in meinem Konzept?
> In Application Notes habe ich gelesen, dass der Kommutationszeitpunkt
> und der ZeroCross-Zeitpunkt (also meine AnaComp-Flanke) um 30 Grad
> verschoben sind.

Das hängt meines Wssens auch ein bischen vom Motor ab.

> In meinem Programm wird der Kommutationszeitpunkt nicht aus dem
> ZeroCross Zeitpunkt errechnet, sondern nur die Delays zwischen zwei
> Kommutationen, kann das vielleicht die Ursache sein?

Aus dem Nulldurchgang zu berechnen, wäre zumindest mal die übliche 
Variante. Du zählst dann die Zeit von der Kommutation bis zum 
Nulldurchang und wartest dann nochmal solange (+Timing) für die nächste 
Kommutation.
Damit hängt die Zeit zwischen zwei Kommutationen davon ab, wie lange der 
Motor gebraucht hat, um zu folgen.
Bei deiner Variante wird sie basierend darauf gewählt, wie schnell der 
Motor bisher gedreht hat. Warum sollte er dann schneller werden?

> Ich habe dieses Verfahren bewusst so gewählt, da ich auf dem Oszi
> gesehen habe, dass die Komparatorflanken und die echten Hallsignale (an
> deren Flanken im Idealfall eine Kommutation stattfinden sollte) eben
> nicht um 30 Grad verschoben sind, sondern in der einen Drehrichtung fast
> identisch sind.

Und in der anderen? Wo kommen die Hall-Sensoren her?

von Markus E. (Gast)


Lesenswert?

Hi Rolf,

> Warum sollte er dann schneller werden?

Danke für die Antwort. Ich werd die Software mal entsprechend 
umschreiben.
Und testen, ob das ganze läuft.

> Und in der anderen? Wo kommen die Hall-Sensoren her?

Es ist ein Motor mit fest eingebauten Hallsensoren.
Mit Drehrichtung im Gegenuhrzeigersinn gilt AC0 = Hall1, AC1 = Hall2, 
AC2 = Hall3
Mit Drehrichtung im Uhrzeigersinn gilt AC0 = Hall2, AC1 = Hall3 und AC2 
=  Hall1

von Markus E. (Gast)


Lesenswert?

Geile Sache! Es läuft :D
Jetzt mach ich mich mal an den PI-Regler für die PWM...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.