BLDC Motorsteuerung

Gast #1686217
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?
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.