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);
}
