Vito Ivano D'Alessandro / Mbed 2 deprecated PID_termocoppia_definitivo

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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