programa para hacer control PID simple
Fork of DebouncedIn_HelloWorld by
main.cpp
00001 #include "mbed.h" 00002 #include "DebouncedIn.h" 00003 #include "TextLCD.h" 00004 AnalogIn Vin(PTC2); 00005 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 00006 00007 DigitalOut led1(LED1); 00008 DigitalOut led2(LED2); 00009 DebouncedIn button1(PTC12); 00010 DebouncedIn button2(PTC13); 00011 DebouncedIn button3(PTC16); 00012 DebouncedIn button4(PTC17); 00013 00014 /* codigos movimiento del curzor 00015 18 para izquierda 00016 1A para derecha 00017 */ 00018 00019 00020 int C1=0x0E; // solo muestra el curzor 00021 int C2=0x18; // desplaza izquierda 00022 int C3=0x1A; // desplaza derecha 00023 int C4=0x0C; // quito cursor bajo 00024 int i; // indice de la variable 00025 int j; 00026 int kp, ki, kd, sp, err, med, yr, pid, ap, ai, ad, err_v, cycle; 00027 00028 int main() { 00029 lcd.cls(); 00030 lcd.printf("Sp%d",sp); 00031 lcd.locate(8,0); 00032 lcd.printf("Kp%d",kp); 00033 lcd.locate(0,1); 00034 lcd.printf("Ki%d",ki); 00035 lcd.locate(8,1); 00036 lcd.printf("Kd%d",kd); 00037 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD 00038 lcd.locate(0,0); 00039 lcd.printf("Sp%d",sp); 00040 00041 00042 while(1) { 00043 if (button3.falling()) { 00044 ++j; 00045 } //INCREMENTA POSICION DEL MENU COB BOTON 3 00046 if (j==0){ 00047 lcd.locate(2,0); 00048 lcd.printf("%d",sp); 00049 if (button1.falling()) { 00050 ++sp; // ademas revisa boton 1 para incrementar 00051 } 00052 if (button2.falling()) { 00053 --sp; // ademas revisa boton 2 para decrementar 00054 } 00055 } 00056 if (j==1) { 00057 lcd.locate(10,0); 00058 lcd.printf("%d",kp); 00059 if (button1.falling()) { 00060 ++kp; 00061 } 00062 if (button2.falling()) { 00063 --kp; 00064 } 00065 } 00066 if (j==2) { 00067 lcd.locate(2,1); 00068 lcd.printf("%d",ki); 00069 if (button1.falling()){ 00070 ++ki; 00071 } 00072 if (button2.falling()){ 00073 --ki; 00074 } 00075 } 00076 if (j==3) { 00077 lcd.locate(10,1); 00078 lcd.printf("%d",kd); 00079 if (button1.falling()){ 00080 ++kd; 00081 } 00082 if (button2.falling()){ 00083 --kd; 00084 } 00085 } 00086 if (j==4) { 00087 j=0; 00088 } 00089 00090 if (button4.falling()){ 00091 break; //sale del bucle si pisan suiche4 00092 } 00093 00094 } 00095 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo 00096 lcd.cls(); //borra la pantalla 00097 lcd.printf(" GUARDADOS!"); 00098 wait(2); 00099 lcd.cls(); 00100 lcd.printf(" INICIA EL PID"); 00101 wait(2); 00102 // se imprimen los parches del control ***************************************** 00103 lcd.cls(); 00104 lcd.printf("Er%d",err); 00105 lcd.locate(8,0); 00106 lcd.printf("Me%d",med); 00107 lcd.locate(0,1); 00108 lcd.printf("Sp%d",sp); 00109 lcd.locate(8,1); 00110 lcd.printf("Co%d",pid); 00111 wait(5); 00112 00113 // CICLO PRINCIPAL CONTROLADOR PID 00114 00115 while(1) { 00116 //leer puerto analogo y asignar a med 00117 err = (sp-med); 00118 ap = kp*err; 00119 ai =(ki*err)+ai; //calculo de la integral del error 00120 // se verifica que la accion integral no sea muy grande 00121 ad = kd*(err-err_v); //calculo de la accion derivativa 00122 pid = (ap+ai+ad); 00123 //****se muestran las variables****************************************** 00124 if (pid > 999){ 00125 pid=1000; 00126 } 00127 00128 wait(.5); 00129 lcd.locate(2,0); 00130 lcd.printf("%d",err); 00131 lcd.locate(10,0); 00132 lcd.printf("%d",med); 00133 lcd.locate(2,1); 00134 lcd.printf("%d",sp); 00135 lcd.locate(10,1); 00136 lcd.printf("%d",pid); 00137 00138 00139 // se actualizan las variables ******************************************* 00140 err_v = err; 00141 // se verifica que pid sea positivo ************************************** 00142 00143 // se verifica que pid sea menor o igual la valor maximo ***************** 00144 00145 00146 // se envia el valor pid a puerto analogico de salida (D/A) ************** 00147 // se repite el ciclo 00148 } 00149 }
Generated on Wed Jul 13 2022 11:59:10 by 1.7.2