dd

Dependencies:   BufferedSerial FastAnalogIn FastPWM mbed SHT75

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers controlt.cpp Source File

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 }