Moin,
ich hab mir einen kleinen PID Regler mittels Thermistor und 40W 12V Heizpatrone und Nextion Display gebaut.
Solltemperatur stelle ich via Poti ein. (Auf dem Bild in Blau)
Isttemp kommt vom Thermistor. (Auf dem Bild in Rot)
Dann hab ich noch die Reglerausgangsgröße. (Auf dem Bild in Gelb)
Die Reglerausgangsgröße 0-255 schießt ja ständig hin und her. Kann mir jemand sagen wie ich das ganze ein wenig Dämpfen kann?
Für den Thermistor nutze ich das Beispiel: How Easy Is It to Use a Thermistor?! | Arduino Project Hub
Vielen dank.
#define Kp 10 // Proportional
#define Ki 0.1 // Integrierer
#define Kd 1 // Differenzierer
// Thermistor
#define RT0 100000 // Thermistor Widerstand
#define B 3950 // K
#define VCC 4.47 // Versorungsspannung
#define R 100000 // Teilerwiderstand
//Variablen
float RT, VR, ln, TX, T0, VRT;
// --------------------------------
int temp1;
int thermistor1 = A1;
int error = 0;
int lastError = 0;
int regelDiff = 0;
int errorSum = 0;
int errorAlt = 0;
float Ta = 0.06;
int istTemp;
int sollTemp = 50;
int poti = A0;
int potiWert;
byte heizpatrone = 9;
const long interval1 = 100;
unsigned long previousMillis1 = 0;
byte incomingByte[6];
void setup()
{
Serial.begin(9600);
Serial3.begin(9600);
T0 = 25 + 273.15;
}
void loop()
{
potiWert = analogRead(poti);
sollTemp = map(potiWert, 0, 1023, 0, 250);
thermistor();
unsigned long currentMillis1 = millis();
if (currentMillis1 - previousMillis1 >= interval1)
{
previousMillis1 = currentMillis1;
sendNum();
Serial.print("Istwert: ");
Serial.println(istTemp);
Serial.print("Sollwert: ");
Serial.println(sollTemp);
}
PID();
wave();
}
void PID()
{
if (sollTemp > 0)
{
error = sollTemp - istTemp;
errorSum = errorSum + error;
int regelDiff1 = Kp * error + Ki * Ta * errorSum + Kd * (error - errorAlt) / Ta ;
int regelDiff2 = Kp * error + Ki * Ta * errorSum + Kd * (error - errorAlt) / Ta ;
int regelDiff3 = Kp * error + Ki * Ta * errorSum + Kd * (error - errorAlt) / Ta ;
int regelDiff4 = Kp * error + Ki * Ta * errorSum + Kd * (error - errorAlt) / Ta ;
int regelDiff5 = Kp * error + Ki * Ta * errorSum + Kd * (error - errorAlt / Ta );
errorAlt = error;
regelDiff = (regelDiff1 + regelDiff2 + regelDiff3 + regelDiff4 + regelDiff5) / 5;
if (regelDiff > 255) regelDiff = 255;
if (regelDiff < 0) regelDiff = 0;
analogWrite(heizpatrone, regelDiff);
}
else
{
regelDiff = 0;
analogWrite(heizpatrone, regelDiff);
}
}
void thermistor()
{
VRT = analogRead(A1);
VRT = (5.00 / 1023.00) * VRT;
VR = VCC - VRT;
RT = VRT / (VR / R);
ln = log(RT / RT0);
TX = (1 / ((ln / B) + (1 / T0)));
TX = TX - 273.15; // Umwandlung in °C
istTemp = TX;
}