PROCESADORES - 2016-03. TAREA 1. PID+ANDROID+BLUETOOTH
Dependencies: DebouncedIn QEI TextLCD mbed
Fork of PID_ENCODER_OK by
Tarea 1: PID + Android + Bluetooth
PROCESADORES - 2016-03
Por:
- Jaime Alonso Osorio Palacio
- David Fuertes Chaguezac
- Wilson Anibal Ortega Andrade
- John Wilmer Ruiz López
Recibe por medio de un módulo Bluetooth HC-05 ZS-040 desde un dispositivo Android los parámetros SP, KP, KI y KD. Crea un PID que se prueba sobre una planta de primer orden RC conformado por una resistencia R=11kOhm y un capacitor C=22uF cuya salida y realimentación se conectan por los puertos analógicos determinados en la FRDM KL25Z. Para más información:
- https://developer.mbed.org/users/tony63/code/PID_ENCODER_OK/
Reenvía continuamente el error, la medida, el SP y la acción de control hacia el dispositivo Android. Estos también son mostrados en una LCD 16x2.
Posee depuración via USB en una terminal (se usó Termite 3.2.) para conocer los estados en los que se encuentra el programa y verificar los datos.
La aplicación para Android se realizó en APP Inventor y se puede descargar en:
- https://www.dropbox.com/s/gfhh003rq3nknmp/PID_ANDRIOD_ENTEROS.aia?dl=0
IMÁGENES:
main.cpp
- Committer:
- tony63
- Date:
- 2016-04-24
- Revision:
- 1:058b8f5c135d
- Parent:
- 0:4e0dfcf0e7ce
- Child:
- 2:278af91e46ff
File content as of revision 1:058b8f5c135d:
#include "mbed.h" #include "QEI.h" #include "TextLCD.h" TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 QEI encoder (PTA13, PTD5, NC, 624); AnalogIn y(PTB3);//entrada analoga AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer //si se ignora esto se arruina la FRDMKL25Z DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalIn button3(PTC16);//cambia ingreso de los 4 parametros DigitalIn button4(PTC17);//termina y consolida valores de 4 parametros y sale del loop //codigos movimiento del curzor //int C1=0x0E; // solo muestra el curzor int C2=0x18; // desplaza izquierda int C3=0x1A; // desplaza derecha int C4=0x0C; // quito cursor bajo int C1=0x0F; int cambio=0, diferencia=0; float pid,o,ai,ad,ap,med,err; float err_v; int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1; int main() { lcd.locate(0,1); lcd.printf("**Control PID**"); wait(2); lcd.cls(); // Borrar Pantalla lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD lcd.locate(8,0); lcd.printf("Kp=%d",kpnum); lcd.locate(0,1); lcd.printf("Ki=%d",kinum); lcd.locate(8,1); lcd.printf("Kd=%d",kdnum); lcd.locate(0,0); lcd.printf("Sp=%d",spnum); while(1) { //lcd.locate(8,0); //lcd.printf("Kp=%d",encoder.getPulses()); //wait(.5); diferencia=encoder.getPulses()-cambio; cambio=encoder.getPulses(); if (diferencia==0) { //nada } else if(diferencia>0) { if(pos==1) { if(spnum+diferencia>=999) { spnum=999; lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); lcd.printf("%d", spnum); } else { spnum+=diferencia; lcd.locate(3,0); lcd.printf("%d", spnum); } } else if(pos==2) { if(kpnum+diferencia>=999) { kpnum=999; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%d", kpnum); } else { kpnum+=diferencia; lcd.locate(11,0); lcd.printf("%d", kpnum); } } else if(pos==3) { if(kinum+diferencia>=999) { kinum=999; lcd.locate(3,1); lcd.printf(" "); lcd.locate(3,1); lcd.printf("%d", kinum); } else { kinum+=diferencia; lcd.locate(3,1); lcd.printf("%d", kinum); } } else if(pos==4) { if(kdnum+diferencia>=999) { kdnum=999; lcd.locate(11,1); lcd.printf(" "); lcd.locate(11,1); lcd.printf("%d", kdnum); } else { kdnum+=diferencia; lcd.locate(11,1); lcd.printf("%d", kdnum); } } } else if(diferencia<0) { if(pos==1) { if(spnum+diferencia<0) { //No ocurre nada } else { spnum+=diferencia; lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); lcd.printf("%d", spnum); } } else if(pos==2) { if(kpnum+diferencia<0) { //No ocurre nada } else { kpnum+=diferencia; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%d", kpnum); } } else if(pos==3) { if(kinum+diferencia<0) { //No ocurre nada } else { kinum+=diferencia; lcd.locate(3,1); lcd.printf(" "); lcd.locate(3,1); lcd.printf("%d", kinum); } } else if(pos==4) { if(kdnum+diferencia<0) { //No ocurre nada } else { kdnum+=diferencia; lcd.locate(11,1); lcd.printf(" "); lcd.locate(11,1); lcd.printf("%d", kdnum); } } } if (!button3) //cambia la posicion de ingreso de parametros { led3 =!led3; if(pos==4) { pos=1; lcd.locate(3,0); lcd.printf("%d", spnum); } else if (pos==1) { pos++; lcd.locate(11,0); lcd.printf("%d", kpnum); } else if(pos==2) { pos++; lcd.locate(3,1); lcd.printf("%d", kinum); } else if(pos==3) { pos++; lcd.locate(11,1); lcd.printf("%d", kdnum); } wait(0.25); } if (!button4) { break; //sale del bucle si pisan suiche4 } wait(0.1); } //Transicion lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo lcd.cls(); //borra la pantalla lcd.printf(" GUARDADOS!"); wait(1); lcd.cls(); lcd.printf(" INICIA EL PID"); wait(1); // se imprimen los parches del control ***************************************** lcd.cls(); lcd.printf("Er=%3.0f",err); lcd.locate(8,0); lcd.printf("Me=%3.0f",med); lcd.locate(0,1); lcd.printf("Sp=%3.0f",spnum); lcd.locate(8,1); lcd.printf("Co=%3.0f",pid); wait(1); // CICLO PRINCIPAL CONTROLADOR PID lop1: med = y.read()*999; err = (spnum-med); //se calcula el error ap = kpnum*err*0.01f; //se calcula la accion proporcinal ai =(kinum*err*0.01f)+ai; //calculo de la integral del error ad = kdnum*(err-err_v)*0.01f; //calculo de la accion derivativa pid = (ap+ai+ad); // se verifica que pid sea positivo ************************************** if(pid<=0) { pid=0; } // se verifica que pid sea menor o igual la valor maximo ***************** if (pid > 999) { pid=999; } //se muestran las variables****************************************** lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); lcd.printf("%3.0f",err); lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%3.0f",med); lcd.locate(3,1); lcd.printf(" "); lcd.locate(3,1); lcd.printf("%d",spnum); lcd.locate(11,1); lcd.printf(" "); 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) ************** // se repite el ciclo wait_ms(300); goto lop1; }