mikrocontroller.net

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


Autor: Markus E. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus E. (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.