EDAboard.com | EDAboard.eu | EDAboard.de | EDAboard.co.uk | RTV forum PL | NewsGroups PL

Brauche Hilfe bei BLDC Ansteuerung / BEMF

elektroda.net NewsGroups Forum Index - Electronics DE - Brauche Hilfe bei BLDC Ansteuerung / BEMF

Gabriel Schuster
Guest

Wed Jul 14, 2010 12:23 am   



Hi,
ich versuche zur Zeit einen Brushless DC Motor sensorlos also mit Back-
EMF-Feedback zu betreiben.
Ich verwende einen ATmega32M1 und eine selbstgebastelte Treiberstufe; für
die BEMF verwende ich die internen Komparatoren und eine Filterstufe
bestehend aus einem Widerstandsnetzwerk und Tiefpässen (wie in einer
Atmel AppNote beschrieben).

Mein Testmotor hat Hallsensoren, daher kann ich die Signale aus dem
Analog-Comparator mit den echten vergleichen und ich krieg schöne Signale
raus.
Den Motoranlauf hab ich auch schon programmiert und zwar komm ich damit
in einen Drehzahlbereich (~2000rpm), in dem ich ein gutes Feedback-Signal
bekomme (mit einer LED lass ich mir anzeigen, ob eine Richtige Folge von
mehreren AnalogComp-Flanken erfasst wurde).
Parallel dazu mess ich noch den Strom durch den Motor an einem 0.15Ohm
Shunt.

Jetzt zum Knackpunkt: Ich messe die Zeit zwischen zwei Komparator-Flanken
um den nächsten Umschaltzeitpunkt - also den Kommutationszeitpunkt - zu
Berechnen. Und das klappt überhaupt nicht: Hab schon versucht mehrere
Zeiten zu mitteln oder zu sortieren und nur die in der Mitte zu
verwenden, aber egal was ich mach: immer wenn ich vom Hochlauf (in dem
die Delays zwischen den Umschaltzeitpunkten vorgegeben sind) in den
Feedback-Modus (in dem ich den nächsten Umschaltzeitpunkt berechne)
wechsel, wird der Motor stetig langsamer.
Auch bei konstantem oder sogar zu hohem PWM Verhältnis. Hier hätte ich
zumindest erwartet, dass der Motor sich irgendwann schneller dreht, oder
nicht mehr langsamer wird, wenn er durch das hohe PWM Verhältnis stärker
beschleunigt wird, als für die Drehzahl eigentlich benötigt wird.

Wenn ich zu dem berechneten Wert für die Delays einen festen Wert
dazuzähle oder abziehe, werden die Delays schlagartig so klein bzw so
groß, sodass sich das magnetische Feld schneller dreht, als der Stator
des Motors.

Was mach ich nur falsch?

Übrigens das ist kein kommerzielles Projekt oder so, ich mach das nur um
das Prinzip der Motoransteuerung zu verstehen und möchte mein eigenes
Programm dazu schreiben... und vielleicht mal einen Quadrokopter basteln.

Danke für eure Antworten (und fürs lesen Wink)
G.S.

Heiko Nocon
Guest

Wed Jul 14, 2010 8:16 am   



Gabriel Schuster wrote:

Quote:
Mein Testmotor hat Hallsensoren, daher kann ich die Signale aus dem
Analog-Comparator mit den echten vergleichen und ich krieg schöne Signale
raus.

Das ist doch erstmal gut. Wenn das wirklich so ist, dann bedeutet es,
daß das Problem ein reines Softwareproblem darstellt.

Quote:
Jetzt zum Knackpunkt: Ich messe die Zeit zwischen zwei Komparator-Flanken
um den nächsten Umschaltzeitpunkt - also den Kommutationszeitpunkt - zu
Berechnen.

Falscher Ansatz. Das ist einfach keine Regelung. Dementsprechend wird
sich nie ein Gleichgewicht einstellen können.

Quote:
Auch bei konstantem oder sogar zu hohem PWM Verhältnis. Hier hätte ich
zumindest erwartet, dass der Motor sich irgendwann schneller dreht, oder
nicht mehr langsamer wird, wenn er durch das hohe PWM Verhältnis stärker
beschleunigt wird, als für die Drehzahl eigentlich benötigt wird.

Das ist der Denkfehler. Der Umschaltzeitpunkt ist für die sich ergebende
Drehzahl mindestens genauso wichtig wie das PWM-Verhältnis, eher noch
wichtiger, denn sie beeinflußt u.U. auch die Wirkung des PWM-Pulses. Je
nachdem, wann die Umschaltung erfolgt, kann der PWM-Puls nämlich bremsen
oder beschleunigen.

