Hey guys,
Id like to control theposition of an actuator using a PID algorithm. My problem is that when the actuator comes close to its setpoint it starts oscillating. Is there a possibility to let the algorithm stop trying to correct the value if it has reached a certain span?
#include <PID_v1.h>
#define kneevl1 30
#define kneevl2 31
#define kneevr1 32
#define kneevr2 33
#define kneehl1 34
#define kneehl2 35
#define kneehr1 36
#define kneehr2 37
double Setpoint ; // will be the desired value
double Input; // Potentiometer
double Output ; //rein oder raus
//PID parameters
double Kp=0.000000001, Ki=0, Kd=0;
//create PID instance
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE);
void setup()
{
pinMode(kneevl1,OUTPUT);
pinMode(kneevl2,OUTPUT);
pinMode(kneevr1,OUTPUT);
pinMode(kneevr2,OUTPUT);
pinMode(kneehl1,OUTPUT);
pinMode(kneehl2,OUTPUT);
pinMode(kneehr1,OUTPUT);
pinMode(kneehr2,OUTPUT);
Serial.begin(9600);
Setpoint = 600;
//Turn the PID on
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0,100);
myPID.SetTunings(Kp, Ki, Kd);
myPID.SetSampleTime(100);
}
void loop()
{
Input = analogRead(A1);
myPID.Compute();
//Serial.println(Output);
//map(Output,0,1024,1,2);
Serial.println (Output);
if(analogRead(A1)>Setpoint)
{
digitalWrite (kneevr2,LOW);
digitalWrite (kneevr1,HIGH);
delay(Output);
}
if(analogRead(A1)<Setpoint)
{
digitalWrite (kneevr2,HIGH);
digitalWrite (kneevr1,LOW);
delay(Output);
}
}