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 Gustavo Ramirez

Revision:
2:a4b764672482
Parent:
1:0639f31dd59f
--- 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