Hallo Leute, ich bin momentan dran einen PI-Regler für meinen bürstenbehafteten Gleichstrommotor : Drive System DSMP523 ( inkl. Encoder-Scheibe) zu implementieren. Dazu habe ich ein Mega2560-Board und programmiere dieses in C. Da mein Board via USB mit Matlab kommuniziert lasse ich mir hier die Drehzahlen ausgeben. Zur Überprüfung, ob ich die Flanken der Encoderscheibe richtig einlese, habe ich den Motor einfach angesteurt und mir die Drehzahl ausgeben lassen - hat soweit gut funktioniert -> Interrupts vom Drehgeber sollten richtig empfangen werden. Ich will meinen Motor auf 10 U/min regeln, jedoch macht meine Regelung nicht was sie soll -> siehe Anhang Foto. Mein Code der Regelung sieht wie folgt aus:
1 | ...
|
2 | // Reglerparameter
|
3 | float e = 0; |
4 | float esum = 0; |
5 | float K_p = 10.0 , K_i = 0; |
6 | float u = 0; |
7 | |
8 | for (int i=0;i<Anzahl;i++) |
9 | {
|
10 | RESET_T4(); |
11 | RESET_T5(); |
12 | |
13 | esum = 0; |
14 | |
15 | while (counter4_OVERFLOW < Zeit[i]) // Zeitdauer Zeit[i] des i-ten Prüfzykluses |
16 | {
|
17 | |
18 | if(counter5_OVERFLOW == 5) // alle 100ms |
19 | {
|
20 | float y = ((counter_IMPULSE/5.0)/(counter5_OVERFLOW*20.0))* 60000.0; // Regelgroesse y - Motordrehzahl berechnen |
21 | |
22 | // Drehzahldaten per serieller Schnittstelle versenden
|
23 | if(y==0) |
24 | { uart_puts("N\n"); |
25 | uart_puts("0\n"); |
26 | }
|
27 | else
|
28 | {
|
29 | uart_puts("N\n"); |
30 | uart_puts( dtostrf( y, 10, 3, s ) ); |
31 | uart_puts("\n"); |
32 | }
|
33 | |
34 | e = n_soll[i] - y; // Regelabweichung e |
35 | esum = esum + e; |
36 | |
37 | u = K_p*e + K_i*0.1*esum; // Stellgroesse u |
38 | |
39 | if (u>254.0) {u = 254.0;} // Stellgroessenbegrenzung um wind-up Effekt zu vermeiden |
40 | if (u<0.0) {u = 0.0;} |
41 | |
42 | counter5_OVERFLOW = 0; // Zuruecksetzen des counters |
43 | counter_IMPULSE = 0; // Zuruecksetzen des Impulszaehlers |
44 | }
|
45 | OCR1AL = (int)u; // Berechnete Stellgroesse wird auf Ausgang gelegt |
46 | }
|
47 | |
48 | uart_puts("xxx"); // Befehl um die aktuelle Messreihe abzuschliessen |
49 | uart_puts("\n"); |
50 | }
|
51 | |
52 | uart_puts("End"); // Befehl um die Kommunikation mit Matlab abzubrechen |
53 | uart_puts("\n"); |
54 | |
55 | // Abbremsen des Motors bis zum Stillstand
|
56 | for (int i=(int)u;i==0;i--) |
57 | {
|
58 | OCR1AL--; |
59 | _delay_ms(10); |
60 | }
|
61 | |
62 | OCR1AL = 0; |
63 | |
64 | ...
|
Ich hoffe von euch kann mir jemand helfen, aber ich finde meinen Fehler einfach nicht.