Pid styrning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Pid styrning

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Pid styrning

Inlägg 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.
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Pid styrning

Inlägg 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
    
}
Användarvisningsbild
farbrorvattenmelon
Inlägg: 255
Blev medlem: 29 januari 2009, 21:38:21

Re: Pid styrning

Inlägg 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?
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Pid styrning

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
ToPNoTCH
Inlägg: 4891
Blev medlem: 21 december 2009, 17:59:48

Re: Pid styrning

Inlägg 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.
ToPNoTCH
Inlägg: 4891
Blev medlem: 21 december 2009, 17:59:48

Re: Pid styrning

Inlägg 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.
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Pid styrning

Inlägg 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. :)
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Pid styrning

Inlägg 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.
Gimbal
Inlägg: 7932
Blev medlem: 20 april 2005, 15:43:53

Re: Pid styrning

Inlägg 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)
Mindmapper
Inlägg: 6421
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Re: Pid styrning

Inlägg 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.
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Pid styrning

Inlägg 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å.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Pid styrning

Inlägg 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
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.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Pid styrning

Inlägg 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.
Skriv svar