d
Dependencies: Debounced QEI mbed
main.cpp
- Committer:
- salvarear
- Date:
- 2013-12-12
- Revision:
- 1:e214227f5d00
- Parent:
- 0:93983293c81b
File content as of revision 1:e214227f5d00:
#include "mbed.h" #include "DebouncedIn.h" #include "TextLCD.h" #include "QEI.h" AnalogIn Vin(PTB0); //entrada de la planta AnalogOut Vout(PTE30); //salida hacia la planta QEI wheel (PTA16, PTA17, NC, 24); //distribucion de pines para el encoder. TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DebouncedIn button1(PTC12); // Aumento DebouncedIn button2(PTC13); // Disminución DebouncedIn button3(PTC16); // Cambio de variable DebouncedIn button4(PTC17); // Reset 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; int j,kp,ki,kd,sp,cont,medida,cont1,cont2,cont3; float pid, err, ap, ai, ad, err_v, spf,kif,kpf,kdf,med; int main() { lcd.writeCommand(C1); lcd.printf("Sp=0 Kp=0"); lcd.locate(0,1); lcd.printf("Ki=0 Kd=0"); lcd.locate(2,0); lcd.printf("="); while(1) { cont1=wheel.getPulses(); //inicia el encoder if(cont1<0){ wheel.reset(); cont1=0; } if(cont1!=cont2) { switch(i) { case 0: lcd.locate(2,0); lcd.printf("= "); lcd.locate(3,0); lcd.printf("%d",cont1); sp=cont1; break; case 1: lcd.locate(10,0); lcd.printf("= "); lcd.locate(11,0); lcd.printf("%d",med); kp=medida; break; case 2: lcd.locate(2,1); lcd.printf("= "); lcd.locate(3,1); lcd.printf("%d",med); ki=med; break; case 3: lcd.locate(10,1); lcd.printf("= "); lcd.locate(11,1); lcd.printf("%d",med); kd=med; break; } cont2=cont1; } if(button3.falling()) { //al oprimir el encoder wheel.reset(); 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()){ lcd.locate(0,1); lcd.printf("Ha salido del programa "); break; } } lcd.writeCommand(C4); led3=1; led3= !led3; lcd.cls(); lcd.printf(" DATOS GUARDADOS!"); wait(0.8); lcd.cls(); lcd.printf("INICIANDO EL PID"); wait(0.2); lcd.cls(); lcd.printf("Er%d",err); lcd.locate(8,0); lcd.printf("Med%d",med); lcd.locate(0,1); lcd.printf("Sp%d",sp); lcd.locate(8,1); lcd.printf("pid%d",pid); wait(0.5); // CICLO PRINCIPAL CONTROLADOR PID while(1) { med=Vin.read(); medida=med*100; kpf=kp*0.001; kif=ki*0.001; kdf=kd*0.0001; err = (sp-medida); ap = kpf*err; ai =(kif*err)+ai; //calculo de la integral del error ad = kdf*(err-err_v); //calculo de la accion derivativa err_v=err; //guarda el error pid = (ap+ai+ad); if (pid > 99){ pid=100; } if (pid <0){ pid=0; } wait(.5); // se verifica que la accion integral no sea muy grande if (ai > 999){ ai=1000; } Vout=pid; 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",medida); 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.2f",pid); cont=0; } }