PID based on http://brettbeauregard.com/blog/2011/04/improving-the-beginner%e2%80%99s-pid-sample-time/

Dependencies:   mbed PID Ticker_HelloWorld millis

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PID.cpp Source File

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 }