Forum: Mikrocontroller und Digitale Elektronik BLDC Motorsteuerung


von Peter (Gast)


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?

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Ja, es gibt solche Motore, in denen Hall-Sensoren ohne 
Auswert-Elektronik eingebaut werden.

von Peter (Gast)


Lesenswert?

Alles klar danke für die schnelle Antwort. Jetzt ist meine Welt wieder 
heil. Kann ich den IC halt nicht verwenden.

von Karsten B. (karstenbrandt)


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

von Michael L. (hasimaus)


Lesenswert?

@Peter
mal probiert das Signal nur an den (+)-Pin des Verstärkers zu legen?
(-)-Pin gegen Masse. Muß auf jeden Fall ein Widerstand dran, da der 
TB6585 nur bis 3.5V Eingangsspannung an den Pins mag. Ohne Gewähr.

Gruß

von Peter (Gast)


Lesenswert?

@ Michael Leusink
Nein probiert hab ichs noch nicht, werde es Montag aber gleich mal 
versuchen.

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.