Control PID para un planta RC (control de la carga del capacitor), los parámetros se ingresan por medio de 4 pulsadores, teniendo en cuenta una librería antirebote y el resultado del control se visualiza en una pantalla LCD 16x2.

Dependencies:   TextLCD mbed

Fork of DebouncedIn_HelloWorld by Chris Styles

/media/uploads/Wilmar87/img_4005.jpg

Committer:
Wilmar87
Date:
Fri Dec 13 04:00:56 2013 +0000
Revision:
3:caf76da61c9f
Parent:
1:3e6a41eba6bb
change in TextLCD.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris 0:672241227e0d 1 #include "mbed.h"
chris 0:672241227e0d 2 #include "DebouncedIn.h"
Wilmar87 1:3e6a41eba6bb 3 #include "TextLCD.h"
chris 0:672241227e0d 4
Wilmar87 1:3e6a41eba6bb 5 AnalogIn Vin(PTC2);
Wilmar87 1:3e6a41eba6bb 6 AnalogOut Vout(PTE30);
chris 0:672241227e0d 7
Wilmar87 1:3e6a41eba6bb 8 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); //Puertos LCD rs, e, d4, d5, d6, d7
Wilmar87 1:3e6a41eba6bb 9
Wilmar87 1:3e6a41eba6bb 10 DigitalOut led1(LED1); //led de cambio de posición
Wilmar87 1:3e6a41eba6bb 11 DigitalOut led2(LED2); //led incremento de parámetros
Wilmar87 1:3e6a41eba6bb 12 DigitalOut led3(LED3); //led decremento de parámetros
Wilmar87 1:3e6a41eba6bb 13 DebouncedIn bot1(PTC12); //cambiar la posición
Wilmar87 1:3e6a41eba6bb 14 DebouncedIn bot2(PTC13); //incrementar variable
Wilmar87 1:3e6a41eba6bb 15 DebouncedIn bot3(PTC16); //decrementar variable
Wilmar87 1:3e6a41eba6bb 16 DebouncedIn bot4(PTC17); //salida de bucle
Wilmar87 1:3e6a41eba6bb 17
Wilmar87 1:3e6a41eba6bb 18 //Códigos LCD
Wilmar87 1:3e6a41eba6bb 19 int C1=0x0E; // Muestra el cursor
Wilmar87 1:3e6a41eba6bb 20 // 0x18; // desplazamiento izquierda
Wilmar87 1:3e6a41eba6bb 21 // 0x1A; // desplazamiento derecha
Wilmar87 1:3e6a41eba6bb 22 int C4=0x0C; // Quita el cursor
Wilmar87 1:3e6a41eba6bb 23
Wilmar87 1:3e6a41eba6bb 24
Wilmar87 1:3e6a41eba6bb 25 int a, sp, kp, ki, kd, ciclo; // indice de la variable
Wilmar87 1:3e6a41eba6bb 26 float med, sp0, ap, err, ai, ad, pid, err_v;
chris 0:672241227e0d 27
Wilmar87 1:3e6a41eba6bb 28
chris 0:672241227e0d 29 int main() {
chris 0:672241227e0d 30
Wilmar87 1:3e6a41eba6bb 31 led1=led2=led3=1;
Wilmar87 1:3e6a41eba6bb 32 lcd.printf("Control PID");
Wilmar87 1:3e6a41eba6bb 33 wait(1.5);
Wilmar87 1:3e6a41eba6bb 34 lcd.cls();
Wilmar87 1:3e6a41eba6bb 35
Wilmar87 1:3e6a41eba6bb 36 lcd.writeCommand(C1); //Comando para mostrar el cursor en el LCD
Wilmar87 1:3e6a41eba6bb 37 lcd.locate(0,0); //Ubica e imprime nombre de las variables en la LCD
Wilmar87 1:3e6a41eba6bb 38 lcd.printf("Sp=%d",sp);
Wilmar87 1:3e6a41eba6bb 39 lcd.locate(8,0);
Wilmar87 1:3e6a41eba6bb 40 lcd.printf("Kp=%d",kp);
Wilmar87 1:3e6a41eba6bb 41 lcd.locate(0,1);
Wilmar87 1:3e6a41eba6bb 42 lcd.printf("Ki=%d",ki);
Wilmar87 1:3e6a41eba6bb 43 lcd.locate(8,1);
Wilmar87 1:3e6a41eba6bb 44 lcd.printf("Kd=%d",kd);
Wilmar87 1:3e6a41eba6bb 45
Wilmar87 1:3e6a41eba6bb 46
Wilmar87 1:3e6a41eba6bb 47 //Inicio del ciclo
Wilmar87 1:3e6a41eba6bb 48
chris 0:672241227e0d 49 while(1) {
Wilmar87 1:3e6a41eba6bb 50 if (bot1.falling()) { //Aumenta posición el cursor
Wilmar87 1:3e6a41eba6bb 51 a++;
Wilmar87 1:3e6a41eba6bb 52 led1=0;
Wilmar87 1:3e6a41eba6bb 53 wait(.15); //enciende el led azul cada vez que se oprime este botón
Wilmar87 1:3e6a41eba6bb 54 led1=1;
Wilmar87 1:3e6a41eba6bb 55 if (a>3){
Wilmar87 1:3e6a41eba6bb 56 a = 0;
Wilmar87 1:3e6a41eba6bb 57 }
Wilmar87 1:3e6a41eba6bb 58 switch (a) {
Wilmar87 1:3e6a41eba6bb 59 case 0:
Wilmar87 1:3e6a41eba6bb 60
Wilmar87 1:3e6a41eba6bb 61 lcd.locate(2,0);
Wilmar87 1:3e6a41eba6bb 62 lcd.printf("=");
Wilmar87 1:3e6a41eba6bb 63 break;
Wilmar87 1:3e6a41eba6bb 64
Wilmar87 1:3e6a41eba6bb 65 case 1:
Wilmar87 1:3e6a41eba6bb 66 lcd.locate(10,0);
Wilmar87 1:3e6a41eba6bb 67 lcd.printf("=");
Wilmar87 1:3e6a41eba6bb 68 break;
Wilmar87 1:3e6a41eba6bb 69
Wilmar87 1:3e6a41eba6bb 70 case 2:
Wilmar87 1:3e6a41eba6bb 71 lcd.locate(2,1);
Wilmar87 1:3e6a41eba6bb 72 lcd.printf("=");
Wilmar87 1:3e6a41eba6bb 73 break;
Wilmar87 1:3e6a41eba6bb 74
Wilmar87 1:3e6a41eba6bb 75 case 3:
Wilmar87 1:3e6a41eba6bb 76 lcd.locate(10,1);
Wilmar87 1:3e6a41eba6bb 77 lcd.printf("=");
Wilmar87 1:3e6a41eba6bb 78 break;
Wilmar87 1:3e6a41eba6bb 79 }
Wilmar87 1:3e6a41eba6bb 80 }
Wilmar87 1:3e6a41eba6bb 81
Wilmar87 1:3e6a41eba6bb 82 if (bot2.falling()) { //Incrementa la variable
Wilmar87 1:3e6a41eba6bb 83 led2=0;
Wilmar87 1:3e6a41eba6bb 84 wait(.15); //enciende el led verde cada vez que se oprime el botón de incremento
Wilmar87 1:3e6a41eba6bb 85 led2=1;
Wilmar87 1:3e6a41eba6bb 86
Wilmar87 1:3e6a41eba6bb 87 switch (a) {
Wilmar87 1:3e6a41eba6bb 88 case 0:
Wilmar87 1:3e6a41eba6bb 89
Wilmar87 1:3e6a41eba6bb 90 lcd.locate(2,0); //Ubica el parámetro Set-point
Wilmar87 1:3e6a41eba6bb 91 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 92 lcd.locate(3,0);
Wilmar87 1:3e6a41eba6bb 93 lcd.printf("%d", ++sp);
Wilmar87 1:3e6a41eba6bb 94 break;
Wilmar87 1:3e6a41eba6bb 95
Wilmar87 1:3e6a41eba6bb 96 case 1:
Wilmar87 1:3e6a41eba6bb 97 lcd.locate(10,0); //Ubica el parámetro kp
Wilmar87 1:3e6a41eba6bb 98 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 99 lcd.locate(11,0);
Wilmar87 1:3e6a41eba6bb 100 lcd.printf("%d", ++kp);
Wilmar87 1:3e6a41eba6bb 101 break;
Wilmar87 1:3e6a41eba6bb 102
Wilmar87 1:3e6a41eba6bb 103 case 2:
Wilmar87 1:3e6a41eba6bb 104 lcd.locate(2,1); //Ubica el parámetro ki
Wilmar87 1:3e6a41eba6bb 105 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 106 lcd.locate(3,1);
Wilmar87 1:3e6a41eba6bb 107 lcd.printf("%d", ++ki);
Wilmar87 1:3e6a41eba6bb 108 break;
Wilmar87 1:3e6a41eba6bb 109
Wilmar87 1:3e6a41eba6bb 110 case 3:
Wilmar87 1:3e6a41eba6bb 111 lcd.locate(10,1); //Ubica el parámetro kd
Wilmar87 1:3e6a41eba6bb 112 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 113 lcd.locate(11,1);
Wilmar87 1:3e6a41eba6bb 114 lcd.printf("%d", ++kd);
Wilmar87 1:3e6a41eba6bb 115 break;
Wilmar87 1:3e6a41eba6bb 116 }
Wilmar87 1:3e6a41eba6bb 117 }
Wilmar87 1:3e6a41eba6bb 118 if (bot3.falling()) { //Decrementa la variable
Wilmar87 1:3e6a41eba6bb 119 wait(0.1);
Wilmar87 1:3e6a41eba6bb 120 led3=0;
Wilmar87 1:3e6a41eba6bb 121 wait(.15); //enciende el led roja cada vez que se oprime este botón
Wilmar87 1:3e6a41eba6bb 122 led3=1;
Wilmar87 1:3e6a41eba6bb 123
Wilmar87 1:3e6a41eba6bb 124 switch (a) {
Wilmar87 1:3e6a41eba6bb 125 case 0:
Wilmar87 1:3e6a41eba6bb 126 if (sp<0) { //No se admite valores negativos
Wilmar87 1:3e6a41eba6bb 127 sp=0;
Wilmar87 1:3e6a41eba6bb 128 }
Wilmar87 1:3e6a41eba6bb 129 lcd.locate(2,0); //Ubica el parámetro Set-point
Wilmar87 1:3e6a41eba6bb 130 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 131 lcd.locate(3,0);
Wilmar87 1:3e6a41eba6bb 132 lcd.printf("%d",sp--);
Wilmar87 1:3e6a41eba6bb 133 break;
Wilmar87 1:3e6a41eba6bb 134
Wilmar87 1:3e6a41eba6bb 135 case 1:
Wilmar87 1:3e6a41eba6bb 136 if (kp<0) { //No se admite valores negativos
Wilmar87 1:3e6a41eba6bb 137 kp=0;
Wilmar87 1:3e6a41eba6bb 138 }
Wilmar87 1:3e6a41eba6bb 139 lcd.locate(10,0); //Ubica el parámetro kp
Wilmar87 1:3e6a41eba6bb 140 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 141 lcd.locate(11,0);
Wilmar87 1:3e6a41eba6bb 142 lcd.printf("%d",kp--);
Wilmar87 1:3e6a41eba6bb 143 break;
Wilmar87 1:3e6a41eba6bb 144
Wilmar87 1:3e6a41eba6bb 145 case 2:
Wilmar87 1:3e6a41eba6bb 146 if (ki<0) { //No se admite valores negativos
Wilmar87 1:3e6a41eba6bb 147 ki=0;
Wilmar87 1:3e6a41eba6bb 148 }
Wilmar87 1:3e6a41eba6bb 149 lcd.locate(2,1); //Ubica el parámetro ki
Wilmar87 1:3e6a41eba6bb 150 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 151 lcd.locate(3,1);
Wilmar87 1:3e6a41eba6bb 152 lcd.printf("%d",ki--);
Wilmar87 1:3e6a41eba6bb 153 break;
Wilmar87 1:3e6a41eba6bb 154
Wilmar87 1:3e6a41eba6bb 155 case 3:
Wilmar87 1:3e6a41eba6bb 156 if (kd<0) { //No se admite valores negativos
Wilmar87 1:3e6a41eba6bb 157 kd=0;
Wilmar87 1:3e6a41eba6bb 158 }
Wilmar87 1:3e6a41eba6bb 159 lcd.locate(10,1); //Ubica el parámetro kd
Wilmar87 1:3e6a41eba6bb 160 lcd.printf("= ");
Wilmar87 1:3e6a41eba6bb 161 lcd.locate(11,1);
Wilmar87 1:3e6a41eba6bb 162 lcd.printf("%d",kd--);
Wilmar87 1:3e6a41eba6bb 163 break;
Wilmar87 1:3e6a41eba6bb 164 }
Wilmar87 1:3e6a41eba6bb 165 }
Wilmar87 1:3e6a41eba6bb 166 if (bot4.falling()){ //sale del bucle de la pantalla
Wilmar87 1:3e6a41eba6bb 167 led1=led2=led3=0; //Flash para salir del bucle
Wilmar87 1:3e6a41eba6bb 168 wait(0.25);
Wilmar87 1:3e6a41eba6bb 169 led1=led2=led3=1;
Wilmar87 1:3e6a41eba6bb 170 break;
Wilmar87 1:3e6a41eba6bb 171 }
Wilmar87 1:3e6a41eba6bb 172 }
Wilmar87 1:3e6a41eba6bb 173 lcd.writeCommand(C4); //Quita el cursor bajo del LCD
Wilmar87 1:3e6a41eba6bb 174 lcd.cls(); //borra la pantalla
Wilmar87 1:3e6a41eba6bb 175 lcd.printf("GUARDADOS!");
Wilmar87 1:3e6a41eba6bb 176 wait(2);
Wilmar87 1:3e6a41eba6bb 177 lcd.cls();
Wilmar87 1:3e6a41eba6bb 178 lcd.printf("INICIA EL PID");
Wilmar87 1:3e6a41eba6bb 179 wait(2);
Wilmar87 1:3e6a41eba6bb 180 // se imprimen los parches del control *****************************************
Wilmar87 1:3e6a41eba6bb 181 lcd.cls();
Wilmar87 1:3e6a41eba6bb 182
Wilmar87 1:3e6a41eba6bb 183 lcd.printf("Er%d",err);
Wilmar87 1:3e6a41eba6bb 184 lcd.locate(8,0);
Wilmar87 1:3e6a41eba6bb 185 lcd.printf("Me%d",med);
Wilmar87 1:3e6a41eba6bb 186 lcd.locate(0,1);
Wilmar87 1:3e6a41eba6bb 187 lcd.printf("Sp%d",sp0);
Wilmar87 1:3e6a41eba6bb 188 lcd.locate(8,1);
Wilmar87 1:3e6a41eba6bb 189 lcd.printf("Pid%d",pid);
Wilmar87 1:3e6a41eba6bb 190
Wilmar87 1:3e6a41eba6bb 191 // CICLO PRINCIPAL CONTROLADOR PID
Wilmar87 1:3e6a41eba6bb 192
Wilmar87 1:3e6a41eba6bb 193 while(1) {
Wilmar87 1:3e6a41eba6bb 194
Wilmar87 1:3e6a41eba6bb 195 wait(0.001);
Wilmar87 1:3e6a41eba6bb 196 //leer puerto analogo y asignar a med
Wilmar87 1:3e6a41eba6bb 197
Wilmar87 1:3e6a41eba6bb 198
Wilmar87 1:3e6a41eba6bb 199 med = (Vin*3.27);
Wilmar87 1:3e6a41eba6bb 200 sp0 = sp*0.0327;
Wilmar87 1:3e6a41eba6bb 201 err = (sp0-med);
Wilmar87 1:3e6a41eba6bb 202 float kp0;
Wilmar87 1:3e6a41eba6bb 203 kp0 = kp*0.001;
Wilmar87 1:3e6a41eba6bb 204 ap = kp0*err;
Wilmar87 1:3e6a41eba6bb 205 float ki0;
Wilmar87 1:3e6a41eba6bb 206 ki0 = ki*0.001;
Wilmar87 1:3e6a41eba6bb 207 ai = (ki0*err)+ai; //calculo de la integral del error
Wilmar87 1:3e6a41eba6bb 208 float kd0;
Wilmar87 1:3e6a41eba6bb 209 kd0 = kd*0.0001;
Wilmar87 1:3e6a41eba6bb 210 ad = kd0*(err-err_v); //calculo de la accion derivativa
Wilmar87 1:3e6a41eba6bb 211 pid = ap+ai+ad;
Wilmar87 1:3e6a41eba6bb 212
Wilmar87 1:3e6a41eba6bb 213
Wilmar87 1:3e6a41eba6bb 214 // se verifica que pid sea menor o igual la valor maximo *****************
Wilmar87 1:3e6a41eba6bb 215 if (pid > 0.999){
Wilmar87 1:3e6a41eba6bb 216 pid=1;
Wilmar87 1:3e6a41eba6bb 217 }
Wilmar87 1:3e6a41eba6bb 218
Wilmar87 1:3e6a41eba6bb 219 // se verifica que pid sea positivo **************************************
Wilmar87 1:3e6a41eba6bb 220 if (pid < 0){
Wilmar87 1:3e6a41eba6bb 221 pid=0;
Wilmar87 1:3e6a41eba6bb 222 }
Wilmar87 1:3e6a41eba6bb 223
Wilmar87 1:3e6a41eba6bb 224 // se verifica que la accion integral no sea muy grande
Wilmar87 1:3e6a41eba6bb 225 if (ai > 999){
Wilmar87 1:3e6a41eba6bb 226 ai=1000;
Wilmar87 1:3e6a41eba6bb 227 }
Wilmar87 1:3e6a41eba6bb 228
Wilmar87 1:3e6a41eba6bb 229 Vout=(pid);
Wilmar87 1:3e6a41eba6bb 230 //Mostrar resultados PID
Wilmar87 1:3e6a41eba6bb 231 if(ciclo>700) {
Wilmar87 1:3e6a41eba6bb 232 lcd.locate(2,0);
Wilmar87 1:3e6a41eba6bb 233 lcd.printf(" ");
Wilmar87 1:3e6a41eba6bb 234 lcd.locate(0,0);
Wilmar87 1:3e6a41eba6bb 235 lcd.printf("Er%2.1f",err);
Wilmar87 1:3e6a41eba6bb 236 lcd.locate(10,0);
Wilmar87 1:3e6a41eba6bb 237 lcd.printf(" ");
Wilmar87 1:3e6a41eba6bb 238 lcd.locate(8,0);
Wilmar87 1:3e6a41eba6bb 239 lcd.printf("Me%4.2f",med);
Wilmar87 1:3e6a41eba6bb 240 lcd.locate(2,1);
Wilmar87 1:3e6a41eba6bb 241 lcd.printf(" ");
Wilmar87 1:3e6a41eba6bb 242 lcd.locate(0,1);
Wilmar87 1:3e6a41eba6bb 243 lcd.printf("Sp%4.2f",sp0);
Wilmar87 1:3e6a41eba6bb 244 lcd.locate(10,1);
Wilmar87 1:3e6a41eba6bb 245 lcd.printf(" ");
Wilmar87 1:3e6a41eba6bb 246 lcd.locate(8,1);
Wilmar87 1:3e6a41eba6bb 247 lcd.printf("Pid%4.3f",pid);
Wilmar87 1:3e6a41eba6bb 248 ciclo=0;
Wilmar87 1:3e6a41eba6bb 249 }
Wilmar87 1:3e6a41eba6bb 250 else
Wilmar87 1:3e6a41eba6bb 251 ciclo++;
Wilmar87 1:3e6a41eba6bb 252 err_v = err; //guarda el error
Wilmar87 1:3e6a41eba6bb 253 } // Envía parámetro pid al puerto analogico de salida (D/A) y se repite el ciclo
Wilmar87 1:3e6a41eba6bb 254 }
Wilmar87 1:3e6a41eba6bb 255