Hallo Zusammen, wie kann man einen Brushless Motor am besten starten? Am Anfang ist ja noch keine BEMF da um die Rotorlage zu erkennen. Klar ist mir schon mit einem Zwangsdrehfeld. Aber da habe ich festgestellt das der Motor auch mal in die Falsche Richtung anlaufen kann oder er auf einmal stehen bleibt. Vielen Dank. Gruß Steffen
Was hast du denn für eine Ansteuerung und welchen Motor? Mit einem Schema könnten wir dir bestimmt weiterhelfen. Gruss
wenn du immer in eine richtung schaltest, wie soll er dann in die andere anlaufen ? ich hab mich zwar noch nicht mit BLDC im detail beschäftigt aber da du 3 Phasen hast kommt mir das seltsam vor.
Steffen Ha schrieb: > einem Zwangsdrehfeld. Aber da habe ich festgestellt das der Motor auch > mal in die Falsche Richtung anlaufen kann oder er auf einmal stehen > bleibt. Ohne das jemals gemacht zu haben, würde ich diesen Befund mal als Hinweis werten, dass sich das Zwangsdrehfeld dann ganz einfach zu schnell dreht.
Im Einschaltmoment könnte der Rotor schon mal in die falsche Richtung zucken, mehr aber auch nicht. Um falschrum zu laufen, muß schon einiges schief gehen. Oliver
Das ist mir auch schonmal passiert, habe aber keine Lösung dafür gefunden, könnte mir jedoch vorstellen, dass es an den zeitlichen Abständen liegt die an den jeweiligen Motor angepasst werden müssen.
was nutzt du als hardware? gehst du beim anfahren mit voller spannung drauf? Könntest mal PWM duty und zwangskommutierung auf potis oder taster legen und mal bissi rumdrhehen bis die parameter passen. Bemf wird in der zeit auch sicher ignoriert? nicht das die dazwischen funkt.
Ich habe mal einen Schaltplan angehängt. Als Controller nutze ich einen Atmega 168 als Fets N und P Kanal ohne Brückentreiber. Den Timer 1 nehme ich zur Erzeugung der PWM ((8MHZ / Prescaler 1) * OCR1A 400) = 20kHz. Zum Starten lade ich dann in OCR1B = 5.
1 | void manual_commutate(void) |
2 | {
|
3 | switch (Phase) |
4 | {
|
5 | case (0): |
6 | WH_OFF; |
7 | UH_ON; |
8 | SENSE_W; |
9 | Phase++; |
10 | break; |
11 | |
12 | case (1): |
13 | VL_OFF; |
14 | WL_ON; |
15 | SENSE_V; |
16 | Phase++; |
17 | break; |
18 | |
19 | case (2): |
20 | UH_OFF; |
21 | VH_ON; |
22 | SENSE_U; |
23 | Phase++; |
24 | break; |
25 | |
26 | case (3): |
27 | WL_OFF; |
28 | UL_ON; |
29 | SENSE_W; |
30 | Phase++; |
31 | break; |
32 | |
33 | case (4): |
34 | VH_OFF; |
35 | WH_ON; |
36 | SENSE_V; |
37 | Phase++; |
38 | break; |
39 | |
40 | case (5): |
41 | UL_OFF; |
42 | VL_ON; |
43 | SENSE_U; |
44 | Phase = 0; |
45 | break; |
46 | }
|
47 | CntKommutierungen++; |
48 | if (CntKommutierungen > 200) CntKommutierungen = 200; |
49 | }
|
Die Funktion manual_commutate wird in der main alle 200ms aufgerufen bis 30 Kommutierungen erreicht wurden. Dann schalte ich um auf die automatische Kommutierung.
Man koennte den Motor ja mal mit zwei Phasen und kleinem Feld ansteuern und die Spannung in der dritten Spule auswerten...
Deine Hardware-Zusammenschaltung an den Spulenpins und dem PWM Ausgang gefällt mir überhaupt nicht. Wenn du Glück hast, macht die PWM gar nichts, womit die FET was anfangen können. Aber zu versuchen einen Ausgansgpin mit 1K runterzuziehen dürfte nicht besonders von Erfolg gekrönt sein.
Karl Heinz Buchegger schrieb: > Aber zu versuchen einen Ausgansgpin mit 1K runterzuziehen dürfte > nicht besonders von Erfolg gekrönt sein. Ich bin mir jetzt nicht genau sicher, ob du die Schaltung kennst, die ist ansich ja vom Mikrokopter geklaut. Aber auch dann sind 1KOhm schon bisschen klein, das könnte größer sein. Zum eigentlichen Thema: An dem Punkt steh ich auch schon ne Weile und habe keine vernünftige Idee, wie ich das hinbekommen könnte. Mit dem Rückwärts-drehen kenn ich auch, soviel muss da gar nicht schief laufen, aber da zieht der Motor massig Strom. Meine Erfahrung bisher ist, wenn ich die Zwangskommutierung am Anfang ziemlich langsam laufen lasse, um das der Motor überhaupt erstmal anfängt zu drehen, den Duty Cycle höher zu nehmen. Je schneller man bei der Zwangskommutierung wird, umso mehr nimmt man den Duty-Cycle zurück. Dein Anfangs-PWM-Wert von 5 finde ich irgendwie arg niedrig, läuft dein Motor damit, wenn du ihn von Hand anstubst? Also mein BLDC läuft erst am einem PWM-Wert von etwa 20 vernünftig rund, zumindest mit einer Last dran, ohne siehts anders aus. Dennis
Dennis H. schrieb: > Karl Heinz Buchegger schrieb: >> Aber zu versuchen einen Ausgansgpin mit 1K runterzuziehen dürfte >> nicht besonders von Erfolg gekrönt sein. > > Ich bin mir jetzt nicht genau sicher, ob du die Schaltung kennst, die > ist ansich ja vom Mikrokopter geklaut. Finde das 'Original' nicht. Es gibt eine Möglichkeit: Wenn die Pins auf Eingang sind und dort nur der Pullup zu bzw. weggeschaltet wird. > Zum eigentlichen Thema: An dem Punkt steh ich auch schon ne Weile und > habe keine vernünftige Idee, wie ich das hinbekommen könnte. Zeig mal deine Timing Geschichte rundherum. Die 200ms hast du kontrolliert?
Karl Heinz Buchegger schrieb: > Finde das 'Original' nicht. > Es gibt eine Möglichkeit: Wenn die Pins auf Eingang sind und dort nur > der Pullup zu bzw. weggeschaltet wird. > >> Zum eigentlichen Thema: An dem Punkt steh ich auch schon ne Weile und >> habe keine vernünftige Idee, wie ich das hinbekommen könnte. > > Zeig mal deine Timing Geschichte rundherum. > Die 200ms hast du kontrolliert? Sorry. Du bist ja nicht der TO > Dein Anfangs-PWM-Wert von 5 finde ich irgendwie arg niedrig Kommt mir auch sehr wenig vor. Das Drehfeld muss ja zumindest soweit stark genug sein, dass es den Rotor dann auch erst mal mitnimmt.
Karl Heinz Buchegger schrieb: > Finde das 'Original' nicht. > Es gibt eine Möglichkeit: Wenn die Pins auf Eingang sind und dort nur > der Pullup zu bzw. weggeschaltet wird. Na der eine Pin bringt die ganze Zeit einfach die PWM raus. Und die anderen Pins, die direkt mit den Transistoren verbunden sind, schaltet man auf Eingang, wenn man die PWM an den Transistoren anliegen haben will, und wenn nicht, schaltet man auf Ausgang. Eigentlich ne ganz nette Sache, hab ich auch verwendet, funktioniert super, ich habs sogar als aktiven Freilauf genutzt, diese Schaltung also nochmal an die Lowside-fets. Karl Heinz Buchegger schrieb: > Zeig mal deine Timing Geschichte rundherum. > Die 200ms hast du kontrolliert? Ich glaube, du verwechselst mich gerade mit dem TO... :-) edit: ok, da warst du schneller :-) Dennis
:
Bearbeitet durch User
@Dennis H.: Ich habe schon mehrere Duty Cycle zum starten ausprobiert. Von 5 bis 30 habe ich schon alles durch. Nur spielt ja die Zeit bis die nächste Zwangskommutierung kommt auch eine große Rolle. Was hast du da für Zeiten genutzt? Eigentlich müsste sich ja der Duty Cycle erhöhen und die Zeit bis die nächste Kommutierung kommt verringern bis man dann auf BEMF wechselt?
Steffen Ha schrieb: > Was hast du da > für Zeiten genutzt? Also kommt natürlich auch auf den Motor drauf an. Ich habe 7 Polpaare, ich habe als Anfang glaube ich 8ms zwischen den Kommutierungen und ein Duty-Cycle von 60. Ich lasse dann 200 dieser Kommutierung laufen, dann ändere ich den Duty-Cycle auf 40 und die Zeit auf 4ms, dann 2,5ms. Dann nochmal ne Duty-Cycle Änderung auf 30 und 1,8ms. Dann läuft mein Motor in etwa 90% der Fälle problemlos an, aber eben noch nicht immer.. Dennis
@ Karl Heinz Buchegger: Den Timer 2 nehme ich als Uhr. Der erzeugt jede ms einen Interrupt.
1 | volatile uint16_t timer2compa; |
2 | |
3 | ISR(TIMER2_COMPA_vect) |
4 | {
|
5 | /*static uint8_t count = 1;
|
6 | count--;
|
7 | if(count == 0)
|
8 | {
|
9 | count = 1;
|
10 | timer2compa++;
|
11 | }*/
|
12 | timer2compa++; |
13 | }
|
14 | |
15 | void Timer2_init(void) |
16 | {
|
17 | //Timer 2: system clock with 1ms tact
|
18 | TCCR2A |= (1<<WGM21); //CTC-Mode |
19 | TCCR2B |= (1<<CS21) | (1<<CS20); //Prescaler Clock/64 |
20 | //TIMSK2 |= (1<<OCIE2A); //Timer Output Compare Match Interrupt aktivieren
|
21 | OCR2A = 124; //125 - 1 = 124 |
22 | }
|
23 | |
24 | uint16_t SetDelay(uint16_t t) |
25 | {
|
26 | return(timer2compa + t - 1); |
27 | }
|
28 | |
29 | char CheckDelay(uint16_t t) |
30 | {
|
31 | return(((t - timer2compa) & 0x8000) >> 8); |
32 | }
|
1 | Auszug aus der main: |
2 | |
3 | test = SetDelay(100); |
4 | test2 = SetDelay(300); |
5 | |
6 | //Watchdog on
|
7 | wdt_enable(0); |
8 | //WDTCSR = (1<<WDCE) | (1<<WDE); //--> Atmega 168
|
9 | |
10 | |
11 | while(1) |
12 | {
|
13 | wdt_reset(); |
14 | //asm("wdr"); //Watchdog zurücksetzen (Inline-Assembler)
|
15 | |
16 | //---Sollwert errechnen---//
|
17 | if ((rxpwm == 0) || (rxpwm <= unten)) |
18 | {
|
19 | sollwert = 0; |
20 | }
|
21 | else
|
22 | {
|
23 | rechenwert = rxpwm - unten; |
24 | rechenwert = rechenwert * deltaStick; |
25 | sollwert = rechenwert; |
26 | |
27 | if(sollwert > hilfsnenner) |
28 | {
|
29 | /*hilfsnenner++;
|
30 | sollwert = hilfsnenner;*/
|
31 | if(CheckDelay(test2)) |
32 | {
|
33 | hilfsnenner++; |
34 | //sollwert = hilfsnenner;
|
35 | test2 = SetDelay(300); |
36 | }
|
37 | }
|
38 | else
|
39 | {
|
40 | hilfsnenner = sollwert; |
41 | }
|
42 | }
|
43 | |
44 | if(sollwert >= Frequenz) |
45 | {
|
46 | sollwert = Frequenz; |
47 | }
|
48 | //--------------------//
|
49 | |
50 | wdt_reset(); |
51 | |
52 | if(sollwert > START_PWM) |
53 | {
|
54 | TIMSK2 |= (1<<OCIE2A); |
55 | |
56 | if(CntKommutierungen >= 30) |
57 | {
|
58 | OCR1B = hilfsnenner; |
59 | //OCR1B = sollwert;
|
60 | ACSR |= (1<<ACIE); //Analog Comparator Interrupt Enable |
61 | }
|
62 | else
|
63 | {
|
64 | OCR1B = 10; |
65 | //OCR1B = START_PWM;
|
66 | ACSR &= ~(1<<ACIE); //Analog Comparator Interrupt Disable |
67 | if(CheckDelay(test)) |
68 | {
|
69 | manual_commutate(); |
70 | test = SetDelay(100); |
71 | }
|
72 | }
|
73 | }
|
74 | else
|
75 | {
|
76 | PHASE_ALL_OFF; |
77 | ACSR &= ~(1<<ACIE); //Analog Comparator Interrupt Disable |
78 | OCR1B = 0; |
79 | |
80 | TIMSK2 &= ~(1<<OCIE2A); |
81 | timer2compa = 0; |
82 | test = SetDelay(100); |
83 | test2 = SetDelay(300); |
84 | |
85 | CntKommutierungen = 0; |
86 | hilfsnenner = START_PWM; |
87 | }
|
88 | }
|
89 | }
|
:
Bearbeitet durch User
@Dennis H.: Mit welcher Frequenz läuft deine PWM? Hast du eine Strommessung zur "stall detection"?
Zur Zeit noch mit 15KHz, da ich noch mit den internen 8MHz arbeite, aber ich komm an die Grenzen der 8MHz, ab einer gewissen Drehzahl kommt mein Motor aus dem Tritt.. Dennis
@Dennis H.: Ich arbeite auch noch mit 8MHz. Als PWM Frequenz nutze ich 20kHz. Das der Motor aus dem Tritt kommt habe ich noch nicht beobachten können. Jediglich der Start ist noch nicht so schön.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.