Ich hab mal was kleines in C++ geschrieben um den Spaß zu Simulieren und zu versuchen es zu versthen:
Code:
#include <iostream>
#include "..\GITFrameworkW32.h"
using namespace std;
int main()
{
int esum=0;
int ist[6]={9,10,8,1,15,20};
int e;
int y;
int Kp=5;
int Ki=5;
int Kd=5;
int Ta=5;
int soll=15;
int ealt=0;
for(int i=0;i<6;i++){
e=soll-ist[i];
esum += e;
y=Kp*e+Ki*Ta*esum+Kd*Kd*(e-ealt)/Ta;
ealt = e;
git_printf("Soll Wert: %i\r\nIst Wert: %i\r\nRegel Wert: %i\r\n\r\n", soll, ist[i], y);
}
return 0;
}
An dem GIT Kram nicht stören, das ist eine Oberfläche von der Hochschule, so ein kleines nettes Fenster das man nich immer in der Konsole arbeitet.
Ausgabe ist:
Soll Wert: 15
Ist Wert: 9
Abweichung: 6
Regel Wert: 210
Soll Wert: 15
Ist Wert: 10
Abweichung: 5
Regel Wert: 295
Soll Wert: 15
Ist Wert: 8
Abweichung: 7
Regel Wert: 495
Soll Wert: 15
Ist Wert: 1
Abweichung: 14
Regel Wert: 905
Soll Wert: 15
Ist Wert: 15
Abweichung: 0
Regel Wert: 730
Soll Wert: 15
Ist Wert: 20
Abweichung: -5
Regel Wert: 625
Wie interpretier ich das jetzt auf mein PWM Signal? Würde ich den spaß auf 8 bit begrenzen würde er ja immer 100% fahren
Oder wo ist der denkfehler?
Edit: Mir fällt grad ein das Kd Ki etc. ausschlaggebend für den Regler sind und ich die willkürlich zum test auf 5 gelegt hab, das kann logischerweise Variieren. Das tu ich gerade mal
Edit2: Bzw wie stell ich den Spaß so ein das ein Sinnvoller PWM wert bei y herrauskommt (den ich ja ggf. Nach oben und unten je nach Bitbreite des Timers begrenzen kann)? Oder liegt der wurm noch wo anders? Ich bin bei "Ist" von einer Drehzahl ausgegangen die von einem Sensor kommt
Lesezeichen