BLDC mit uC Anfänger

OP #7448642
Lesenswert?

Guten Tag Zusammen,

ich hoffe ich werde nicht gestinigt, aber ich spiele mit dem MCC für einen PIC18 rum. Im großen Ganzen steuere ich einen BLDC Motor, das klappt auch soweit erstmal. Aber der Motor läuft nicht sauber, er verschluckt regelmäßig "Schritte" weshalb er "wooblet" ? Ich stehe auch grade aufn Schlauch bzgl. der 16 Pole wie ich dies berücksichten muss. Stell ich den Timer auf 1ms und das auf die 6 Schritte ümrechne müsste ich theoretisch auf 10.000rpm kommen. Da bin ich aber weiiiit von weg eher 232 rpm wenn ich die gemessenen 16.8ms pro H1 Impuls umrechne. Bin erst frisch in dem Thema und würde mich auf paar Tipps freuen. Was ist so grundlegent falsch an meinen Code und der Überlegung dahinter ? ( Ja MCC ist blöd und man sollte alles selber machen, aber bis jetzt war immer alles zufahrlässig, den Timer habe ich aus Kontrolle mal als Uhr benutzt und da funktioniert er tadellos)

Die Analoge Schaltung kann ich gerne auch dran hängen.

1
void main(void)
2
{
3

4
    SYSTEM_Initialize();
5
   INTERRUPT_GlobalInterruptEnable();
6
    TMR1_SetInterruptHandler (Timer); 
7
   
8
      
9
    
10
     while(1)
11
    {
12
         
13
        if(ms==0){             
14
            if(PORTAbits.RA0  == 1 && PORTAbits.RA1 == 0 && PORTAbits.RA2 == 1 )
15
            {
16
            LATBbits.LATB5 = 1;   //EN1        
17
            PWM_IN1(1023); //IN1
18
            LATBbits.LATB3 = 1; //EN2           
19
            PWM_IN2(0); //IN2
20
            LATCbits.LATC7 = 0; //EN3            
21
            PWM_IN3(1023);   //IN3
22
            }
23
        }
24
        
25
          
26
        if(ms==1){
27
            if(PORTAbits.RA0 == 1 && PORTAbits.RA1 == 0 && PORTAbits.RA2 == 0 )
28
            {
29
            LATBbits.LATB5 = 1; 
30
            PWM_IN1(1023);
31
            LATBbits.LATB3 = 0;             
32
            PWM_IN2(1023);
33
            LATCbits.LATC7 = 1;            
34
            PWM_IN3(0);
35
            }
36
        }
37
        
38
         
39
         if(ms==2){  
40
            if(PORTAbits.RA0 == 1 && PORTAbits.RA1 == 1 && PORTAbits.RA2 == 0 )
41
            {
42
            LATBbits.LATB5 = 0;            
43
            PWM_IN1(1023);
44
            LATBbits.LATB3 = 1;            
45
            PWM_IN2(1023);
46
            LATCbits.LATC7 = 1;             
47
            PWM_IN3(0);
48
            }
49
        }
50
        
51
         
52
        if(ms==3){
53
            if(PORTAbits.RA0 == 0 && PORTAbits.RA1 == 1 && PORTAbits.RA2 == 0 )
54
            {
55
            LATBbits.LATB5 = 1;           
56
            PWM_IN1(0);
57
            LATBbits.LATB3 = 1;             
58
            PWM_IN2(1023);
59
            LATCbits.LATC7 = 0;             
60
            PWM_IN3(1023);
61
            }
62
        } 
63
        
64
               
65
         if(ms==4){ 
66
            if(PORTAbits.RA0 == 0 && PORTAbits.RA1 == 1 && PORTAbits.RA2 == 1 )
67
            {
68
            LATBbits.LATB5 = 1;             
69
            PWM_IN1(0);
70
            LATBbits.LATB3 = 0;             
71
            PWM_IN2(1023);
72
            LATCbits.LATC7 = 1;              
73
            PWM_IN3(1023);
74
            }
75
        }
76
            
77
        
78
         if(ms==5){
79
            if(PORTAbits.RA0 == 0 && PORTAbits.RA1 == 0 && PORTAbits.RA2 == 1 )
80
            {
81
            LATBbits.LATB5 = 0;             
82
            PWM_IN1(1023);
83
            LATBbits.LATB3 = 1;           
84
            PWM_IN2(0);
85
            LATCbits.LATC7 = 1;              
86
            PWM_IN3(1023); 
87
          
88
            }
89
        } 
90
        
91
        if(ms>=6)
92
        {
93
            ms=0;
94
        }
95
           
96
        
97
        
98
    } 
99
}   
100
    void Timer(void){
101
        ms++;
102
    }
Angehängte Dateien:
#7448645
Lesenswert?

Franz schrieb:

Bin erst frisch in dem Thema und würde mich auf paar Tipps freuen

Du weisst überhaupt nicht, was ein BLDC ist und wie man ihn bedient.

Du glaubst, es wäre ein Schrittmotor.

Nein.

https://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.10.1

Deine Hallsignale kommen an Eingänge, deine 3 Ausgänge steuern die 3 Phasen, und der Motor läuft Vollgas, wenn du die Signale an die (phasenrichtigen) Ausgänge direkt durchreichst, üblich ist 30 Grad Drehwinkel Versatz.

