//Now it will work // Control Speed of DC FAN Using Arduino PID Library
#include <PID_v1.h> double Setpoint, Input, Output; //not there in original sketch //Define Variables we'll be connecting to double Setpoint, Input, Output; //Define the aggressive and conservative Tuning Parameters double aggKp = 4, aggKi = 0.2, aggKd = 1; double consKp = 1, consKi = 0.05, consKd = 0.25; //double consKp=2, consKi=5, consKd=1;
//Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, REVERSE); void setup() { Serial.begin(9600); //initialize the variables we're linked to // Input = map(analogRead(0), 0, 1023, 255, 0);
//int val = analogRead(0); //val = map(val, 0, 1023, 0, 255); // analogWrite(9, val);
Setpoint = 100; myPID.SetOutputLimits(0, 255); //MIN,MAX //turn the PID on myPID.SetMode(AUTOMATIC); // MANUAL myPID.SetControllerDirection(REVERSE); // DIRECT } void loop() { int sensorValue = analogRead(0); Input = map(sensorValue, 0, 1023, 0, 255);
double gap = abs(Setpoint - Input); //distance away from setpoint if (gap < 10) { //we're close to setpoint, use conservative tuning parameters myPID.SetTunings(consKp, consKi, consKd); } else { //we're far from setpoint, use aggressive tuning parameters myPID.SetTunings(aggKp, aggKi, aggKd); }
myPID.Compute(); analogWrite(3, Output); Serial.print(" PWM = "); Serial.print(Output,0); Serial.print(" sensor value = "); Serial.print(sensorValue); Serial.print(" Input ="); Serial.println(Input,0); }
//Now it will work
// https://arduino.stackexchange.com/questions/9731/control-speed-of-dc-fan-using-arduino-pid-library
#include <PID_v1.h>
double Setpoint, Input, Output; //not there in original sketch
//Define Variables we'll be connecting to double Setpoint, Input, Output;
//Define the aggressive and conservative Tuning Parameters
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;
//double consKp=2, consKi=5, consKd=1;
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, REVERSE);
void setup()
{
Serial.begin(9600);
//initialize the variables we're linked to
// Input = map(analogRead(0), 0, 1023, 255, 0);
//int val = analogRead(0);
//val = map(val, 0, 1023, 0, 255);
// analogWrite(9, val);
Setpoint = 100;
myPID.SetOutputLimits(0, 255); //MIN,MAX
//turn the PID on
myPID.SetMode(AUTOMATIC); // MANUAL
myPID.SetControllerDirection(REVERSE); // DIRECT
}
void loop()
{
int sensorValue = analogRead(0);
Input = map(sensorValue, 0, 1023, 0, 255);
double gap = abs(Setpoint - Input); //distance away from setpoint
if (gap < 10)
{ //we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}
myPID.Compute();
analogWrite(3, Output);
Serial.print(" PWM = ");
Serial.print(Output,0);
Serial.print(" sensor value = ");
Serial.print(sensorValue);
Serial.print(" Input =");
Serial.println(Input,0);
}