Brauche Hilfe bei BLDC Ansteuerung / BEMF

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 ;)) G.S.

Reply to
Gabriel Schuster
Loading thread data ...

=FCr

le

h

ker

m

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

formatting link
rSBZyT6rxU-

0o6F2ycZjBkpjIGZjdUmconuMvzgSPwO&sig=3DAHIEtbR6JOt5YxbP5xXHTOdyW5w8tyqtUw
Reply to
wernertrp

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

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

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.

Reply to
Heiko Nocon

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
Reply to
Thomas Kindler

Ok. Kapiert und 100% zugestimmt!

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?

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?

Reply to
Gabriel Schuster

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.

Reply to
Gabriel Schuster

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

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.

Reply to
Heiko Nocon

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.