Als erstes muß diese Abhängigkeit aufgebrochen werden, d.h.: die
Umschaltung muß starr an den PWM-Zyklus gekoppelt werden, idealerweise
sollte sie immer in der Mitte der inaktiven Phase erfolgen.

Du brauchst dann zur Erhaltung des Gleichgewichts bloß die Phase der
Ist-Signale mit dem Sollzyklus vergleichen und die Pulsbreite so regeln,
daß das Ist-Signal nach einer Abweichung wieder in Richtung des Soll
wandert.

Schwieriger ist es dann schon, nach einer Änderung der Sollgröße in das
neue Gleichgewicht zu steuern. Hierzu muß beides beeinflußt werden,
Zyklusdauer und Pulsbreite. Als einfachster Ansatz wird zum Bremsen die
Pulsbreite auf Null gesetzt und zum Beschleunigen auf Max. Nachgeregelt
wird dann die Zyklusdauer, bis diese die neue Sollgröße erreicht hat,
dann wechselt man wieder zurück auf die Regelung der Pulsbreite und halt
die Zykluszeit konstant.

Dieser einfache Ansatz ist noch alles andere als optimal, sollte aber
zumindest bei unbelastetem Motor erstmal funktionieren.

wernertrp
Guest

Wed Jul 14, 2010 8:31 am   



On 14 Jul., 01:23, Gabriel Schuster <do...@gmx.net> wrote:
Quote:
Hi,
ich versuche zur Zeit einen Brushless DC Motor sensorlos also mit Back-
EMF-Feedback zu betreiben.
Ich verwende einen ATmega32M1 und eine selbstgebastelte Treiberstufe; für
die BEMF verwende ich die internen Komparatoren und eine Filterstufe
bestehend aus einem Widerstandsnetzwerk und Tiefpässen (wie in einer
Atmel AppNote beschrieben).

Mein Testmotor hat Hallsensoren, daher kann ich die Signale aus dem
Analog-Comparator mit den echten vergleichen und ich krieg schöne Signale
raus.
Den Motoranlauf hab ich auch schon programmiert und zwar komm ich damit
in einen Drehzahlbereich (~2000rpm), in dem ich ein gutes Feedback-Signal
bekomme (mit einer LED lass ich mir anzeigen, ob eine Richtige Folge von
mehreren AnalogComp-Flanken erfasst wurde).
Parallel dazu mess ich noch den Strom durch den Motor an einem 0.15Ohm
Shunt.

Jetzt zum Knackpunkt: Ich messe die Zeit zwischen zwei Komparator-Flanken
um den nächsten Umschaltzeitpunkt - also den Kommutationszeitpunkt - zu
Berechnen. Und das klappt überhaupt nicht: Hab schon versucht mehrere
Zeiten zu mitteln oder zu sortieren und nur die in der Mitte zu
verwenden, aber egal was ich mach: immer wenn ich vom Hochlauf (in dem
die Delays zwischen den Umschaltzeitpunkten vorgegeben sind) in den
Feedback-Modus (in dem ich den nächsten Umschaltzeitpunkt berechne)
wechsel, wird der Motor stetig langsamer.
Auch bei konstantem oder sogar zu hohem PWM Verhältnis. Hier hätte ich
zumindest erwartet, dass der Motor sich irgendwann schneller dreht, oder
nicht mehr langsamer wird, wenn er durch das hohe PWM Verhältnis stärker
beschleunigt wird, als für die Drehzahl eigentlich benötigt wird.

Wenn ich zu dem berechneten Wert für die Delays einen festen Wert
dazuzähle oder abziehe, werden die Delays schlagartig so klein bzw so
groß, sodass sich das magnetische Feld schneller dreht, als der Stator
des Motors.

Was mach ich nur falsch?

Übrigens das ist kein kommerzielles Projekt oder so, ich mach das nur um
das Prinzip der Motoransteuerung zu verstehen und möchte mein eigenes
Programm dazu schreiben... und vielleicht mal einen Quadrokopter basteln.

Danke für eure Antworten (und fürs lesen Wink)
G.S.

Sensorless ist viel komplizierter.
Vor allem der Start oder geringe Drehzahlen.
Auf den BEMF Signalen ist auch jede Menge PWM Störsignal drauf.


