Hi
I am using the PID library to create a servomotor (DC motor with a POT) but had some problems making my motor turn in both directions. What i did was to change the Input and Setpoint pin hereby making the setpointpin the inputpin. … it seems to work but…?
#include <PID_v1.h>
double error;
//Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,20,0,0, DIRECT);
void setup()
{
TCCR2B = 0x01; // Timer 2: PWM 3 & 11 @ 32 kHz
Serial.begin(9600);
//initialize the variables we're linked to
Input = analogRead(A3);
Setpoint = analogRead(A1);
//turn the PID on
myPID.SetMode(AUTOMATIC);
}
void loop()
{
double HJULraw = analogRead(A1); //reading the 2 pots to calculate an error
double RATraw = analogRead(A3);
error = (RATraw-HJULraw);
if(error >= 2) {
TurnR();
} else if (error <= -2) {
TurnL();
} else {
digitalWrite(11, LOW);
digitalWrite(3, LOW);
}
}
void TurnR() {
Setpoint = analogRead(A3);
Input = analogRead(A1);
myPID.Compute();
Output = map(Output, 0, 255, 0, 150);
analogWrite(3, 0);
analogWrite(11,Output);
Cprint();
}
void TurnL() {
Setpoint = analogRead(A1); // THIS IS WHERE THE TWO PINS ARE CHANGED COMPARED TO Void TurnR
Input = (analogRead(A3));
myPID.Compute();
Output = map(Output, 0, 255, 0, 150);
analogWrite(11, 0);
analogWrite(3, Output);
Cprint();
}
void Cprint() {
Serial.write("error: ");
Serial.print(error);
Serial.write(" potRAT: ");
Serial.print(analogRead(A3));
Serial.write(" potHJUL: ");
Serial.print(analogRead(A1));
Serial.write(" Output: ");
Serial.println(Output);
delay(100);
}
I dont know if this is the way to do it?
Thanks for your help.