Forum: Mikrocontroller und Digitale Elektronik Brushless Motor starten, aber wie?


von Steffen H. (stef_fen)


Lesenswert?

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

von Dave C. (dave_chappelle)


Lesenswert?

Was hast du denn für eine Ansteuerung und welchen Motor?
Mit einem Schema könnten wir dir bestimmt weiterhelfen.

Gruss

von Dennis (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Mirco C. (Firma: s@Td) (mcontroller)


Lesenswert?

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.

von Dennis (Gast)


Lesenswert?

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.

von Steffen H. (stef_fen)


Angehängte Dateien:

Lesenswert?

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.

von Flash Gordon (Gast)


Lesenswert?

Man koennte den Motor ja mal mit zwei Phasen und kleinem Feld ansteuern 
und die Spannung in der dritten Spule auswerten...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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
von Steffen H. (stef_fen)


Lesenswert?

@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?

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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

von Steffen H. (stef_fen)


Lesenswert?

@ 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
von Steffen H. (stef_fen)


Lesenswert?

@Dennis H.: Mit welcher Frequenz läuft deine PWM? Hast du eine 
Strommessung zur "stall detection"?

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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

von Steffen H. (stef_fen)


Lesenswert?

@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
Noch kein Account? Hier anmelden.