dd
Dependencies: BufferedSerial FastAnalogIn FastPWM mbed SHT75
controlt.cpp
00001 /* 00002 * controlt.cpp 00003 * 00004 * Created on: 2016. 2. 19. 00005 * Author: sbh9428 00006 */ 00007 00008 #include "controlt.h" 00009 00010 control_t::control_t() { 00011 // TODO Auto-generated constructor stub 00012 00013 } 00014 00015 control_t::control_t(temp_sensor_t* _temp_sensor, peltier_t* _peltier,BufferedSerial *_pc) 00016 { 00017 log_count=0; 00018 time=0; 00019 00020 target_temp=15; 00021 P_value=0; 00022 I_value=0; 00023 D_value=0; 00024 00025 temp_sensor=_temp_sensor; 00026 peltier=_peltier; 00027 pc=_pc; 00028 00029 table_count=0; 00030 table_mode=0; 00031 00032 repeatTime=0; 00033 repeatCount=0; 00034 repeatSide=0; 00035 } 00036 00037 control_t::~control_t() { 00038 // TODO Auto-generated destructor stub 00039 } 00040 00041 float control_t::get_temp() 00042 { 00043 return temp_sensor->get_temp(); 00044 } 00045 00046 void control_t::control_PWM(float PWM) 00047 { 00048 peltier->set_PWM(PWM); 00049 } 00050 00051 void control_t::control_temp() 00052 { 00053 PWM_value+=calc_P(); 00054 00055 PWM_value+=calc_I(); 00056 00057 PWM_value+=calc_D(); 00058 00059 if(PWM_value>1) 00060 { 00061 PWM_value=1; 00062 } 00063 if(PWM_value<-1) 00064 { 00065 PWM_value=-1; 00066 } 00067 peltier->set_PWM(PWM_value); 00068 } 00069 00070 void control_t::set_mode(int _mode) 00071 { 00072 mode=_mode; 00073 if(mode==4) 00074 { 00075 start_temp=temp_sensor->get_temp(); 00076 time=0; 00077 } 00078 } 00079 00080 void control_t::set_PWM_value(float _PWM_value) 00081 { 00082 PWM_value=_PWM_value; 00083 } 00084 00085 void control_t::set_target_temp(float _target_temp) 00086 { 00087 target_temp=_target_temp; 00088 } 00089 00090 void control_t::set_P_value(float _P_value) 00091 { 00092 P_value=_P_value; 00093 } 00094 00095 void control_t::set_I_value(float _I_value) 00096 { 00097 I_value=_I_value; 00098 } 00099 00100 void control_t::set_D_value(float _D_value) 00101 { 00102 D_value=_D_value; 00103 } 00104 00105 void control_t::set_period(int _period) 00106 { 00107 period=_period; 00108 } 00109 00110 void control_t::set_start_temp(float _start_temp) 00111 { 00112 start_temp=_start_temp; 00113 } 00114 00115 void control_t::refresh_PWM() 00116 { 00117 write_log(); 00118 time+=10; 00119 printf("\n%1.4f, %d, %d, %d, %d, %d, %d, %d, %2.2f, %2.2f, %2.2f, %2.2f", P_value, time, mode, repeatTime, repeatCount, repeatSide, highTempTime, lowTempTime, highTemp, lowTemp, target_temp, temp_sensor->get_temp()); 00120 if(mode==0) 00121 { 00122 PWM_value=0; 00123 control_PWM(0); 00124 } 00125 else if(mode==1) 00126 { 00127 } 00128 else if(mode==2) 00129 { 00130 control_temp(); 00131 } 00132 else if(mode==3) 00133 { 00134 build_table(); 00135 } 00136 else if(mode==4) 00137 { 00138 follow_table(); 00139 } 00140 else if(mode==5) 00141 { 00142 repeatPeriod(); 00143 } 00144 } 00145 00146 int control_t::get_mode() 00147 { 00148 return mode; 00149 } 00150 float control_t::get_target_temp() 00151 { 00152 return target_temp; 00153 } 00154 float control_t::get_P_value() 00155 { 00156 return P_value; 00157 } 00158 float control_t::get_I_value() 00159 { 00160 return I_value; 00161 } 00162 float control_t::get_D_value() 00163 { 00164 return D_value; 00165 } 00166 float control_t::get_PWM_value() 00167 { 00168 return PWM_value; 00169 } 00170 00171 int control_t::get_period() 00172 { 00173 return period; 00174 } 00175 00176 int control_t::get_table_count() 00177 { 00178 return table_count; 00179 } 00180 00181 float control_t::calc_P() 00182 { 00183 return (target_temp-temp_sensor->get_temp())*P_value; 00184 } 00185 00186 float control_t::calc_I() 00187 { 00188 float data=0; 00189 for(int i=0;i<10;i++) 00190 { 00191 data+=PWM_log[i]; 00192 } 00193 return data*I_value; 00194 } 00195 00196 float control_t::calc_D() 00197 { 00198 return -(temp_log[log_count]-temp_log[(log_count-1)%10])*D_value; 00199 } 00200 00201 int control_t::get_table_check() 00202 { 00203 return table_check; 00204 } 00205 00206 void control_t::write_log() 00207 { 00208 log_count++; 00209 log_count=log_count%10; 00210 temp_log[log_count]=temp_sensor->get_temp(); 00211 PWM_log[log_count]=target_temp-temp_sensor->get_temp(); 00212 } 00213 00214 void control_t::build_table() 00215 { 00216 table_check=1; 00217 if(table_mode==0) 00218 { 00219 peltier->set_PWM(-1); 00220 table_count++; 00221 pc->printf(",set initial temp %d/30", table_count); 00222 if(table_count>29) 00223 { 00224 table_mode=1; 00225 table_count=0; 00226 time=0; 00227 } 00228 00229 } 00230 else 00231 { 00232 table[table_count]=temp_sensor->get_temp(); 00233 table_count++; 00234 PWM_value=(float)-1+0.005*table_count; 00235 peltier->set_PWM(PWM_value); 00236 pc->printf(",build table %d/200", table_count); 00237 if(table_count>=200) 00238 { 00239 table_count=0; 00240 mode=0; 00241 table_min=table[0]; 00242 table_max=table[200]; 00243 } 00244 } 00245 } 00246 00247 void control_t::print_table() 00248 { 00249 int i; 00250 for(i=0;i<201;i++) 00251 { 00252 pc->printf(",%d/200 PWM: %1.3f, temp:%2.2f",i, (-1+0.005*i), table[i]); 00253 wait_us(3000); 00254 } 00255 } 00256 00257 float control_t::find_table(float _temp) 00258 { 00259 int i; 00260 00261 for (i=0; i<200;i++) 00262 { 00263 if (table[i+1]>_temp) 00264 return -1+0.005*i; 00265 } 00266 return 0; 00267 } 00268 00269 void control_t::follow_table() 00270 { 00271 if(table_check!=1) 00272 { 00273 mode=0; 00274 pc->printf(",table not built\n"); 00275 } 00276 else if(target_temp>table_max|target_temp<table_min) 00277 { 00278 mode=0; 00279 pc->printf(",target temp out of range"); 00280 } 00281 else if(period<=step) 00282 { 00283 pc->printf(",table follow end"); 00284 step=0; 00285 mode=2; 00286 } 00287 else 00288 { 00289 PWM_value=find_table(target_temp/period*step+start_temp/period*(period-step)); 00290 peltier->set_PWM(PWM_value); 00291 printf(",remain step: %d",period-step); 00292 step++; 00293 } 00294 } 00295 00296 void control_t::repeatPeriod() 00297 { 00298 repeatTime+=10; 00299 if(repeatSide==0) 00300 { 00301 target_temp=lowTemp; 00302 if(repeatTime>lowTempTime) 00303 { 00304 repeatSide=1; 00305 repeatTime=0; 00306 } 00307 } 00308 else 00309 { 00310 target_temp=highTemp; 00311 if(repeatTime>highTempTime) 00312 { 00313 repeatSide=0; 00314 repeatTime=0; 00315 repeatCount++; 00316 if(repeatCount>=periodNumber) 00317 { 00318 repeatSide=0; 00319 repeatTime=0; 00320 repeatCount=0; 00321 mode=0; 00322 } 00323 } 00324 00325 } 00326 control_temp(); 00327 00328 }
Generated on Tue Jul 12 2022 21:44:12 by 1.7.2