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