check rep

Dependencies:   mbed PID

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "PID.h"
00003 //test2
00004 //test3
00005 PwmOut fanpwm(p26);
00006 AnalogIn input(p15);
00007 Serial pc(USBTX, USBRX);
00008 double Input = 0, Output = 0, setPoint = 30,totErr, kp, ki;
00009 unsigned long prevTime, timerTime = 0;
00010 float movingAvarage = 0;
00011 int timeNow = 0;
00012 Ticker t;
00013 
00014 LocalFileSystem local("local");
00015 
00016 
00017 
00018 void timer ()
00019 
00020 {
00021     timerTime++;
00022     timeNow++;
00023 
00024 }
00025 
00026 void Compute()
00027 
00028 {
00029     unsigned long now = timerTime;
00030     int timeChange = (now - prevTime);
00031 
00032     double error = -(setPoint - movingAvarage);
00033     totErr += (error*timeChange*0.01);
00034 
00035     Output = kp*error+ki*totErr;
00036 
00037     prevTime = now;
00038     totErr = error;
00039 
00040 
00041 
00042     if(Output <= 0) {
00043         Output = 0;
00044     }
00045 
00046     Output = Output/10;
00047 
00048 
00049 }
00050 
00051 void SetTunings(double Kp, double Ki)
00052 
00053 {
00054 
00055 
00056     kp = Kp;
00057     ki = Ki;
00058 
00059 }
00060 
00061 int main()
00062 
00063 {
00064         FILE *temperature = fopen("/local/t_file.txt", "a");
00065         FILE *pwm = fopen("/local/pwm_file.txt", "a");
00066 
00067     float newInput = 0;
00068     float avArray[10];
00069 
00070     int avIndex = 0;
00071 
00072     for(int i=0; i<10; i++)
00073 
00074         avArray[i]=newInput;
00075     movingAvarage = newInput;
00076 
00077     t.attach(timer, 0.001);
00078 
00079     while (true)
00080 
00081     {
00082         if(timeNow>=100) {
00083             newInput = input.read()*3.30f*100.0f;
00084         }
00085 
00086         movingAvarage -= avArray[avIndex]/10;
00087 
00088         avArray[avIndex] = newInput;
00089         movingAvarage += avArray[avIndex]/10;
00090 
00091         if (avIndex < 9) {
00092             avIndex++;
00093         }
00094 
00095         else {
00096             avIndex = 0;
00097         }
00098 
00099         Compute();
00100 
00101         pc.printf("Input %f Avarage %f Output %f P-value %f I-value %f Setpoint %f Current Error %f\n",newInput, movingAvarage, Output, kp, ki, setPoint, totErr);
00102         pc.printf("\n\r");
00103 
00104         fprintf(temperature, "%f\n",newInput);
00105         fprintf(pwm, "%f\n",fanpwm.read());
00106 
00107         wait_ms(500);
00108 
00109         if (pc.readable())
00110 
00111         {
00112             char c = pc.getc();
00113 
00114             switch (c) {
00115                 case 'l' :
00116                     fclose(temperature);
00117                     fclose(pwm);
00118                     break;
00119 
00120                 case 'z' :
00121 
00122                     if (kp <= 100)
00123                         kp++;
00124 
00125                     break;
00126 
00127                 case 'x':
00128 
00129                     if (kp > 0)
00130                         kp--;
00131 
00132                     break;
00133 
00134                 case 'c':
00135 
00136                     if (ki <= 100)
00137                         ki++;
00138 
00139                     break;
00140 
00141                 case 'v':
00142 
00143                     if (ki > 0)
00144                         ki--;
00145 
00146                     break;
00147 
00148                 case 'b':
00149 
00150                     if (setPoint <= 75)
00151                         setPoint+=0.5;
00152 
00153                     break;
00154 
00155                 case 'n':
00156 
00157                     if (setPoint > 0)
00158                         setPoint-=0.5;
00159 
00160                     break;
00161 
00162             }
00163 
00164         }
00165 
00166 
00167         SetTunings(kp,ki);
00168         fanpwm.write(Output);
00169 
00170     }
00171 
00172 }