En este programa se presenta un PID con entrada y salida analogica

Dependencies:   TextLCD mbed

/media/uploads/amarincan/pid-button.jpg

Revision:
0:4ba2d502801f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 13 02:55:38 2013 +0000
@@ -0,0 +1,242 @@
+#include "mbed.h"
+#include "DebouncedIn.h"
+#include "TextLCD.h"
+
+
+AnalogIn Vin(PTB3);
+AnalogOut Vout(PTE30);
+
+TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
+ 
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DebouncedIn button1(PTC12);
+DebouncedIn button2(PTC13);
+DebouncedIn button3(PTC16);
+DebouncedIn button4(PTC17);
+ 
+/*    codigos movimiento del curzor
+      18 para izquierda
+      1A para derecha
+*/      
+ 
+ 
+int C1=0x0E; // solo muestra el curzor
+int C2=0x18; // desplaza izquierda
+int C3=0x1A; // desplaza derecha
+int C4=0x0C; // quito cursor bajo
+int i; // indice de la variable
+int j;
+int Kp, Ki, Kd, Sp,  yr, cycle, med2 , c; 
+float med,pid,ap, err, ai, ad,err_v;
+int main() {
+    
+    lcd.writeCommand(0x0E);
+    lcd.printf("Sp=     Kp=");
+    lcd.locate(0,1);
+    lcd.printf("Ki=     Kd=");
+    lcd.locate(2,0);
+    lcd.printf("=");
+
+    while(1) {
+      
+    
+     if(button1.falling()) {
+                                        
+            switch(i) {
+                case 0:
+                    lcd.locate(2,0);
+                    lcd.printf("=     ");
+                    lcd.locate(3,0);
+                    lcd.printf("%d",++Sp);
+                    
+                    break;
+                case 1:
+                    lcd.locate(10,0);
+                    lcd.printf("=     ");
+                    lcd.locate(11,0);
+                    lcd.printf("%d",++Kp);
+                    break;
+                case 2:
+                    
+                    lcd.locate(2,1);
+                    lcd.printf("=     ");
+                    lcd.locate(3,1);
+                    lcd.printf("%d",++Ki);
+                    break;
+                case 3:
+                    lcd.locate(10,1);
+                    lcd.printf("=     ");
+                    lcd.locate(11,1);
+                    lcd.printf("%d",++Kd);
+                    break;
+            }
+        }
+        if(button2.falling()) {
+            switch(i) {
+                case 0:
+                    if(Sp<0) {
+                        Sp=0;
+                    }
+                    lcd.locate(2,0);
+                    lcd.printf("=     ");
+                    lcd.locate(3,0);
+                    lcd.printf("%d",Sp--);
+                    break;
+                case 1:
+                    if(Kp<0) {
+                        Kp=0;
+                    }
+                    lcd.locate(10,0);
+                    lcd.printf("=     ");
+                    lcd.locate(11,0);
+                    lcd.printf("%d",Kp--);
+                    break;
+                case 2:
+                   
+                    if(Ki<0) {
+                        Ki=0;
+                    }
+                    lcd.locate(2,1);
+                    lcd.printf("=     ");
+                    lcd.locate(3,1);
+                    lcd.printf("%d",Ki--);
+                    break;
+                case 3:
+                   
+                    if(Kd<0) {
+                        Kd=0;
+                    }
+                    lcd.locate(10,1);
+                    lcd.printf("=     ");
+                    lcd.locate(11,1);
+                    lcd.printf("%d",Kd--);
+                    break;
+            }
+        }
+        if(button3.falling()) {
+            i++;
+            if(i>3) {
+                i=0;
+            }
+            switch (i) {
+                case 0:
+                    lcd.locate(2,0);
+                    lcd.printf("=");
+                    break;
+                case 1:
+                    lcd.locate(10,0);
+                    lcd.printf("=");
+                    break;
+                case 2:
+                    lcd.locate(2,1);
+                    lcd.printf("=");
+                    break;
+                case 3:
+                    lcd.locate(10,1);
+                    lcd.printf("=");
+                    break;
+            }
+        }       
+    
+              
+           if (button4.falling()){
+           break;     //sale del bucle si pisan suiche4
+               }
+                        
+                                        }
+           lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
+           lcd.cls(); //borra la pantalla
+           lcd.printf("   GUARDADOS!"); 
+           wait(2);
+           lcd.cls();
+           lcd.printf(" INICIA EL PID");
+           wait(2);
+           // se imprimen los parches del control  *****************************************
+           lcd.cls();
+         
+           
+           lcd.printf("Er%d",err);
+           lcd.locate(8,0);
+           lcd.printf("Me%d",med2);
+           lcd.locate(0,1);
+           lcd.printf("Sp%d",Sp);
+           lcd.locate(8,1);
+           lcd.printf("Pid%d",pid);
+           //wait(5);
+           
+           // CICLO PRINCIPAL CONTROLADOR PID
+         
+           while(1) {
+                              //leer puerto analogo y asignar a med
+           med=Vin.read();
+           med2=med*100;
+           err = (Sp-med2);
+           float kp2;
+           kp2=Kp*0.001;
+           ap = kp2*err;
+           float ki2;
+           ki2=Ki*0.001;           
+           ai =(ki2*err)+ai;    //calculo de la integral del error
+           float kd2;
+           kd2=Kd*0.0001;
+           ad = kd2*(err-err_v); //calculo de la accion derivativa
+           err_v=err;          //guarda el error
+           pid = (ap+ai+ad);
+           
+              // se verifica que pid sea menor o igual la valor maximo *****************
+            if (pid > .99999){
+           pid=1;
+           } 
+           
+           // se verifica que pid sea positivo **************************************
+           if (pid <0){
+           pid=0;
+           } 
+           
+            //wait(.5);
+            
+           
+           
+           // se verifica que la accion integral no sea muy grande
+           if (ai > 999){
+           ai=1000;
+           } 
+          
+           
+           Vout=pid;
+          
+                     
+           //****se muestran las variables******************************************
+          if(c>600){           
+           lcd.locate(2,0);
+           lcd.printf("      "); 
+           lcd.locate(0,0);
+           lcd.printf("Er%2.2f",err);
+           lcd.locate(10,0);
+           lcd.printf("      ");
+           lcd.locate(8,0);
+           lcd.printf("Me%d",med2);
+           lcd.locate(2,1);
+           lcd.printf("      ");
+           lcd.locate(0,1);
+           lcd.printf("Sp%d",Sp);
+           lcd.locate(10,1);
+           lcd.printf("      ");
+           lcd.locate(8,1);
+           lcd.printf("Pid%4.3f",pid);
+           c=0;
+           }
+           else 
+           c++;
+          
+                           
+           
+            
+           
+           
+           
+           //  se envia el valor pid a puerto analogico de salida (D/A) **************
+           //  se repite el ciclo
+           }
+}
\ No newline at end of file