check rep
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Thu Dec 8 2022 17:46:04 by
1.7.2