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

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.