http://docs.google.com/viewer?a=v&q=cache:O6lskunoQx8J:www.st.com/stonline/books/pdf/docs/10401.pdf+Sensorless+BLDC

+Controller&hl=de&gl=de&pid=bl&srcid=ADGEESiq_q9-LcAHAVs1D-
dTMNiXGq9dNls0IBzXbrCiqZjCrUUd6PfxuCBwfC7m5RYJrpMcWHcGn2T9rbJU3vjktLH5DxWwxrSBZyT6rxU-

0o6F2ycZjBkpjIGZjdUmconuMvzgSPwO&sig=AHIEtbR6JOt5YxbP5xXHTOdyW5w8tyqtUw

Thomas Kindler
Guest

Wed Jul 14, 2010 11:53 am   



Gabriel Schuster wrote:
Quote:
Hi,
ich versuche zur Zeit einen Brushless DC Motor sensorlos also mit Back-
EMF-Feedback zu betreiben.
Ich verwende einen ATmega32M1 und eine selbstgebastelte Treiberstufe; für
die BEMF verwende ich die internen Komparatoren und eine Filterstufe
bestehend aus einem Widerstandsnetzwerk und Tiefpässen (wie in einer
Atmel AppNote beschrieben).


Würd' ich anders machen:

* Motorwicklungen nur mit Spannugsteiler, ohne Tiefpass,
direkt an die AD-Wandler-Eingänge AD 0,1,2 hängen.

* PWM im Center-Aligned Modus betreiben. Am besten 20kHz,
dann hört man's nicht mehr.

* AD-Wandler synchron zur PWM betreiben, jeweils in der
Mitte des PWM-Pulses samplen. Dadurch sieht man die
Störungen beim Umschalten nicht mehr.

* Auswerten und kommutieren im AD-Wandler-Interrupt machen.

Man muss im Interrupt natürlich geeignet den ADMUX umschalten, damit man
jeweils den richtigen Kanal für Nulldurchgang auswertet. Hin und wieder
möchte man auch die anderen Kanäle (Strom, UBatt, Temp.) lesen, da
bietet sich der Zeitpunkt direkt nach einer Kommutierung an, da man hier
am meisten Zeit hat.

Den virtuelle Mittelpunkt kann man entweder durch Mittelwertbildung von
AD 0,1,2 oder UBatt/2 * PWM berechnen.

Den Strom kann man sogar ohne Shunt abschätzen (für Notabschaltung
reichts), weil man den Spannungsabfall über RDS_on des low-side FETs
messen kann.

Die oft beschreibene 30°-Wartezeit zwischen Nulldurchgang und
Kommutierung kann man bei kleinen hochpoligen Modellbaumotoren oft
weglassen.

--
Thomas Kindler <mail_at_t-kindler.de>

Gabriel Schuster
Guest

Wed Jul 14, 2010 6:18 pm   



Quote:
Auch bei konstantem oder sogar zu hohem PWM Verhältnis. Hier hätte ich
zumindest erwartet, dass der Motor sich irgendwann schneller dreht, oder
nicht mehr langsamer wird, wenn er durch das hohe PWM Verhältnis stärker
beschleunigt wird, als für die Drehzahl eigentlich benötigt wird.

Das ist der Denkfehler. Der Umschaltzeitpunkt ist für die sich ergebende
Drehzahl mindestens genauso wichtig wie das PWM-Verhältnis, eher noch
wichtiger, denn sie beeinflußt u.U. auch die Wirkung des PWM-Pulses. Je
nachdem, wann die Umschaltung erfolgt, kann der PWM-Puls nämlich bremsen
oder beschleunigen.


Ok. Kapiert und 100% zugestimmt!

Quote:
Als erstes muß diese Abhängigkeit aufgebrochen werden, d.h.: die
Umschaltung muß starr an den PWM-Zyklus gekoppelt werden, idealerweise
sollte sie immer in der Mitte der inaktiven Phase erfolgen.


Das hab ich jetzt nicht ganz verstanden: Wie kann ich die
Umschaltzeitpunkte mit dem PWM-Zyklus verbinden? Meinst du damit so eine
Art Tabelle mit PWM-Verhältnis und passendem Kommutationsperiodendelay?

Quote:
Du brauchst dann zur Erhaltung des Gleichgewichts bloß die Phase der
Ist-Signale mit dem Sollzyklus vergleichen und die Pulsbreite so regeln,
daß das Ist-Signal nach einer Abweichung wieder in Richtung des Soll
wandert.

