-
-
Neuer Benutzer
Öfters hier
Ok,
erstmal danke für die Antwort(en).
Zu Rage_Empire: Ich habe nicht nur das Forum sondern das ganze INet nach
diesem Thema durchsucht. Also diskrete Regler etc etc etc ...
Zu Volly42:
Ja, das dachte ich eigentlich auch, daß das so funktionieren müsste ....
Hier der PID Code, welcher in einer konstanten Zeit
aufgerufen wird. Sprich für die integration bzw.
differentation wird ein delta t von 1 angenommen,
was ok ist, solange die Abtastzeit konstant ist.
Die Abtastzeit ist hier mit der Zeit zu vergleichen,
die zwischen zwei Aufrufen der PID Funktion liegt.
Als Zeitwert des Aufrufs hab ich schon verschiedene geteste.
10/50/100ms etc. ...
Detailiert :
Zu 2. : Der Regler wird kontinuierlich alle 100ms od. 10ms aufgerufen
Zu 3. : Gute Frage .... Er schwingt eher, bzw. braucht seeehr lange bis der
'auf' macht um vollgas zu geben. Sieht nicht so aus, als daß
er eine Drehzahl hält. Also eben nicht so regelt wie er das sollte
Zu 1. : Ok, hier nun der Sourcecode mit einigen Info's :
Vielleicht hast Du ja hierzu noch eine Ideee ....
Gruß Torsten
---------------
Kp = Verstärkungsfaktor des P Anteils (0-?)
Ki = Verstärkungsfaktor des I Anteils (0-?)
Kd = Verstärkungsfaktor des D Anteils (0-?)
sollwert = 0-255 // 0 = Stillstand / 255 = max. zulässige Drehzahl
istwert = 0-255 // Wird aus dem istwertcnt berechnet, dieser wird durch ICP gespeichert
Y = ist als signed int 32 Bit deklariert
soll und istwert sind jeweils unsigned char (8Bit)
......
// Hier wird nun der Zählwerd der Drehzahlmessung in ein en Wert
// umgerechnet, der dem sollwert entspricht, also 0 - 255
// Zuerst prüfen, ob der Timer1 übergeleufen ist = 0 Umdrehungen pro Sekunde = stillstand
if (istwertcnt >= 62500)
{
istwert = 0;
}
else if (istwertcnt > 50000)
{
// Hier ebenso, nur, wenn der Sollwert auf 0 ist, wird dies auch dem istwert zugeschrieben
// wenn er auch noch minimal
if (sollwert == 0)
istwert = 0;
else
istwert = 1;
}
else
{
istwert = (257 - (istwertcnt/244));
}
// Ermitteln des Fehlersignals
Error = sollwert - istwert;
Error_sum += Error;
if (Error_sum > 32767)
Error_sum = 32767;
if (Error_sum < -32767)
Error_sum = -32767;
// P Anteil - berechnen
Y = Kp * Error;
// I Anteil - berechnen
Y += Ki * Error_sum;
// D Anteil
Y += Kd * (istwert - istwert_alt);
istwert_alt = istwert;
// Begrenzung der Ausgangspegel (auf 16Bit uint)
if (Y < 0)
Y = 0;
if (Y > 0xFFFF)
Y = 0xFFFF;
// PWM ausgeben
OCR2 = (Y>>
;
......
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen