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

Dependencies:   TextLCD mbed

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

main.cpp

Committer:
amarincan
Date:
2013-11-13
Revision:
0:4ba2d502801f

File content as of revision 0:4ba2d502801f:

#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
           }
}