Ok. Dass heißt dann, ich setze ein PWM-Verhältnis&Delay Paar aus der
Tabelle, lass das laufen bis zum nächsten Regel-Event z.B. für 20ms und
vergleiche dann die gemessenen Hall-Sensor Zeitstempel mit dem zu
erwartenden Delay aus der Tabelle, dass ich für dieses PWM-Verhältnis
eingestellt habe. Wenn die zwei voneinander abweichen, setze ich einen
anderen PWM-Zyklus mit passendem Kommutationsdelay.

Richtig soweit?

Gabriel Schuster
Guest

Wed Jul 14, 2010 6:24 pm   



Quote:
Würd' ich anders machen:

* Motorwicklungen nur mit Spannugsteiler, ohne Tiefpass,
direkt an die AD-Wandler-Eingänge AD 0,1,2 hängen.

* PWM im Center-Aligned Modus betreiben. Am besten 20kHz,
dann hört man's nicht mehr.

* AD-Wandler synchron zur PWM betreiben, jeweils in der
Mitte des PWM-Pulses samplen. Dadurch sieht man die Störungen beim
Umschalten nicht mehr.

* Auswerten und kommutieren im AD-Wandler-Interrupt machen.

Man muss im Interrupt natürlich geeignet den ADMUX umschalten, damit man
jeweils den richtigen Kanal für Nulldurchgang auswertet. Hin und wieder
möchte man auch die anderen Kanäle (Strom, UBatt, Temp.) lesen, da
bietet sich der Zeitpunkt direkt nach einer Kommutierung an, da man hier
am meisten Zeit hat.

Den virtuelle Mittelpunkt kann man entweder durch Mittelwertbildung von
AD 0,1,2 oder UBatt/2 * PWM berechnen.


Danke für die Anregung, aber diese Hürden hab ich schon hinter mit: Ich
kann mit meinem Aufbau die Nulldurchgänge erkennen und den Strom über
einen Shunt messen.
Der wirklich knifflige Teil kommt ja jetzt erst, nämlich den Motor
richtig zu regeln und die Umschaltzeitpunkte richtig zu detektieren.

Heiko Nocon
Guest

Wed Jul 14, 2010 9:40 pm   



Gabriel Schuster wrote:

Quote:
Das hab ich jetzt nicht ganz verstanden: Wie kann ich die
Umschaltzeitpunkte mit dem PWM-Zyklus verbinden? Meinst du damit so eine
Art Tabelle mit PWM-Verhältnis und passendem Kommutationsperiodendelay?

Da braucht man zwar eigentlich keine Tabelle für, aber man kann es
natürlich auch mit einer Tabelle machen.

Quote:
Ok. Dass heißt dann, ich setze ein PWM-Verhältnis&Delay Paar aus der
Tabelle, lass das laufen bis zum nächsten Regel-Event z.B. für 20ms und
vergleiche dann die gemessenen Hall-Sensor Zeitstempel mit dem zu
erwartenden Delay aus der Tabelle, dass ich für dieses PWM-Verhältnis
eingestellt habe. Wenn die zwei voneinander abweichen, setze ich einen
anderen PWM-Zyklus mit passendem Kommutationsdelay.

Richtig soweit?

Nein. Du änderst (im eingeschwungenen Zustand) nicht die Zykluszeit,
sondern nur noch das Tastverhältnis. Der genaue Umschaltzeitpunkt ist
Wurscht, solange er nur in der inaktiven Zeit der PWM-Wellenform liegt.

An der Zykluszeit mußt du nur spielen, wenn sich die Solldrehzahl
ändert, denn er hängt allein von der Solldrehzahl ab, nicht von der
Istdrehzahl.

elektroda.net NewsGroups Forum Index - Electronics DE - Brauche Hilfe bei BLDC Ansteuerung / BEMF

Arabic versionBulgarian versionCatalan versionCzech versionDanish versionGerman versionGreek versionEnglish versionSpanish versionFinnish versionFrench versionHindi versionCroatian versionIndonesian versionItalian versionHebrew versionJapanese versionKorean versionLithuanian versionLatvian versionDutch versionNorwegian versionPolish versionPortuguese versionRomanian versionRussian versionSlovak versionSlovenian versionSerbian versionSwedish versionTagalog versionUkrainian versionVietnamese versionChinese version
RTV map EDAboard.com map News map EDAboard.eu map EDAboard.de map EDAboard.co.uk map Opony