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.
main.cpp
00001 00002 #include "PID_Int.h" 00003 00004 /********************************** 00005 Inizializzazzione Variabili Globali 00006 **********************************/ 00007 00008 Serial pc(SERIAL_TX, SERIAL_RX); /* Inizializza la comunicazione seriale. */ 00009 00010 AnalogIn Thermocouple(THERMOCOUPLE); /* Inizializza il pin A0 a cui è collegata la termocoppia. */ 00011 00012 PwmOut Driver_res(DRIVER_RES); /* PWM per la regolazione dei resistori. */ 00013 PwmOut Driver_fan(DRIVER_FAN); /* PWM per la regolazione della ventola. */ 00014 00015 static Ticker ticker; /* Ticker utilizzato dalla libreria millis.h. */ 00016 00017 Context Contesto; /* Struttura che contiene le variabili di contesto. */ 00018 00019 /* Oggetto della classe PID per il controllo della resistenza. */ 00020 PID controller(&Contesto.Input, &Contesto.Output, &Contesto.Setpoint, Contesto.Kp, Contesto.Ki, Contesto.Kd, DIRECT); 00021 00022 /* Oggetto della classe PID per il controllo della ventola. */ 00023 PID controller_back(&Contesto.Input, &Contesto.Output, &Contesto.Setpoint, Contesto.Kp, Contesto.Ki, Contesto.Kd, REVERSE); 00024 00025 00026 /********************************** 00027 Funzioni 00028 **********************************/ 00029 00030 /*! \fn int main() 00031 * 00032 * \brief Funzione Main. 00033 * 00034 */ 00035 int main() 00036 { 00037 /* Invia tramite seriale lo stato di ONLINE. */ 00038 pc.printf("ONLINE\n"); 00039 00040 /* Inizializza il timer. */ 00041 startMillis(); 00042 00043 /* Definisce il periodo in ms della PWM. */ 00044 Driver_res.period_ms(100); 00045 Driver_fan.period_ms(100); 00046 00047 /* Avvia i controllori PID. */ 00048 controller.SetMode(AUTOMATIC); 00049 controller_back.SetMode(AUTOMATIC); 00050 00051 /* Ottiene i valori iniziali dei parametri del PID. */ 00052 pc.scanf("%lf",&Contesto.Kp); 00053 pc.scanf("%lf",&Contesto.Ki); 00054 pc.scanf("%lf",&Contesto.Kd); 00055 pc.scanf("%lf",&Contesto.Setpoint); 00056 00057 /* Setta i parametri dei PID. */ 00058 controller.SetTunings(Contesto.Kp, Contesto.Ki, Contesto.Kd); 00059 controller_back.SetTunings(Contesto.Kp, Contesto.Ki, Contesto.Kd); 00060 00061 /* Loop infinito. */ 00062 while(1) { 00063 00064 /* Ottiene il valore che indica se un parametro è stato modificato e, in 00065 caso affermativo, indica quale dei parametri è stato modificato. */ 00066 pc.scanf("%d", &Contesto.Evento); 00067 00068 switch(Contesto.Evento) { 00069 00070 /* Modifica del parametro proporzionale del PID */ 00071 case (Modifica_Kp): { 00072 pc.scanf("%lf",&Contesto.Kp); 00073 } 00074 break; 00075 00076 /* Modifica del parametro integrativo del PID */ 00077 case (Modifica_Ki): { 00078 pc.scanf("%lf",&Contesto.Ki); 00079 } 00080 break; 00081 00082 /* Modifica del parametro derivativo del PID */ 00083 case (Modifica_Kd): { 00084 pc.scanf("%lf",&Contesto.Kd); 00085 } 00086 break; 00087 00088 /* Modifica del setpoint di temperatura. */ 00089 case (Modifica_Setpoint): { 00090 pc.scanf("%lf",&Contesto.Setpoint); 00091 } 00092 break; 00093 00094 /* Nessun parametro modificato. */ 00095 default: { 00096 } 00097 break; 00098 00099 } 00100 00101 /* Setta i nuovi parametri dei PID. */ 00102 controller.SetTunings(Contesto.Kp, Contesto.Ki, Contesto.Kd); 00103 controller_back.SetTunings(Contesto.Kp, Contesto.Ki, Contesto.Kd); 00104 00105 /* Temperatura attuale misurata dalla termocoppia. */ 00106 Contesto.Input = getTemperature_thermocouple(); 00107 00108 /* Invia tramite seriale la temperatura misuarata. */ 00109 pc.printf("%lf\n", Contesto.Input); 00110 00111 /* Verifica se la temperatura è già soprasoglia o sottosoglia. */ 00112 if(Contesto.Input <= Contesto.Setpoint) { 00113 00114 /* Processa il PID loop della resistenza. */ 00115 bool isComputed = controller.Compute(); 00116 00117 /* Formatta il duty cycle per ottenere un valore tra [0 1.0]. */ 00118 double duty_res = Contesto.Output/1000; 00119 00120 /* Sovrascive il duty cycle. */ 00121 Driver_res.write(duty_res); 00122 Driver_fan.write(0); 00123 00124 /* Invia tramite seriale i duty cycle. */ 00125 pc.printf("%lf\n",0); /* Duty cycle della ventola. */ 00126 pc.printf("%lf\n",duty_res); /* Duty cycle della resistenza. */ 00127 00128 } else { 00129 00130 /* Processa il PID loop della ventola. */ 00131 bool isComputed_back = controller_back.Compute(); 00132 00133 /* Formatta il duty cycle per ottenere un valore tra [0 1.0]. */ 00134 double duty_fan = Contesto.Output/1000; 00135 00136 /* Sovrascive il duty cycle. */ 00137 Driver_fan.write(duty_fan); 00138 Driver_res.write(0); 00139 00140 /* Invia tramite seriale i duty cycle. */ 00141 pc.printf("%lf\n",duty_fan); /* Duty cycle della ventola. */ 00142 pc.printf("%lf\n",0); /* Duty cycle della resistenza. */ 00143 } 00144 00145 /* Delay. */ 00146 wait(0.1); 00147 00148 } 00149 00150 } 00151 00152 /*! \fn double getTemperature_thermocouple() 00153 * 00154 * \brief Calcola la temperatura misurata dalla termocoppia utilizzando la 00155 * la legge di trasformazione da tensione a temperatura usando i NIST 00156 * Coefficents. 00157 * 00158 */ 00159 double getTemperature_thermocouple() 00160 { 00161 double temp; /* Temperatura misurata dalla termocoppia. */ 00162 00163 /* Legge e formatta il valore in V misurato dal pin A0. */ 00164 double Lettura_termocoppia = Thermocouple.read() * (double)VOLT_MAX; 00165 00166 /* Converte la tensione misurata dalla scheda al valore in mV che la termocoppia avrebbe in uscita a quella temperatura. */ 00167 double b=(Lettura_termocoppia*mV_AT_100_C) / VOLT_MAX; 00168 00169 /* NIST coefficients. */ 00170 double a0=0.000000; 00171 double a1=1.978425*10 ; 00172 double a2=-2.001204*0.1; 00173 double a3= 1.036969*0.01; 00174 double a4=-2.549687*0.0001; 00175 double a5= 3.585153*0.000001; 00176 double a6=3.585153*0.00000001; 00177 double a7=5.099890*0.0000000001; 00178 00179 /* Potenze. */ 00180 double b2=b*b; 00181 double b3=b2*b; 00182 double b4=b3*b; 00183 double b5=b4*b; 00184 double b6=b5*b; 00185 double b7=b6*b; 00186 00187 /* Converte da valore di tensione a valore di temperatura nel range [0 100] °C */ 00188 temp=a0+a1*b+a2*b2+a3*b3+a4*b4+a5*b5+a6*b6+a7*b7; 00189 00190 return temp; 00191 00192 } 00193 00194
Generated on Wed Jul 27 2022 15:31:02 by
1.7.2