Sida 1 av 1

Pid styrning

Postat: 11 augusti 2023, 11:25:40
av SeniorLemuren
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.
IMG_20230811_110514_977.jpg

Re: Pid styrning

Postat: 11 augusti 2023, 15:45:35
av DanielM
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.

:tumupp:

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.

Re: Pid styrning

Postat: 11 augusti 2023, 17:10:38
av SeniorLemuren
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.

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
    
}

Re: Pid styrning

Postat: 11 augusti 2023, 19:21:44
av farbrorvattenmelon
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?

Re: Pid styrning

Postat: 11 augusti 2023, 20:10:47
av DanielM
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

Postat: 11 augusti 2023, 23:38:47
av ToPNoTCH
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.

Re: Pid styrning

Postat: 11 augusti 2023, 23:44:53
av ToPNoTCH
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?
Ser ut som dom ställs via serieporten. Kan ju vara så Lemuren gör.

Re: Pid styrning

Postat: 12 augusti 2023, 11:14:24
av SeniorLemuren
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
¨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. :)

Re: Pid styrning

Postat: 12 augusti 2023, 11:20:52
av DanielM
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.

Re: Pid styrning

Postat: 12 augusti 2023, 16:22:31
av Gimbal
"För mer information: Adaptive Control av Karl-Johan Åström och Björn Wittenmark, andra upplaga."

592 sidor :shock:
Beställd. 8)

Re: Pid styrning

Postat: 12 augusti 2023, 16:47:31
av Mindmapper
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
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.
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

Postat: 12 augusti 2023, 18:00:07
av danei
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.
Om man justerar genom att prova sig fram ja, men vatten är ju inte särskilt svårt att räkna på.

Re: Pid styrning

Postat: 13 augusti 2023, 13:11:55
av DanielM
Gimbal skrev: 12 augusti 2023, 16:22:31 "För mer information: Adaptive Control av Karl-Johan Åström och Björn Wittenmark, andra upplaga."

592 sidor :shock:
Beställd. 8)
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
Då har du fått dom viktigaste regulatorerna. För att inte tappa motivationen så börja med MRAS-regulatorn om du vill ha resultat inom kort. Den är enklast att jobba med. MRAS ger ett förvånansvärt bra resultat också i praktiken.
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.
MRAS.png

Re: Pid styrning

Postat: 13 augusti 2023, 13:12:28
av DanielM
danei skrev: 12 augusti 2023, 18:00:07
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.
Om man justerar genom att prova sig fram ja, men vatten är ju inte särskilt svårt att räkna på.
Varför ska man räkna idag? :wink: :tumupp:
Låt datorerna sköta detta arbete.