Can someone please tell me why my code is not allowing error to reach 0?
The precision is really good the loop works just error never goes to 0 even when I enable PWM if Error is not equal to 0
#include <stdio.h>
#define DIR 12;
#define PWM 3;
#define Error_MAX 30
#define Error_MIN -30
int Error, PreviousError, ActualPosition, SetPoint;
float Input, Output, Proportional, Integral, Derivative, Control;
float Kp = 1.2;
float Ki = 0.14;
float Kd = 0.00008;
void setup()
{
Serial.begin(9600);
pinMode(A5, INPUT);
pinMode(A4, INPUT);
pinMode(12, OUTPUT);
pinMode(3, OUTPUT);
}
void loop()
{
SetPoint = analogRead(A4);
ActualPosition = analogRead(A5);
ActualPosition = map(ActualPosition, 84, 947, 0, 1023);
Error = SetPoint - ActualPosition;
Serial.print(Error);
Serial.print(" ");
Proportional = (float)Error*Kp;
Integral = (Integral + (float)Error)*Ki;
Derivative = ((float)Error - (float)PreviousError)*Kd;
Control = (Proportional + Integral + Derivative);
if(Control < 0)
{
Control *= -1;
}
if((Error > Error_MIN) && (Error < Error_MAX))
{
Control = 0;
}
if(Error > 0)
{
digitalWrite(12, HIGH);
analogWrite(3, Control);
}
else
{
digitalWrite(12, LOW);
analogWrite(3, Control);
}
if(ActualPosition != SetPoint)
{
analogWrite(3, (Control*=5));
}
Error = PreviousError;
}