PID based on http://brettbeauregard.com/blog/2011/04/improving-the-beginner%e2%80%99s-pid-sample-time/
Dependencies: mbed PID Ticker_HelloWorld millis
PID.cpp
00001 #include "mbed.h" 00002 #include "millis.h" 00003 //#include "SoftwarePWM.h" 00004 //#include "USBDevice.h" 00005 #define threshold 0.003 // 1/330 00006 unsigned long lastTime; 00007 double Input, Output; 00008 double Setpoint=0.0757575757575758; 00009 double errSum, lastErr; 00010 double kp, ki, kd; 00011 int SampleTime = 1000; //1 sec 00012 00013 00014 AnalogIn temperature(p20); 00015 PwmOut fanControl(p21); 00016 //static BufferedSerial pc(USBTX, USBRX); 00017 00018 Ticker temperatureTicker; 00019 00020 int readTemperatureFlag=0; 00021 00022 void tickerFlagOn() 00023 { 00024 //led2 = !led2; 00025 readTemperatureFlag=1; 00026 } 00027 00028 void Compute() 00029 { 00030 printf("PID is functioning\n\r"); 00031 unsigned long now = millis(); 00032 int timeChange = (now - lastTime); 00033 if(timeChange>=SampleTime) 00034 { 00035 /*Compute all the working error variables*/ 00036 double error = Setpoint - Input; 00037 errSum += error; 00038 double dErr = (error - lastErr); 00039 00040 /*Compute PID Output*/ 00041 Output = kp * error + ki * errSum + kd * dErr; 00042 00043 /*Remember some variables for next time*/ 00044 lastErr = error; 00045 lastTime = now; 00046 } 00047 printf("PID loop has ended\n\r"); 00048 } 00049 00050 void SetTunings(double Kp, double Ki, double Kd) 00051 { 00052 double SampleTimeInSec = ((double)SampleTime)/1000; 00053 kp = Kp; 00054 ki = Ki * SampleTimeInSec; 00055 kd = Kd / SampleTimeInSec; 00056 } 00057 00058 void SetSampleTime(int NewSampleTime) 00059 { 00060 if (NewSampleTime > 0) 00061 { 00062 double ratio = (double)NewSampleTime 00063 / (double)SampleTime; 00064 ki *= ratio; 00065 kd /= ratio; 00066 SampleTime = (unsigned long)NewSampleTime; 00067 } 00068 } 00069 int main() 00070 { 00071 00072 float oldTemperature = temperature.read(); 00073 float newTemperature= oldTemperature; 00074 temperatureTicker.attach(&tickerFlagOn, 0.2); // the address of the function to be attached (tickerFlagOn) and the interval (0.2 seconds) 00075 00076 while (1) 00077 { 00078 if (readTemperatureFlag) 00079 { 00080 readTemperatureFlag=0; 00081 newTemperature = temperature.read(); 00082 if ((newTemperature < (oldTemperature-threshold)) || (newTemperature > (oldTemperature+threshold))) 00083 { 00084 oldTemperature = newTemperature; // These are for the threshold 00085 printf("Temperature= %.1f degrees\n\r", 3.3*oldTemperature*100); 00086 } 00087 } 00088 //Setpoint=0.0757575757575758; 00089 //Setpoint=25/330; 00090 Input=oldTemperature; 00091 SetTunings(1, 1, 1); 00092 Compute(); 00093 fanControl.write(Output); 00094 printf("fanSpeed=%f \n \r", Output); 00095 wait(1); 00096 } 00097 00098 }
Generated on Mon Jul 18 2022 03:31:19 by 1.7.2