Control PID para seguimiento de consigna de Horno, entrada de parámetros a través de un encoder.
Dependencies: Debounced QEI RTC-DS1307 TextLCD mbed
Fork of Reloj_alarma by
Revision 2:a4b764672482, committed 2018-06-05
- Comitter:
- SantiagoUnal97
- Date:
- Tue Jun 05 05:39:25 2018 +0000
- Parent:
- 1:0639f31dd59f
- Commit message:
- Control PID para Horno
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 0639f31dd59f -r a4b764672482 main.cpp --- a/main.cpp Wed Sep 28 06:48:39 2016 +0000 +++ b/main.cpp Tue Jun 05 05:39:25 2018 +0000 @@ -1,44 +1,74 @@ +/* +ESTE PROGRAMA PERMITE CONFIGURAR EL SIGUMINETO DE UNA CONSIGNA A TRAVES DE CONTROLADOR PID,PARA UN HORNO DE REFLUJO +SE USA LA SALIDA ANALOGA Y PWM DE LA TARJETA, SEGUN SE DESEE. +ESTA TAREA FUE DESARROLLADA POR SANTIAGO GOMEZ ESTRADA,JUAN FERNANDO ZAPATA Y MATEO +PARA LA MATERIA DE PROCESADORES DE LA UNIVERSIDAD NACIONAL DE COLOMBIA SEDE MEDELLÍN, PRIMER SEMESTRE DEL AÑO 2018 +*/ #include "mbed.h" #include "DebouncedIn.h" #include "TextLCD.h" #include "QEI.h" #include "Rtc_Ds1307.h" +#include "string.h" + +Serial pc(USBTX, USBRX); TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 Rtc_Ds1307 rtc(PTE0, PTE1); QEI wheel (PTA16, PTA17, NC, 48); +DebouncedIn button_enco(PTC5); +DigitalOut myled(LED3); +AnalogIn y(PTB3);//entrada analoga +AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer +PwmOut Upwm(PTE29); -DebouncedIn button_enco(PTC5); +int dato; // tiempo de cada dato que se lee +int pul_low; -PwmOut Sonido(PTA5); +char r; + -float periodo; -float Frecuencia=4000; +int mode=0; +int code; + + +// int C1=0x0C; int m; int Conf=0; // 0: Alarma y 1:Reloj int Lugar=0; // Definen el punto en el cual va el programa int i=0; +int j=1; +float periodo; +float Frecuencia = 2000; +int cont=0; int visual=0; -int alarma=0; +int alarma=0; +float pid,o,ai,ad,ap,med,err; +float err_v; +int sp=0,Ki=0,Kp=0,Kd=0,pos=1; +int t1=0,t2=0,t3=0,T1=0,T2=0,T3=0; int main() { - Rtc_Ds1307::Time_rtc tm = {}; - Rtc_Ds1307::Time_rtc Alarm = {}; + myled=1; + j=1; + Rtc_Ds1307::Time_rtc tm2 = {}; + + lcd.cls(); lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD - lcd.locate(0,0); - lcd.printf("--Alarma --Hora"); + lcd.printf("--Control --Consig"); periodo=(1/Frecuencia); - Sonido.period(periodo); + Upwm.period(periodo); + Upwm.pulsewidth(0); - rtc.getTime(tm); //lee el tiempo del DS1307 - + while(1) { + switch (Lugar) { case 0: @@ -49,7 +79,7 @@ m=0; } - if(m!=0 && Conf==1){ + if(m!=0 && Conf==1){ Conf=0; wheel.reset(); m=0; @@ -86,58 +116,52 @@ case 1: switch(i) { - case 0: - - - if(Conf==0) + case 0: + if(Conf==0) // control { lcd.cls(); lcd.locate(0,0); - lcd.printf("Config. Alarma "); + lcd.printf("Config. Control "); wait(1); + lcd.cls(); i++; - m=0; - lcd.cls(); lcd.locate(0,0); - lcd.printf("Dia: "); - tm.date=1; + lcd.printf("Kp: "); + m=0; } - if(Conf==1) + if(Conf==1) //consignas { lcd.cls(); lcd.locate(0,0); - lcd.printf("Config. hora "); + lcd.printf("Config.consig "); wait(1); - i++; - m=0; + i=5; lcd.cls(); lcd.locate(0,0); - lcd.printf("Dia: "); + lcd.printf("t1: "); + m=0; } break; - case 1: + case 1: //Kp m=wheel.getPulses(); if (m!=0) { - tm.date=tm.date+m; - if(tm.date>31) - { - tm.date=31; - } - if(tm.date<1) - { - tm.date=1; - } + Kp=Kp+m; + + wheel.reset(); m=0; } + lcd.locate(5,0); - lcd.printf("%02d",tm.date); + lcd.printf("%d ",Kp); + + if (button_enco.falling()) { @@ -145,31 +169,23 @@ m=0; lcd.cls(); lcd.locate(0,0); - lcd.printf("Mes: "); - //tm.mon=1; + lcd.printf("Ki: "); } break; - - case 2: + case 2: // Ki + m=0; m=wheel.getPulses(); if (m!=0) { - tm.mon=tm.mon+m; - if(tm.mon>12) - { - tm.mon=12; - } - if(tm.mon<1) - { - tm.mon=1; - } + Ki=Ki+m; + wheel.reset(); m=0; } lcd.locate(5,0); - lcd.printf("%02d",tm.mon); + lcd.printf("%d ",Ki); if (button_enco.falling()) { @@ -177,28 +193,22 @@ m=0; lcd.cls(); lcd.locate(0,0); - lcd.printf("Year: "); + lcd.printf("Kd: "); } - break; - - case 3: + case 3: // Kd m=wheel.getPulses(); if (m!=0) { - tm.year=tm.year+m; + Kd=Kd+m; - if(tm.year<2000) - { - tm.year=2000; - } wheel.reset(); m=0; } - lcd.locate(6,0); - lcd.printf("%02d",tm.year); + lcd.locate(7,0); + lcd.printf("%d",Kd); if (button_enco.falling()) { @@ -206,129 +216,198 @@ m=0; lcd.cls(); lcd.locate(0,0); - lcd.printf("Hora: "); + lcd.printf("sp: "); } break; - case 4: - m=wheel.getPulses(); - + case 4: //set point + m=wheel.getPulses(); if (m!=0) { - tm.hour=tm.hour + m; - if(tm.hour>23) - { - tm.hour=23; - } - if(tm.hour<0) - { - tm.hour=0; - } + sp=sp+m; + + wheel.reset(); m=0; } lcd.locate(6,0); - lcd.printf("%02d",tm.hour); + lcd.printf("%d",sp); if (button_enco.falling()) { - i++; - m=0; + lcd.cls(); lcd.locate(0,0); - lcd.printf("Minuto: "); - //tm.min=0; + lcd.printf("Control config. "); + wait(1); + i=0; + m=0; + Lugar=0; + lcd.locate(0,0); + lcd.printf("--Control --Consig"); + } break; - case 5: + + + + + + case 5: //t1 m=wheel.getPulses(); if (m!=0) { - tm.min=tm.min+m; - if(tm.min>59) - { - tm.min=59; - } - if(tm.min<0) - { - tm.min=0; - } + t1=t1+m; + + + wheel.reset(); + m=0; + } + lcd.locate(8,0); + lcd.printf("%d",t1); + + if (button_enco.falling()) + { + /////////////////// + i++; + m=0; + lcd.cls(); + lcd.locate(0,0); + lcd.printf("t2: "); + + /////////////////// + } + + break; + case 6: //t2 + m=wheel.getPulses(); + if (m!=0) + { + t2=t2+m; + wheel.reset(); m=0; } lcd.locate(8,0); - lcd.printf("%02d",tm.min); + lcd.printf("%d",t2); if (button_enco.falling()) { + /////////////////// i++; m=0; lcd.cls(); lcd.locate(0,0); - lcd.printf("Segundo: "); - //tm.sec=0; + lcd.printf("t3: "); + + /////////////////// } break; - - - case 6: + case 7: //t3 m=wheel.getPulses(); if (m!=0) { - tm.sec=tm.sec+m; - if(tm.sec>59) - { - tm.sec=59; - } - if(tm.sec<0) - { - tm.sec=0; - } + t3=t3+m; + + + wheel.reset(); + m=0; + } + lcd.locate(8,0); + lcd.printf("%d",t3); + + if (button_enco.falling()) + { + /////////////////// + i++; + m=0; + lcd.cls(); + lcd.locate(0,0); + lcd.printf("T1: "); + + /////////////////// + } + + break; + case 8: //T1 + m=wheel.getPulses(); + if (m!=0) + { + T1=T1+m; + wheel.reset(); m=0; } - lcd.locate(9,0); - lcd.printf("%02d",tm.sec); + lcd.locate(8,0); + lcd.printf("%d",T1); if (button_enco.falling()) { /////////////////// - if(Conf==0) - { - Alarm=tm; - lcd.cls(); - lcd.locate(0,0); - lcd.printf("Alarma config. "); - wait(1); - i=0; - m=0; - Lugar++; - lcd.cls(); - - } - - if(Conf==1) - { - rtc.setTime(tm, false, false); - rtc.startClock(); - lcd.cls(); - lcd.locate(0,0); - lcd.printf("Hora Config. "); - wait(1); - i=0; - m=0; - Lugar=0; - lcd.locate(0,0); - lcd.printf("--Alarma --Hora"); - } + i++; + m=0; + lcd.cls(); + lcd.locate(0,0); + lcd.printf("T2: "); + + /////////////////// + } + + break; + case 9: //t2 + m=wheel.getPulses(); + if (m!=0) + { + T2=T2+m; + + + wheel.reset(); + m=0; + } + lcd.locate(8,0); + lcd.printf("%d",T2); + + if (button_enco.falling()) + { + /////////////////// + i++; + m=0; + lcd.cls(); + lcd.locate(0,0); + lcd.printf("T3: "); + + /////////////////// + } + + break; + case 10: //T3 + m=wheel.getPulses(); + if (m!=0) + { + T3=T3+m; + + + wheel.reset(); + m=0; + } + lcd.locate(8,0); + lcd.printf("%d",T3); + + if (button_enco.falling()) + { + /////////////////// + Lugar++; + m=0; + lcd.cls(); + /////////////////// } @@ -338,171 +417,80 @@ } break; - case 2: - - rtc.getTime(tm); - + case 2: // MOSTRAR EL TIEMPO Y LA ALARMA, Y COMPROBAMOS ESTADO DE LA ALARMA + rtc.getTime(tm2); //LECTURA RTC + if(cont==0) + { tm2.min=0; + tm2.sec=0; + cont++; + rtc.setTime(tm2, false, false); + rtc.startClock(); + + + } if(visual==0) - { - + { lcd.locate(0,0); - lcd.printf("Hora: "); + lcd.printf("tiempo: "); lcd.locate(8,0); - lcd.printf("%02d:",tm.hour); - lcd.printf("%02d:",tm.min); - lcd.printf("%02d",tm.sec); - + + lcd.printf("%02d:",tm2.min); + lcd.printf("%02d",tm2.sec); lcd.locate(0,1); - lcd.printf("%02d/",tm.mon); - lcd.printf("%02d/",tm.date); - lcd.printf("%02d",tm.year); + lcd.printf("%d",sp); + + wait(0.1); ////////// - m=wheel.getPulses(); - if(m!=0) - { - visual=1; - wheel.reset(); - m=0; - } - ////// - } - - if(visual==1) + med = y.read()*999; + err = (sp-med); //se calcula el error + ap = Kp*err*0.01f; //se calcula la accion proporcinal + ai =(Ki*err*0.01f)+ai; //calculo de la integral del error + ad = Kd*(err-err_v)*0.01f; //calculo de la accion derivativa + pid = (ap+ai+ad); + // se verifica que pid sea positivo ************************************** + if(pid<=0) { - lcd.locate(0,0); - lcd.printf("Alarma: "); - lcd.locate(8,0); - lcd.printf("%02d:",Alarm.hour); - lcd.printf("%02d:",Alarm.min); - lcd.printf("%02d",Alarm.sec); - - - lcd.locate(0,1); - lcd.printf("%02d/",Alarm.mon); - lcd.printf("%02d/",Alarm.date); - lcd.printf("%02d",Alarm.year); - wait(0.1); - //// - m=wheel.getPulses(); - if(m!=0) - { - visual=0; - wheel.reset(); - m=0; - } - - //// + pid=0; } + + // se verifica que pid sea menor o igual la valor maximo ***************** + if (pid > 999) + { + pid=999; + } + + + //se muestran las variables****************************************** - if( (tm.date==Alarm.date)&&(tm.mon==Alarm.mon)&&(tm.year==Alarm.year)&&(tm.hour==Alarm.hour)&&(tm.min==Alarm.min)&&(tm.sec==Alarm.sec) ) - { - Lugar++; - lcd.cls(); - lcd.locate(0,0); - lcd.printf("Alarma Activa!!!"); - wait(1); - lcd.locate(0,0); - lcd.printf("->Desactivar "); - lcd.locate(0,1); - lcd.printf("--Aplazar "); - m=0; - } + lcd.locate(4,1); + lcd.printf("%3.0f",err); + + lcd.locate(11,1); + lcd.printf("%3.0f",pid); + + + + + //Normalizacion de la salida + // se actualizan las variables ******************************************* + err_v = err; + o = pid/999; + u.write(o); + // se envia el valor pid a puerto analogico de salida (D/A) ************** + Upwm.pulsewidth(o*periodo);//salida pwm + // se repite el ciclo + wait_ms(300); + + + break; - case 3: - - if(alarma==0) - { - Sonido.write(0.5); - wait(0.2); - Sonido.write(0); - wait(0.2); - Sonido.write(0.5); - wait(0.2); - Sonido.write(0); - wait(0.2); - - m=wheel.getPulses(); - if(m!=0) - { - alarma=1; - m=0; - wheel.reset(); - - lcd.locate(1,0); - lcd.printf("-"); - lcd.locate(1,1); - lcd.printf(">"); - } - } - - /////////////////// - - if(alarma==1) - { - Sonido.write(0.5); - wait(0.2); - Sonido.write(0); - wait(0.2); - Sonido.write(0.5); - wait(0.2); - Sonido.write(0); - wait(0.2); - - m=wheel.getPulses(); - if(m!=0) - { - alarma=0; - m=0; - wheel.reset(); - - lcd.locate(1,0); - lcd.printf(">"); - lcd.locate(1,1); - lcd.printf("-"); - } - } - - if (button_enco.falling()) - { - if(alarma==0) - { - Lugar=0; - wheel.reset(); - m=0; - Sonido.write(0); - lcd.cls(); - lcd.locate(0,0); - lcd.printf("--Alarma --Hora"); - - } - if(alarma==1) - { - Lugar=2; - rtc.getTime(tm); - if(tm.min!=58) - { - Alarm.min=tm.min+1; - } - if(tm.min==59) - { - Alarm.min=0; - Alarm.hour=tm.hour+1; - } - Alarm.sec=tm.sec; - lcd.cls(); - alarma=0; - - } - - } - - break; - } - } + } + + } } \ No newline at end of file