Pid styrning
-
- Inlägg: 7826
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Pid styrning
Installerade en separat värmebädd till min 3D-skrivare. Jag lödde ihop en styrenhet med en Arduino Mini enIRF530 en 10K pot. en Oled display och en 100K termistor. Fungerar perfekt med Arduino PID rutinen.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Pid styrning
Snyggt!
Om du vill ha det adaptivt så skulle jag rekommendera en MRAS-regulator. På skolan fick jag bygga en sådan inför eleverna.
Det är en "dubbel" I-regulator. Fördelen är att den ställer in sig själv, men den är känslig mot störningar då den saknar D-del.
Eller en Model Predictive Control. Jag har sådan regulator i ANSI C kod som passar inbyggda system. Tolka MPC som en utveckling av PID. Den är bara mer komplex, men den kan hantera fördröjningar bättre.
Om du vill ha det adaptivt så skulle jag rekommendera en MRAS-regulator. På skolan fick jag bygga en sådan inför eleverna.
Det är en "dubbel" I-regulator. Fördelen är att den ställer in sig själv, men den är känslig mot störningar då den saknar D-del.
Eller en Model Predictive Control. Jag har sådan regulator i ANSI C kod som passar inbyggda system. Tolka MPC som en utveckling av PID. Den är bara mer komplex, men den kan hantera fördröjningar bättre.
-
- Inlägg: 7826
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Pid styrning
Jag vet inte så bra hur Arduinos PID funkar i detalj. Men noggrannheten är fullt tillräcklig för att hålla värmen i bädden inom någon grad.
Bifogar programmet om någon är intresserad.
Bifogar programmet om någon är intresserad.
Kod: Markera allt
// library for PID
#include <PID_v1.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//float gain = 0.00488; // Termocouple anv. ej
//float ref = 1.25313; // Termocouple anv. ej
const int GreenLED = 8;
const int RedLED = 2;
const int thermocouplePin = A0; //Termistor anv ist.
int iSetpoint;
int tempResistor;
int Vo; // Holds the ADC Value
float R2, tKelvin, tCelsius, tFahrenheit;
const float Beta = 3974.0;
const float roomTemp = 298.15; // room temperature in Kelvin (25 grader C)
const float Ro = 100000.0; // Resistance of the thermistor at roomTemp
const float R1 = 100300.0; // Resistnce of the known resistor
const int potPin = A1; // Potentiometer input pin
const int ovenPin = 6; // LED output pin
// Tuning parameters
float Kp = 0; // Proportional gain
float Ki = 0.5; // Integral gain
float Kd = 0; // Differential gain
// Record the set point as well as the controller input(y) and output(u)
double Setpoint, y, u;
// Create a controller that is linked to the specified Input, Ouput and Setpoint
PID myPID(&y, &u, &Setpoint, Kp, Ki, Kd, DIRECT);
const int sampleRate = 1; // Time interval of the PID control
void setup(){
//setup serial at 9600 bps
Serial.begin(9600);
//setup LEDs as output
pinMode(GreenLED, OUTPUT);
pinMode(RedLED, OUTPUT);
myPID.SetMode(AUTOMATIC); // Turn on the PID control
myPID.SetSampleTime(sampleRate); // Assign the sample rate of the control
display.begin(SSD1306_SWITCHCAPVCC,0x3C); //OLED address
display.clearDisplay();
}
void loop(){
//-------PID Controller-------
Setpoint = map(analogRead(potPin), 0, 1023, 0, 255); // read and scale the set point
// read the temperature input convert to Celsius degree
//y = (double(analogRead(thermocouplePin)) * gain - ref)/0.005; // Termocouple anv. ej
// rutin för Termistor
Vo = analogRead(thermocouplePin); //eg Termistorpin
R2 = R1 * (1023.0 / (float)Vo - 1.0); // Resistance of the Thermistor
tKelvin = (Beta * roomTemp) /(Beta + (roomTemp * log(R2 / Ro)));
tCelsius = tKelvin - 273.15;
y=tCelsius;
tempResistor = y;
iSetpoint=Setpoint;
myPID.Compute(); // Calculates the PID output at a specified sample time
analogWrite(ovenPin, u); // Send output to oven
//Turn on LEDs according to whether the temperature is within range
if(tempResistor == iSetpoint){
digitalWrite(RedLED, LOW);
digitalWrite(GreenLED, HIGH);
}
if(tempResistor > iSetpoint){
digitalWrite(RedLED, LOW);
digitalWrite(GreenLED, HIGH);
}
else{
digitalWrite(RedLED, HIGH);
digitalWrite(GreenLED, LOW);
}
//Display on Serial Monitor
Serial.print("Temperature: ");
Serial.print(y);
Serial.print("°C, ");
Serial.print("Setpoint:");
Serial.print(Setpoint);
Serial.print(", ");
Serial.print("Output:");
Serial.println(u);
// The tuning parameters can be retrieved by the Arduino from the serial monitor: eg: 0,0.5,0 with Ki set to 0.5.
// Commas are ignored by the Serial.parseFloat() command
if (Serial.available() > 0){
for (int i = 0; i < 4; i++){
switch(i){
case 0:
Kp = Serial.parseFloat();
break;
case 1:
Ki = Serial.parseFloat();
break;
case 2:
Kd = Serial.parseFloat();
break;
case 3:
for (int j = Serial.available(); j == 0; j--){
Serial.read();
}
break;
}
}
Serial.print(" Kp,Ki,Kd = "); // Display the new parameters
Serial.print(Kp);
Serial.print(",");
Serial.print(Ki);
Serial.print(",");
Serial.print(Kd);
Serial.println();
myPID.SetTunings(Kp, Ki, Kd); // Set the tuning of the PID loop
}
// Display ändra till oled
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(108, 0);
display.println("C");
display.setCursor(108, 22);
display.println("C");
display.setTextSize(2);
//display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Bed");
display.setCursor(55, 0);
display.println(tempResistor);
display.setCursor(0, 22);
display.println("SetP");
display.setCursor(55, 22);
display.println(iSetpoint);
display.setCursor(0, 44);
display.println("Outp");
display.setCursor(55, 44);
display.println(u);
display.display();
delay(100); // wait a bit
}
- farbrorvattenmelon
- Inlägg: 259
- Blev medlem: 29 januari 2009, 21:38:21
Re: Pid styrning
Har du ändrat några parametrar från koden ovan?
Ser vid en snabb koll ut som både P och D är satta till 0?
Ser vid en snabb koll ut som både P och D är satta till 0?
Re: Pid styrning
Testa bygg en Model Predictive Control istället eller Model Reference Adaptive System
Model Reference Adaptive System är mycket enklare än Model Predictive Control som kräver en QP-lösare. Jag har en QP-lösare i ANSI C kod som är anpassad för inbyggda system.
Det är ingen svår matematik bakom. Det är bara plus och gånger samt integral-tänk. \(G_m\) är första ordningens dynamik, med andra ord "ramp"-funktion. \(G(s)\) är det okända systemet som vi ska försöka reglera.
Bara hojta till för den som vill lära sig detta.
Model Reference Adaptive System är mycket enklare än Model Predictive Control som kräver en QP-lösare. Jag har en QP-lösare i ANSI C kod som är anpassad för inbyggda system.
Det är ingen svår matematik bakom. Det är bara plus och gånger samt integral-tänk. \(G_m\) är första ordningens dynamik, med andra ord "ramp"-funktion. \(G(s)\) är det okända systemet som vi ska försöka reglera.
Bara hojta till för den som vill lära sig detta.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Pid styrning
Om man skall vara riktigt noga (och det är vi ju på detta forum) så är det inte "Arduino's PID" utan en snubbe som heter Brett Beauregard som skrivit biblioteket.
Lite semantik kanske men äras den som äras bör.
Om du kollar på hans git https://github.com/br3ttb så hittar du även ett biblitek för autotuning av PID värdena dom funkar väldigt bra.
Lite semantik kanske men äras den som äras bör.
Om du kollar på hans git https://github.com/br3ttb så hittar du även ett biblitek för autotuning av PID värdena dom funkar väldigt bra.
Re: Pid styrning
Ser ut som dom ställs via serieporten. Kan ju vara så Lemuren gör.farbrorvattenmelon skrev: ↑11 augusti 2023, 19:21:44 Har du ändrat några parametrar från koden ovan?
Ser vid en snabb koll ut som både P och D är satta till 0?
-
- Inlägg: 7826
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Pid styrning
¨Ja nu märker man att man är i ett elektronikforum. Jag Frågar mig lite försiktigt varför jag skulle lägga ner jobb på att bygga om en lösning som redan fungera bra. Att hålla värmebädden på en 3D-skrivare kan man till och med lösa med en enkel reläfuntion. Mer noga är det inte. Den här lösningen med PID gjorde jag för att det var roligt.DanielM skrev: ↑11 augusti 2023, 20:10:47 Testa bygg en Model Predictive Control istället eller Model Reference Adaptive System
Model Reference Adaptive System är mycket enklare än Model Predictive Control som kräver en QP-lösare. Jag har en QP-lösare i ANSI C kod som är anpassad för inbyggda system.
Det är ingen svår matematik bakom. Det är bara plus och gånger samt integral-tänk. \(G_m\) är första ordningens dynamik, med andra ord "ramp"-funktion. \(G(s)\) är det okända systemet som vi ska försöka reglera.
Bara hojta till för den som vill lära sig detta.
Skärmbild 2023-08-11 200836.png
Re: Pid styrning
Man gör en adaptiv regulator av samma sak som man gör en PID-regulator. Det är roligt
Jag rekommenderar adaptiva regulatorer när det kommer till att hålla temperaturen på stora vattentankar. Där det tar tid att trimma in en PID-regulator. Den adaptiva regulator lär sig trögheten i systemet.
Ska jag vara helt ärlig så är denna MRAS-regulator enklare än en PID-regulator, då en MRAS-regulator är en adaptiv PI-regulator.
För mer information: Adaptive Control av Karl-Johan Åström och Björn Wittenmark, andra upplaga.
Jag rekommenderar adaptiva regulatorer när det kommer till att hålla temperaturen på stora vattentankar. Där det tar tid att trimma in en PID-regulator. Den adaptiva regulator lär sig trögheten i systemet.
Ska jag vara helt ärlig så är denna MRAS-regulator enklare än en PID-regulator, då en MRAS-regulator är en adaptiv PI-regulator.
För mer information: Adaptive Control av Karl-Johan Åström och Björn Wittenmark, andra upplaga.
Re: Pid styrning
"För mer information: Adaptive Control av Karl-Johan Åström och Björn Wittenmark, andra upplaga."
592 sidor
Beställd.
592 sidor
Beställd.
-
- Inlägg: 6468
- Blev medlem: 31 augusti 2006, 16:42:43
- Ort: Jamtland
Re: Pid styrning
För mig som är dålig på matte och programmering vore det intressant att försöka förstå hur ett sådant program fungerar. Du får gärna göra ett försök att lära mig.DanielM skrev: ↑11 augusti 2023, 20:10:47 Testa bygg en Model Predictive Control istället eller Model Reference Adaptive System
Model Reference Adaptive System är mycket enklare än Model Predictive Control som kräver en QP-lösare. Jag har en QP-lösare i ANSI C kod som är anpassad för inbyggda system.
Det är ingen svår matematik bakom. Det är bara plus och gånger samt integral-tänk. \(G_m\) är första ordningens dynamik, med andra ord "ramp"-funktion. \(G(s)\) är det okända systemet som vi ska försöka reglera.
Bara hojta till för den som vill lära sig detta.
Skärmbild 2023-08-11 200836.png
I övrigt har jag bra praktisk koll på hur PID-regulatorer fungerar. Även skaplig koll på optimering. Optimerade mina första ugnar första hälften av 70-talet.
Re: Pid styrning
Om man justerar genom att prova sig fram ja, men vatten är ju inte särskilt svårt att räkna på.DanielM skrev: ↑12 augusti 2023, 11:20:52 Man gör en adaptiv regulator av samma sak som man gör en PID-regulator. Det är roligt
Jag rekommenderar adaptiva regulatorer när det kommer till att hålla temperaturen på stora vattentankar. Där det tar tid att trimma in en PID-regulator. Den adaptiva regulator lär sig trögheten i systemet.
Re: Pid styrning
Boken är riktigt bra!
Det finns ingen annan bok inom adaptiv reglerteknik som behandlar ämnet bättre.
Sammanfattningsvis så skulle jag rekommendera att du lär dig följande:
- Recursive Least Squares
- Self Tuning Regulator (Denna använder Recursive Least Squares för att identifiera dynamiken i systemet)
- Model Reference Adaptive System (Detta är den adaptiva PI-regulatorn)
- Gain Scheduling (Olinjär PID-regulator med andra ord som har parameterlista)
- Minimum Variance Controller (Om du vill få något som vibrerar att inte vibrera)
- Kalman filter
Boken kräver att du måste förstå tillståndsmodeller och överföringsfunktioner. Bara skapa en ny tråd så kan vi fortsätta diskussionen där
Detta är för MRAS.
Den gröna är utsignalen \(y\) och svarta är utsignalen från \(G_m\), alltså ramp funktionen.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 13 augusti 2023, 14:40:49, redigerad totalt 4 gånger.
Re: Pid styrning
Varför ska man räkna idag?danei skrev: ↑12 augusti 2023, 18:00:07Om man justerar genom att prova sig fram ja, men vatten är ju inte särskilt svårt att räkna på.DanielM skrev: ↑12 augusti 2023, 11:20:52 Man gör en adaptiv regulator av samma sak som man gör en PID-regulator. Det är roligt
Jag rekommenderar adaptiva regulatorer när det kommer till att hålla temperaturen på stora vattentankar. Där det tar tid att trimma in en PID-regulator. Den adaptiva regulator lär sig trögheten i systemet.
Låt datorerna sköta detta arbete.