PID Regulator

Video som beskriver programmering av en PID regulator vha Arduino:

Her er en link til en webside med programkode.

Videoen er interessant men beskrivelsen av P, I og D parametrene er neppe riktig. Her vil det være nødvendig å slå opp i dokumentasjonen for den programmodulen som er brukt.

Her er noe dokumentasjon. Her også.

Edit:

Etter litt testing og justering så ser det faktisk ut til å fungere sånn noenlunde som en regulator. Endret litt på programkoden. Analog inngang 0-5V er på inngang A5. Analog utgang med pulsbreddemodulasjon er på digital pinne 3.

 

#include <PID_v1.h>

double Setpoint ; 
double Input; 
double Output ; 
int Offset ;
// Sette skal verdi
int Skal_verdi = 127;
//Sette PID Parametre
//Forsterkning = 1, Integraltid = 10, D-Tid deaktivert
double Kp=1, Ki=10, Kd=0; 

//Etabler en PID instance 
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup()
{

Serial.begin(9600); 
Offset = 0; // 0% offset
Setpoint = Skal_verdi + Offset; 
//Automatisk eller manuell styring av output
myPID.SetMode(AUTOMATIC); 
//Tror dette er en funksjon for autotuning. Tok den vekk.
// myPID.SetTunings(Kp, Ki, Kd); 
}

void loop()
{
Input = map(analogRead (5), 0, 1024, 0, 255); // Leser input fra A5
//PID utregning
myPID.Compute();
//Skriv ut beregnet verdi som PWM til digital pinne 3
analogWrite(3,Output); 
//Skriv data til seriemonitor 
Serial.print("Inp: ");
Serial.println(Input);
Serial.print("Outp: ");
Serial.println(Output);
Serial.print("Setpkt: "); 
Serial.println(Setpoint);
Serial.println(" "); 
// Brukte 2 sek delay under testing. tas vekk senere.
delay(2000);
}

 

For at dette programmet skal kjøre så er det nødvendig å installere dette programbiblioteket:

Det dreier seg altså om PID by Brett Beauregard som inneholder PID_v1.h

Litt mer informasjon fra forfatteren av programbiblioteket:

Kompakt forenklet programkode med programkode for testing.


#include <PID_v1.h>

double Setpoint, Input, Output;

PID myPID(&Input, &Output, &Setpoint, 1, 2 , 0, DIRECT);

void setup()
{
 // Serial.begin(9600); //For feilsøking, tas vekk 
 Input = analogRead(5);
 Setpoint = 512; // Setpunkt fra 1-1024, 512 tilsvarer 50%
 myPID.SetMode(AUTOMATIC);
}

void loop()
{
 Input = analogRead(5);
 myPID.Compute();
 analogWrite(3,Output);

 // For feilsøking, tas vekk

 //Skriv data til seriemonitor 
 //Serial.print("Inp: ");
 //Serial.println(Input);
 // Serial.print("Outp: ");
 // Serial.println(Output);
 // Serial.print("Setpkt: "); 
 // Serial.println(Setpoint);
 // Serial.println(" "); 

//  delay(2000);

}

 

Forenklet programkode uten kode for testing:


#include <PID_v1.h>

double Setpoint, Input, Output;

PID myPID(&Input, &Output, &Setpoint, 1, 2 , 0, DIRECT);

void setup()
{
 Input = analogRead(5);
 Setpoint = 512; // Setpunkt fra 1-1024, 512 tilsvarer 50%
 myPID.SetMode(AUTOMATIC);
}

void loop()
{
 Input = analogRead(5);
 myPID.Compute();
 analogWrite(3,Output);
}