Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
PID.cpp
- Committer:
- nikitakl
- Date:
- 2020-12-15
- Revision:
- 0:2b302a1ce68a
- Child:
- 1:36155a9a4422
File content as of revision 0:2b302a1ce68a:
#include "mbed.h" #include "millis.h" //#include "SoftwarePWM.h" //#include "USBDevice.h" #define threshold 0.009 // 1/330 unsigned long lastTime; double Input, Output; double Setpoint=0.10606060606; //35/330; 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) { 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(4, 2, 1); Compute(); fanControl.period(0.00004f); if (Setpoint<Input)fanControl.write(-Output); else fanControl.write(0); //fanControl.write(0.50f); printf("inp %f set %f out %f \n \r", Input, Setpoint, Output); wait(3); } }