Brushless Motor starten, aber wie?

OP #3333350
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
Gast #3333416
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.
OP #3333472
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.
Angehängte Dateien:
#3333599
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.
#3333875
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
#3333886
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?
#3333892
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.
#3333895
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
OP #3333976
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?
#3333984
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
OP #3333989
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren