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

Committer:
nikitakl
Date:
2020-12-14
Revision:
1:b71be4a00291

File content as of revision 1:b71be4a00291:

#include "mbed.h"
#include "millis.h"
//#include "SoftwarePWM.h"
//#include "USBDevice.h"
#define threshold 0.003 // 1/330
unsigned long lastTime;
double Input, Output;
double Setpoint=0.0757575757575758;
double errSum, lastErr;
double kp, ki, kd;
int SampleTime = 1000; //1 sec


AnalogIn temperature(p20);
PwmOut fanControl(p21);
//static BufferedSerial pc(USBTX, USBRX);

Ticker temperatureTicker;

int readTemperatureFlag=0;

void tickerFlagOn()
{
    //led2 = !led2;
    readTemperatureFlag=1;
}

void Compute()
{   
    printf("PID is functioning\n\r");
   unsigned long now = millis();
   int timeChange = (now - lastTime);
   if(timeChange>=SampleTime)
   {
      /*Compute all the working error variables*/
      double error = Setpoint - Input;
      errSum += error;
      double dErr = (error - lastErr);
 
      /*Compute PID Output*/
      Output = kp * error + ki * errSum + kd * dErr;
 
      /*Remember some variables for next time*/
      lastErr = error;
      lastTime = now;
   }
   printf("PID loop has ended\n\r");
}
 
void SetTunings(double Kp, double Ki, double Kd)
{
  double SampleTimeInSec = ((double)SampleTime)/1000;
   kp = Kp;
   ki = Ki * SampleTimeInSec;
   kd = Kd / SampleTimeInSec;
}
 
void SetSampleTime(int NewSampleTime)
{
   if (NewSampleTime > 0)
   {
      double ratio  = (double)NewSampleTime
                      / (double)SampleTime;
      ki *= ratio;
      kd /= ratio;
      SampleTime = (unsigned long)NewSampleTime;
   }
}
int main()
{
    
    float oldTemperature = temperature.read();
    float newTemperature= oldTemperature;
    temperatureTicker.attach(&tickerFlagOn, 0.2); // the address of the function to be attached (tickerFlagOn) and the interval (0.2 seconds)
    
    while (1)
    {
        if (readTemperatureFlag)
        {
            readTemperatureFlag=0;
            newTemperature = temperature.read();
            if ((newTemperature < (oldTemperature-threshold)) || (newTemperature > (oldTemperature+threshold)))
            {
                oldTemperature = newTemperature; // These are for the threshold
                printf("Temperature= %.1f degrees\n\r", 3.3*oldTemperature*100);
            }
        }
    //Setpoint=0.0757575757575758;
    //Setpoint=25/330;
    Input=oldTemperature;
    SetTunings(1, 1, 1);
    Compute();
    fanControl.write(Output);
    printf("fanSpeed=%f \n \r", Output); 
    wait(1); 
    }
    
}