Wenn ich den Code richtig verstehe: lass mal den ganzen ms Kram mit timer, ms++ und if(ms weg, nur die if(PORTAbits.RA0 bleiben mit ihrem Inhalt.

Der Motor dreht sich von alleine und wenn PWM_IN (keine Ahnung was das macht aber klingt ok, wobei PWM_OUT noch plausibler klänge) kleinere Werte als 1024 bekommt dreht der Motor langsamer.

Um die Drehzahl zu REGELN musst du den PWM Wert in Abhängigkeit von der GEMESSENEN Drehzahl nach der GEWÜNSCHTEN Drehzahl per PID Regelalgorithmus ausgucken.

Der Code fehlt noch komplett.

OP #7448657
Lesenswert?

ok, da ware ich komplett auf dem falschen Dampfer. Danke schonmal dafür. Die 6 Schritt habe ich aus dem Datenblatt da sich die Reihnfolge dann wiederholt. Also so habe ich derzeit in einem Durchlauf 60 Grad versatz oder irre ich mich ?

Damit der Motor auf 100% läuft müsste mal hingeschmiert so aus sehen ? Die Drehzahl stuere ich dann über das Tastverhältnis ( Jetzt grade habe ich auf 1Khz 8Bit gschaltet) Passieren tut grade auch nichts außer Pipen :D

1
while(1)
2
    {
3
         
4
                   
5
            if(PORTAbits.RA0  == 1 && PORTAbits.RA1 == 0 && PORTAbits.RA2 == 1 )
6
            {
7
            LATBbits.LATB5 = 1;           
8
            PWM_IN1(255);
9
            LATBbits.LATB3 = 1;            
10
            PWM_IN2(0);
11
            LATCbits.LATC7 = 0;             
12
            PWM_IN3(255);  
13
            }
14
        
15
        
16
          
17
        
18
            if(PORTAbits.RA0 == 1 && PORTAbits.RA1 == 0 && PORTAbits.RA2 == 0 )
19
            {
20
            LATBbits.LATB5 = 1; 
21
            PWM_IN1(255);
22
            LATBbits.LATB3 = 0;             
23
            PWM_IN2(255);
24
            LATCbits.LATC7 = 1;            
25
            PWM_IN3(0);
26
            }
27
       
28
        
29
         
30
          
31
            if(PORTAbits.RA0 == 1 && PORTAbits.RA1 == 1 && PORTAbits.RA2 == 0 )
32
            {
33
            LATBbits.LATB5 = 0;            
34
            PWM_IN1(255);
35
            LATBbits.LATB3 = 1;            
36
            PWM_IN2(255);
37
            LATCbits.LATC7 = 1;             
38
            PWM_IN3(0);
39
            }
40
        
41
        
42
         
43
        
44
            if(PORTAbits.RA0 == 0 && PORTAbits.RA1 == 1 && PORTAbits.RA2 == 0 )
45
            {
46
            LATBbits.LATB5 = 1;           
47
            PWM_IN1(0);
48
            LATBbits.LATB3 = 1;             
49
            PWM_IN2(255);
50
            LATCbits.LATC7 = 0;             
51
            PWM_IN3(255);
52
            }
53
        
54
        
55
               
56
          
57
            if(PORTAbits.RA0 == 0 && PORTAbits.RA1 == 1 && PORTAbits.RA2 == 1 )
58
            {
59
            LATBbits.LATB5 = 1;             
60
            PWM_IN1(0);
61
            LATBbits.LATB3 = 0;             
62
            PWM_IN2(255);
63
            LATCbits.LATC7 = 1;              
64
            PWM_IN3(255);
65
            }
66
        
67
            
68
        
69
         
70
            if(PORTAbits.RA0 == 0 && PORTAbits.RA1 == 0 && PORTAbits.RA2 == 1 )
71
            {
72
            LATBbits.LATB5 = 0;             
73
            PWM_IN1(255);
74
            LATBbits.LATB3 = 1;           
75
            PWM_IN2(0);
76
            LATCbits.LATC7 = 1;              
77
            PWM_IN3(255); 
78
          
79
            }
#7448705
Lesenswert?

Franz schrieb:

scheint nicht perfekt zu laufen mit der berechneten Drehzahl

Es gibt keine Drehzahlberechnung, denn die Drehzahl hängt von der Motorwellenbelastung ab. Nur die Leerlaufdrehzahl kann man je nach Spannung schätzen.

32kHz PWM-Frequenz hat keinen Zusammenhang mit Drehzahl, sondern der PWM duty cycle, z.B. 255 von 1024 also 25%, hat Einfluss auf die Drehzahl.

Und weil du Hallsensoren hast und somit keine BackEMF Erkennung machen musst sind auch 32kHz nicht störend langsam.

OP #7449060
Lesenswert?

Michael B. schrieb:

Es gibt keine Drehzahlberechnung, denn die Drehzahl hängt von der Motorwellenbelastung ab. Nur die Leerlaufdrehzahl kann man je nach Spannung schätzen.

Ich messe an einem Hallsensor eine "Anzeit" von 1,2ms und "Auszeit" auch von 1,2ms. Wie muss ich dies umrechnen für 16 Pole ? Wenn ich die 2,4ms16 rechne und dann 60 1/0,0384 komme ich auf 1562,5 rpm, der Motor ist angegeben mit 6700rpm im Leerlauf :/

Mein uC läuft mit 32Mhz und sollte dies ja eigentlich schaffen.

#7449197
Lesenswert?

Franz schrieb:

Ich messe an einem Hallsensor eine "Anzeit" von 1,2ms und "Auszeit" auch von 1,2ms. Wie muss ich dies umrechnen für 16 Pole ? Wenn ich die 2,4ms16 rechne und dann 60 1/0,0384 komme ich auf 1562,5 rpm, der Motor ist angegeben mit 6700rpm im Leerlauf :/

Massgebend für die Drehzahl des Motors ist die Spannung. Und die Spannung wird bestimmt durch die Pulslänge der PWM und natürlich auch von der Versorgungsspannung.

Mein uC läuft mit 32Mhz und sollte dies ja eigentlich schaffen.

Sicher.

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