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.
Fork of DebouncedIn_HelloWorld by
main.cpp@1:3e6a41eba6bb, 2013-12-13 (annotated)
- Committer:
- Wilmar87
- Date:
- Fri Dec 13 03:54:21 2013 +0000
- Revision:
- 1:3e6a41eba6bb
- Parent:
- 0:672241227e0d
Libreria Pantalla
Who changed what in which revision?
User | Revision | Line number | New 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 |