Hallo Zusammen,
ich betreibe gerade einen BLDC Motor mit 3 Hall Sensoren an einem
Atmega48.
Als Treiber verwende ich "1,5 L298". Die Enable Eingänge steuere ich mit
Soft-PWM an um die Drehzahl des Motors zu regeln.
Ich habe einen Zustandsautomaten geschrieben, der die Anstuerung der
Spulen in Abhängigkeit der Hall-Sensoren durchführt. Das kalppt soweit
auch alles super. Jetzt habe ich versucht, den Motor andersrum laufen zu
lassen. Also habe ich die 6 Ansteuerschritte invertiert. Dreht, aber
irgendwie langsamer als in die andere Richtung.
Das verwirrt mich etwas, da ich mir das so nicht erklären kann.
Was könnte das sein?
Viele Grüße
Hier die beiden Funktionen für CW und CCW. CCW dreht schneller als CW.
BLDC schrieb:> BLDC dreht CCW schneller als CW
Muss man jetzt schon die Worte rechts und links durch
irgendwelche seltsamen englischen Abkürzungen ersetzen?
Muss man nicht, aber UZS und NUZS fand ich nicht so passend. Immerhin
hast du ja auch verstanden was mit CW und CCW gemeint war.
Aber ja, mein Motor kann nicht nur CW und CCW, sondern auch rechts und
links.
Er dreht linksrum schneller als rechtsrum und das kann ich mir nicht so
recht erklären.
Norbert S. schrieb:> Hallsensoren verdreht oder haben ein Timing.
Genau das! (Um nicht "This!" zu schreiben ;-))
Wodurch auch immer verursacht, wird der Motor in die schnellere Richtung
feldgeschwächt. Manche Motoren haben auch konstruktiv bedingt eine
Vorzugsrichtung.
Wenn es wichtig ist, dass er in beide Richtungen gleich schnell dreht
(wobei das ohne Last irgendwie witzlos ist), muss der Zeitpunkt der
Kommutierung richtungsabhängig angepasst werden. Verzögern ist ja
einfach, wenn man früher Kommutieren muss als das Sensorsignal anliegt,
kommt man um einen Beobachter der Rotorposition nicht herum. Im
einfachsten Fall heißt das, die Rotorposition an Hand der zuletzt
aufgetretenen Signale zu extrapolieren.
Norbert S. schrieb:> Hallsensoren verdreht oder haben ein Timing.> In die eine Richtung ist das Timing eben besser.
Gibt's das tatsächlich?
Wird das unter Umständen nur bei bestimmten Motortypen gemacht?
Bis jetzt hatte ich immer mit BLDC zu tun, bei denen es keinen
Unterschied bezüglich Drehrichtung gab.
@ BLDC
Ich sehe in dem Code zwar eine Umschaltung der In-Eingänge (das es sich
darum handelt, schliesse ich daraus, das Du von der Steuerung der
Enables durch eine PWM schreibst), aber keine Abschaltung der PWM der
jeweils dritten Wicklung.
Hast Du die tatsächlich an den Wicklungen liegenden Pegel mit dem Oszi
nachgeprüft? Der vollständige Code und der Schaltplan wäre vielleicht
hilfreich. (Du müsstest eigentlich auch 1 1/2 L298 gebrauchen, richtig)?
Erwin D. schrieb:> Norbert S. schrieb:>> Hallsensoren verdreht oder haben ein Timing.>> In die eine Richtung ist das Timing eben besser.>> Gibt's das tatsächlich?
Warum nicht? Ist bei Gleichstrommotoren ja auch oft so.
> Bis jetzt hatte ich immer mit BLDC zu tun, bei denen es keinen> Unterschied bezüglich Drehrichtung gab.
Hatten die denn überhaupt Sensoren? Bei einem sensorlosen Motor hast du
schließlich gar keine Sensoren, die du verdrehen könntest, um dem Motor
eine Vorzugsrichtung geben zu können.
Hallo, danke für die Antworten!
Ich komme leider erst jetzt wieder zum basteln.
Gruebler schrieb:> Ich sehe in dem Code zwar eine Umschaltung der In-Eingänge (das es sich> darum handelt, schliesse ich daraus, das Du von der Steuerung der> Enables durch eine PWM schreibst), aber keine Abschaltung der PWM der> jeweils dritten Wicklung.
Ist das nötig? Ich ging davon aus das die dritte Wicklung egal ist,
solange ich die anderen beide beachte? Zuminest versteh ich das DB so.
Das X steht doch für don't care, oder?
Gruebler schrieb:> Hast Du die tatsächlich an den Wicklungen liegenden Pegel mit dem Oszi> nachgeprüft? Der vollständige Code und der Schaltplan wäre vielleicht> hilfreich. (Du müsstest eigentlich auch 1 1/2 L298 gebrauchen, richtig)?
Die Spannungen sehen soweit ok aus. 24V Amplitude und ca 120°
verschoben. (hab nur 2 Oszi Kanäle)
Ja, es sind 1,5 L298 in Verwendung.
Schaltplan habe ich leider keinen, aber die Beschaltung ist 1:1 so, wie
es im Code steht.
Interessanterweise habe ich was rausgefunden.
Bei CCW beträgt die Stromaufnahme nur 450mA, bei CW gleich mal doppelt
so viel!
Da muss doch der Fehler liegen.
Code hänge ich an
Moin,
Mach mal bei jedem State die Enable für die nicht genutzte Phase aus.
Für die genutzten natürlich dann immer an.
Die nicht genutzte Phase muss offen sein und nicht irgendwas von gerade
vorher.
Eigentlich müsste das aber in beide Richtungen gleich beschissen
funktionieren, so wie Du das umgesetzt hast.
Gruß,
Norbert
Norbert S. schrieb:> Eigentlich müsste das aber in beide Richtungen gleich beschissen> funktionieren, so wie Du das umgesetzt hast.
Das würde mich ja auch nicht so sehr wundern, aber in die eine Richtung
geht es recht flüssig, in die Andere eben nicht.
Also EN jeweils abschalten und die ungenutzte Phase als Eingang mit
aktivierten Pull-Ups?
Danke und viele Grüße
Moin,
Enable aus.
Die ungenützte Phase ist H oder L, wenn der Enable aus ist ist sie offen
am L298.
Wenn der Pull-up an ist, wäre die Phase H, wenn der Enable an ist.
Ist der Enable aus, ist es wurscht.
Gruß,
Norbert
Rolf Magnus schrieb:> Erwin D. schrieb:>> Norbert S. schrieb:>>> Hallsensoren verdreht oder haben ein Timing.>>> In die eine Richtung ist das Timing eben besser.>>>> Gibt's das tatsächlich?>> Warum nicht? Ist bei Gleichstrommotoren ja auch oft so.>>> Bis jetzt hatte ich immer mit BLDC zu tun, bei denen es keinen>> Unterschied bezüglich Drehrichtung gab.>> Hatten die denn überhaupt Sensoren? Bei einem sensorlosen Motor hast du> schließlich gar keine Sensoren, die du verdrehen könntest, um dem Motor> eine Vorzugsrichtung geben zu können.
Also ich bitte dich :-)
Ich kann gerade so noch 3 Drähte von 8 Drähten unterscheiden.
Und die Software, die eine Kommutation durchführt und dazu die Halls
abfragt, sieht auch anders als eine sensorlose Kommutation aus. Und und
und...
Kurzum: Ja, ich bin sicher, daß die Motoren Hallsensoren hatten :-)
Danke, jetzt rennt er in beide Richtungen gleich schnell!
Stromaufnahme ist gesunken auf 175mA (beide Richutungen).
Allerdings habe ich jetzt das Problem, dass ich ihn nicht mehr in der
Geschwindigkeit regeln kann ;(.
Wie könnte ich das am Besten lösen?
Ich hänge den aktuellen Code nochmal mit an, habe ENA1, ENB1 und ENA2 in
ENU, ENV, ENW umbenannt, liest sich gleich viel besser.
Harald W. schrieb:> BLDC schrieb:>>> BLDC dreht CCW schneller als CW>> Muss man jetzt schon die Worte rechts und links durch> irgendwelche seltsamen englischen Abkürzungen ersetzen?
Ich bin mir ziemlich sicher,dass die meisten wissen wofuer die
Abkuerzungen "CW" und "CCW" stehen aber fuer die,die noch am raetseln
sind (was weiter auch nicht schlimm ist):
CW = clockwise (im Uhrzeigersinn)
CCW = counterclockwise/anticlockwise (gegen den Uhrzeigersinn)
Ich habe es mit der PWM jetzt hinbekommen, leider brummt der Motor im
PWM Betrieb ganz schön. Bei 100% läuft er sehr sehr ruhig.
Wenn ich die PWM abdrehe, dann steigt auch die Stromaufnahme sofort auf
350mA statt der 175mA im 100% Betrieb.
Ich hänge den Code noch mal mit an, eventuell seht ihr ja das Problem.
Viele Grüße und Danke für die vielen hilfreichen Antworten.
>Allerdings habe ich jetzt das Problem, dass ich ihn nicht mehr in der>Geschwindigkeit regeln kann ;(.
Du machst da zwar eine mässig gute Soft PWM,
nur mässig gut weil die Häufigkeit der Ausführung durch die
Wandlungsdauer des ADCs massgeblich bestimmt wird. Das wird auf deinem
AVR wohl nicht so besonders schnell sein.
aber vor allem machst Du die Ausführung dieser PWM sofort zunichte indem
du direkt danach
CW();
aufrufst wo ENU, ENV und ENW sofort überschrieben werden.
Die beiden Signale ENU nach Motorstellung und ENU nach PWM müssen
logisch verundet werden damit das prinzipiell laufen kann.
Wie man die PWM Frequenz evtl. höher schrauben kann hängt davon ab ob Du
vom ADC noch andere Kanäle verwenden willst und wofür.
viel Erfolg
hauspapa
Moin,
Der ganze Schrott besteht vermutlich nur aus Jitter bei der Ansteuerung.
- Sinnlos alle Hallsensoren pollen für die Kommutierung
- Darauf noch eine Soft-PWM
Rechne mal aus, wie zufällig da kommutiert wird.
Sehe ich das etwa richtig, daß die PWM 16MHz 256 8 / 100 = 78Hz
rumkriecht?
Das kann nicht Dein Ernst sein.
Diese Software ist irreparabel, setze das nochmal komplett neu an.
Mit Soft-PWM wird das sowieso nichts brauchbares.
Gruß,
Norbert
Eine kleine Anmerkung noch:
Wenn du alles volatile dekarierst machst Du dem Compiler die Arbeit
unnötig schwer. Nach meinem (durchaus bescheidenen) Verständnis ist das,
so wie der Code dasteht, nur für "PWMCounter" nötig.
Wenn die Flaschenhälse raus sind kann man ja auch mal Optimierung mit o2
oder o3 probieren. Obwohl es da vermutlich nicht viel zu optimieren
gibt.
Moin,
Das kann so nicht funktionieren.
Die PWM-Frequenz ist viel zu langsam.
Das kriegt man mit Soft-PWM vielleicht hin aber nicht so primitiv.
Besser wäre Hardware-PWM, was der Controller durchaus hergibt.
Gruß,
Norbert
@ BLDC
Na gut.
Der Lerneffekt war ja erstmal, dass die Enable der nicht benutzten Phase
abgeschaltet werden; und X nicht don't care sondern "don't bestrom"
heisst.
Siehe meinen Beitrag "Re: BLDC dreht CCW schneller als CW?" und
Norberts nachfolgenden Post, der meinen Hinweis nochmal in eine
Anweisung umformuliert hat. (Tut mir leid Norbert, aber mein Ego braucht
das. Danke).
Jetzt machst Du das nochmal von vorne und nun, in dem Du die
Hall-Sensoren per Interrupt erledigst und die PWM mit dem PWM-Modus
eines der Timer. Dann klappt das auch schon rund.
Die 78Hz, da hat Norbert ganz recht, sind zu langsam. Da würde ich als
Motor auch rumwürgen.
Und in meinem letzten Post habe ich diesmal Norbert paraphrasiert.
Hoffe das gleicht die Bilanz ein wenig aus. :-)