BLDC Motorsteuerung

Gast #1686217
Lesenswert?

Ich verstehe da gerade was nicht. Kann mir jemand helfen? Ich probiere 
mit BLDC-Motoren rum, welche Hallsensoren besitzen. Diese Motoren haben 
3 Hallsensoren, welche entweder High oder Low-Signal ausgeben können. 
Somit sind am Motor auch stets 3 Kabel für die drei Hallsensoren 
vorhanden. Ich dachte bis jetzt, dass das immer so ist. Jetzt habe ich 
aber ICs gefunden ( z.B. TB6585FG ) welche aufeinmal zwei Eingänge für 
jeden Hallsensor haben (einen positiven und einen negativen) alo 
insgesamt 6 Eingänge für 3 Hallsensoren haben. Das ganze wird dann einem 
sog. Hallverstärker zugeführt. Gibt es denn noch andere Motoren, welche 
zwei Kabel pro Sensor haben oder wie soll ich das verstehen?
#1686489
Lesenswert?

Hallo zusammen,

ich hoffe, dass ich hier richtig bin. Ich beschäftige mich auch mit 
BLDC-Motoren. Mein Motor hat allerdings 3 um 120° versetzte 
Hall-Sensoren.
Die Application Note AVR435 von Atmel habe ich versucht nachzuempfinden. 
Der Motor läuft nicht so wirklich rund. Also versuche ich zunächst die 
Software der App.-Note zu verstehen. Im grossen und ganzen durchschaue 
ich das prinzip auch. Aber eine Stelle beschäftigt mich schon seit 
einiger Zeit. Es handelt sich um das Modul mc_drv.c. Dort gibt es eine 
Funktion

void Do_Sensor_interrupt():
1
inline void Do_Sensor_Interrupt(void)
2
{
3
   if ( Sensor_Counter_Up > 3 )
4
   {
5

6
      if (Delay_For_Change != 0)
7
      {
8
         /* Last Delay not finished : Force Change_Sector */
9
         Top_Counter = Mem_Top_Counter;
10
         if (Top_Counter == 0) Top_Counter++; /* to avoid "divide by 0" */
11

12
         Sensor_Counter_Down = Mem_Top_Counter;
13
         Hall_Sector = Mem_Hall_Sector;
14
         /* end Change_Sector */
15
      }
16

17
      /* Filter and memorize the Conuter_Up in the Top_Counter */
18
      Mem_Top_CounterX8 = (((U16)7 * Mem_Top_CounterX8) + (U16)8 * Sensor_Counter_Up) >>3;
19
      Mem_Top_Counter = Mem_Top_CounterX8 >> 3;
20

21
      Sensor_Counter_Up = 0; /* reset the Counter_Up */
22

23
      /* Get the status of the 3 Hall sensors */
24
      /* Hall_Sector = PIND7.PIND6.0.0.0.PINB2.0 */
25
//      Mem_Hall_Sector = ( PIND & ( (1<<PIND7)|(1<<PIND6) ) ) | (PINB & (1<<PINB2)); //MC200
26
      Mem_Hall_Sector = ( PIND & ( (1<<PIND7)|(1<<PIND5) ) ) | (PINC & (1<<PINC6)); //MC100
27

28
      /* arm the Delay_For_Change */
29
      Delay_For_Change = Mem_Top_Counter - ADVANCE;
30

31
   } /* else false interrupt */
32

33
}

Was mir an dieser Funktion überhaupt nicht verständlich ist, ist der 
Filter:
1
 /* Filter and memorize the Conuter_Up in the Top_Counter */
2
      Mem_Top_CounterX8 = (((U16)7 * Mem_Top_CounterX8) + (U16)8 * Sensor_Counter_Up) >>3;
3
      Mem_Top_Counter = Mem_Top_CounterX8 >> 3;

Der Sinn dieses Filters erschliesst sich mit nicht. Versteht vielleicht 
jemand diesen Filter? Warum wird ein zweites mal durch 8 dividiert 
(möglicherweise zur Skalierung)?

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