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