Forum: Mikrocontroller und Digitale Elektronik BLDC mit uC Anfänger


von Franz (kubawu)


Angehängte Dateien:

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
    }

: Bearbeitet durch User
von Michael B. (laberkopp)


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.

: Bearbeitet durch User
von Franz (kubawu)


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
            }

von Sophie T. (sophie_t)


Lesenswert?


von Franz (kubawu)


Lesenswert?

Sophie T. schrieb:
> schon mal hier reingeschaut?

jap, hat mich weitergebracht. Dankeschön, manchmal muss man mal vorn 
Kopf gestoßen haben

Motor dreht jetzt wenn ich ein PWM von 32kHz nehme...scheint nicht 
perfekt zu laufen mit der berechneten Drehzahl, aber die PWM steuerung 
klappt

von Michael B. (laberkopp)


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.

von Franz (kubawu)


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,4ms*16 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.

von Jochen-paul S. (picfan)


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,4ms*16 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.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Franz schrieb:
> Wie muss ich dies umrechnen für 16 Pole ? Wenn ich die
> 2,4ms*16 rechne

Nicht mit der Polzahl sondern mit der Pol*paar*zahl multiplizieren, also 
hier mit dem Faktor 8.

Grüßle,
Volker

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.