![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
pid teclas tarea 3
Dependencies: Debounced TextLCD mbed
Fork of pid_teclas by
main.cpp@1:0978505fcc1b, 2015-04-10 (annotated)
- Committer:
- procesadores_FAC
- Date:
- Fri Apr 10 02:26:50 2015 +0000
- Revision:
- 1:0978505fcc1b
- Parent:
- 0:9aa80672eb3d
pid teclado
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lcorralesc1 | 0:9aa80672eb3d | 1 | #include "mbed.h" |
lcorralesc1 | 0:9aa80672eb3d | 2 | #include "DebouncedIn.h" |
lcorralesc1 | 0:9aa80672eb3d | 3 | #include "TextLCD.h" |
lcorralesc1 | 0:9aa80672eb3d | 4 | |
lcorralesc1 | 0:9aa80672eb3d | 5 | AnalogIn Vin(PTC2); |
procesadores_FAC | 1:0978505fcc1b | 6 | AnalogOut Vout(PTE30); |
lcorralesc1 | 0:9aa80672eb3d | 7 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 |
lcorralesc1 | 0:9aa80672eb3d | 8 | |
procesadores_FAC | 1:0978505fcc1b | 9 | |
lcorralesc1 | 0:9aa80672eb3d | 10 | DebouncedIn button1(PTC12); |
lcorralesc1 | 0:9aa80672eb3d | 11 | DebouncedIn button2(PTC13); |
lcorralesc1 | 0:9aa80672eb3d | 12 | DebouncedIn button3(PTC16); |
procesadores_FAC | 1:0978505fcc1b | 13 | DebouncedIn button4(PTC17); |
lcorralesc1 | 0:9aa80672eb3d | 14 | |
lcorralesc1 | 0:9aa80672eb3d | 15 | int C1=0x0F; |
procesadores_FAC | 1:0978505fcc1b | 16 | int C4=0x0C; // quito cursor bajo |
lcorralesc1 | 0:9aa80672eb3d | 17 | int sp=0,kp=0,kd=0,ki=0,p=1; |
procesadores_FAC | 1:0978505fcc1b | 18 | int med,err,pid,ap,ai=0,ai1,ad,err_v; |
procesadores_FAC | 1:0978505fcc1b | 19 | int i; |
procesadores_FAC | 1:0978505fcc1b | 20 | int fe; |
procesadores_FAC | 1:0978505fcc1b | 21 | float pidn; |
procesadores_FAC | 1:0978505fcc1b | 22 | |
procesadores_FAC | 1:0978505fcc1b | 23 | |
lcorralesc1 | 0:9aa80672eb3d | 24 | int main() |
lcorralesc1 | 0:9aa80672eb3d | 25 | { |
lcorralesc1 | 0:9aa80672eb3d | 26 | lcd.cls(); |
lcorralesc1 | 0:9aa80672eb3d | 27 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
lcorralesc1 | 0:9aa80672eb3d | 28 | lcd.locate(8,0); |
procesadores_FAC | 1:0978505fcc1b | 29 | lcd.printf("Fe=%d", fe); |
lcorralesc1 | 0:9aa80672eb3d | 30 | lcd.locate(0,1); |
procesadores_FAC | 1:0978505fcc1b | 31 | lcd.printf("P=%d", kp); |
procesadores_FAC | 1:0978505fcc1b | 32 | lcd.locate(6,1); |
procesadores_FAC | 1:0978505fcc1b | 33 | lcd.printf("I=%d", ki); |
procesadores_FAC | 1:0978505fcc1b | 34 | lcd.locate(11,1); |
procesadores_FAC | 1:0978505fcc1b | 35 | lcd.printf("D=%d", kd); |
lcorralesc1 | 0:9aa80672eb3d | 36 | lcd.locate(0,0); |
lcorralesc1 | 0:9aa80672eb3d | 37 | lcd.printf("Sp=%d", sp); |
lcorralesc1 | 0:9aa80672eb3d | 38 | |
lcorralesc1 | 0:9aa80672eb3d | 39 | while(1) |
lcorralesc1 | 0:9aa80672eb3d | 40 | { |
lcorralesc1 | 0:9aa80672eb3d | 41 | if (button1.falling()) |
lcorralesc1 | 0:9aa80672eb3d | 42 | { |
procesadores_FAC | 1:0978505fcc1b | 43 | |
lcorralesc1 | 0:9aa80672eb3d | 44 | if (p==1) |
lcorralesc1 | 0:9aa80672eb3d | 45 | { |
lcorralesc1 | 0:9aa80672eb3d | 46 | ++sp; |
lcorralesc1 | 0:9aa80672eb3d | 47 | lcd.locate(3,0); |
lcorralesc1 | 0:9aa80672eb3d | 48 | lcd.printf(" "); |
lcorralesc1 | 0:9aa80672eb3d | 49 | lcd.locate(3,0); |
lcorralesc1 | 0:9aa80672eb3d | 50 | lcd.printf("%d", sp); |
lcorralesc1 | 0:9aa80672eb3d | 51 | } |
lcorralesc1 | 0:9aa80672eb3d | 52 | else if (p==2) |
lcorralesc1 | 0:9aa80672eb3d | 53 | { |
procesadores_FAC | 1:0978505fcc1b | 54 | ++i; |
procesadores_FAC | 1:0978505fcc1b | 55 | if (i==1){ |
procesadores_FAC | 1:0978505fcc1b | 56 | fe =1;} |
procesadores_FAC | 1:0978505fcc1b | 57 | if (i==2){ |
procesadores_FAC | 1:0978505fcc1b | 58 | fe =10;} |
procesadores_FAC | 1:0978505fcc1b | 59 | if (i==3){ |
procesadores_FAC | 1:0978505fcc1b | 60 | fe =100; |
procesadores_FAC | 1:0978505fcc1b | 61 | i=0;} |
procesadores_FAC | 1:0978505fcc1b | 62 | |
lcorralesc1 | 0:9aa80672eb3d | 63 | lcd.locate(11,0); |
lcorralesc1 | 0:9aa80672eb3d | 64 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 65 | lcd.locate(12,0); |
procesadores_FAC | 1:0978505fcc1b | 66 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 67 | lcd.locate(13,0); |
procesadores_FAC | 1:0978505fcc1b | 68 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 69 | |
procesadores_FAC | 1:0978505fcc1b | 70 | |
lcorralesc1 | 0:9aa80672eb3d | 71 | lcd.locate(11,0); |
procesadores_FAC | 1:0978505fcc1b | 72 | lcd.printf("%d", fe); |
lcorralesc1 | 0:9aa80672eb3d | 73 | } |
lcorralesc1 | 0:9aa80672eb3d | 74 | else if (p==3) |
lcorralesc1 | 0:9aa80672eb3d | 75 | { |
procesadores_FAC | 1:0978505fcc1b | 76 | ++kp; |
procesadores_FAC | 1:0978505fcc1b | 77 | lcd.locate(2,1); |
lcorralesc1 | 0:9aa80672eb3d | 78 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 79 | lcd.locate(2,1); |
procesadores_FAC | 1:0978505fcc1b | 80 | lcd.printf("%d", kp); |
lcorralesc1 | 0:9aa80672eb3d | 81 | } |
lcorralesc1 | 0:9aa80672eb3d | 82 | else if (p==4) |
lcorralesc1 | 0:9aa80672eb3d | 83 | { |
procesadores_FAC | 1:0978505fcc1b | 84 | ++ki; |
procesadores_FAC | 1:0978505fcc1b | 85 | lcd.locate(8,1); |
procesadores_FAC | 1:0978505fcc1b | 86 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 87 | lcd.locate(8,1); |
procesadores_FAC | 1:0978505fcc1b | 88 | lcd.printf("%d", ki); |
procesadores_FAC | 1:0978505fcc1b | 89 | } |
procesadores_FAC | 1:0978505fcc1b | 90 | else if (p==5) |
procesadores_FAC | 1:0978505fcc1b | 91 | { |
lcorralesc1 | 0:9aa80672eb3d | 92 | ++kd; |
procesadores_FAC | 1:0978505fcc1b | 93 | lcd.locate(13,1); |
lcorralesc1 | 0:9aa80672eb3d | 94 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 95 | lcd.locate(13,1); |
lcorralesc1 | 0:9aa80672eb3d | 96 | lcd.printf("%d", kd); |
lcorralesc1 | 0:9aa80672eb3d | 97 | } |
lcorralesc1 | 0:9aa80672eb3d | 98 | } |
lcorralesc1 | 0:9aa80672eb3d | 99 | if (button2.falling()) |
lcorralesc1 | 0:9aa80672eb3d | 100 | { |
procesadores_FAC | 1:0978505fcc1b | 101 | |
lcorralesc1 | 0:9aa80672eb3d | 102 | if (p==1) |
lcorralesc1 | 0:9aa80672eb3d | 103 | { |
lcorralesc1 | 0:9aa80672eb3d | 104 | if (sp==0) // no mostrar nada |
lcorralesc1 | 0:9aa80672eb3d | 105 | { |
lcorralesc1 | 0:9aa80672eb3d | 106 | } |
lcorralesc1 | 0:9aa80672eb3d | 107 | else |
lcorralesc1 | 0:9aa80672eb3d | 108 | { |
lcorralesc1 | 0:9aa80672eb3d | 109 | --sp; |
lcorralesc1 | 0:9aa80672eb3d | 110 | lcd.locate(3,0); |
lcorralesc1 | 0:9aa80672eb3d | 111 | lcd.printf(" "); |
lcorralesc1 | 0:9aa80672eb3d | 112 | lcd.locate(3,0); |
lcorralesc1 | 0:9aa80672eb3d | 113 | lcd.printf("%d", sp); |
lcorralesc1 | 0:9aa80672eb3d | 114 | } |
lcorralesc1 | 0:9aa80672eb3d | 115 | } |
procesadores_FAC | 1:0978505fcc1b | 116 | |
procesadores_FAC | 1:0978505fcc1b | 117 | if (p==3) |
lcorralesc1 | 0:9aa80672eb3d | 118 | { |
lcorralesc1 | 0:9aa80672eb3d | 119 | if (kp==0) // no mostrar nada |
lcorralesc1 | 0:9aa80672eb3d | 120 | { |
lcorralesc1 | 0:9aa80672eb3d | 121 | } |
lcorralesc1 | 0:9aa80672eb3d | 122 | else |
lcorralesc1 | 0:9aa80672eb3d | 123 | { |
lcorralesc1 | 0:9aa80672eb3d | 124 | --kp; |
procesadores_FAC | 1:0978505fcc1b | 125 | lcd.locate(2,1); |
lcorralesc1 | 0:9aa80672eb3d | 126 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 127 | lcd.locate(2,1); |
lcorralesc1 | 0:9aa80672eb3d | 128 | lcd.printf("%d", kp); |
lcorralesc1 | 0:9aa80672eb3d | 129 | } |
lcorralesc1 | 0:9aa80672eb3d | 130 | } |
procesadores_FAC | 1:0978505fcc1b | 131 | if (p==4) |
lcorralesc1 | 0:9aa80672eb3d | 132 | { |
lcorralesc1 | 0:9aa80672eb3d | 133 | if (ki==0) // no mostrar nada |
lcorralesc1 | 0:9aa80672eb3d | 134 | { |
lcorralesc1 | 0:9aa80672eb3d | 135 | } |
lcorralesc1 | 0:9aa80672eb3d | 136 | else |
lcorralesc1 | 0:9aa80672eb3d | 137 | { |
lcorralesc1 | 0:9aa80672eb3d | 138 | --ki; |
procesadores_FAC | 1:0978505fcc1b | 139 | lcd.locate(8,1); |
lcorralesc1 | 0:9aa80672eb3d | 140 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 141 | lcd.locate(8,1); |
lcorralesc1 | 0:9aa80672eb3d | 142 | lcd.printf("%d", ki); |
lcorralesc1 | 0:9aa80672eb3d | 143 | } |
lcorralesc1 | 0:9aa80672eb3d | 144 | } |
procesadores_FAC | 1:0978505fcc1b | 145 | if (p==5) |
lcorralesc1 | 0:9aa80672eb3d | 146 | { |
lcorralesc1 | 0:9aa80672eb3d | 147 | if (kd==0) // no mostrar nada |
lcorralesc1 | 0:9aa80672eb3d | 148 | { |
lcorralesc1 | 0:9aa80672eb3d | 149 | } |
lcorralesc1 | 0:9aa80672eb3d | 150 | else |
lcorralesc1 | 0:9aa80672eb3d | 151 | { |
lcorralesc1 | 0:9aa80672eb3d | 152 | --kd; |
procesadores_FAC | 1:0978505fcc1b | 153 | lcd.locate(13,1); |
lcorralesc1 | 0:9aa80672eb3d | 154 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 155 | lcd.locate(13,1); |
lcorralesc1 | 0:9aa80672eb3d | 156 | lcd.printf("%d", kd); |
lcorralesc1 | 0:9aa80672eb3d | 157 | } |
lcorralesc1 | 0:9aa80672eb3d | 158 | } |
lcorralesc1 | 0:9aa80672eb3d | 159 | } |
procesadores_FAC | 1:0978505fcc1b | 160 | |
procesadores_FAC | 1:0978505fcc1b | 161 | if (button3.falling()) |
procesadores_FAC | 1:0978505fcc1b | 162 | { |
lcorralesc1 | 0:9aa80672eb3d | 163 | if (p==1) |
lcorralesc1 | 0:9aa80672eb3d | 164 | { |
lcorralesc1 | 0:9aa80672eb3d | 165 | ++p; |
lcorralesc1 | 0:9aa80672eb3d | 166 | lcd.locate(11,0); |
procesadores_FAC | 1:0978505fcc1b | 167 | lcd.printf("%d", fe); |
lcorralesc1 | 0:9aa80672eb3d | 168 | } |
lcorralesc1 | 0:9aa80672eb3d | 169 | else if (p==2) |
lcorralesc1 | 0:9aa80672eb3d | 170 | { |
lcorralesc1 | 0:9aa80672eb3d | 171 | ++p; |
procesadores_FAC | 1:0978505fcc1b | 172 | lcd.locate(2,1); |
procesadores_FAC | 1:0978505fcc1b | 173 | lcd.printf("%d", kp); |
procesadores_FAC | 1:0978505fcc1b | 174 | lcd.locate(2,1); |
lcorralesc1 | 0:9aa80672eb3d | 175 | } |
lcorralesc1 | 0:9aa80672eb3d | 176 | else if (p==3) |
lcorralesc1 | 0:9aa80672eb3d | 177 | { |
lcorralesc1 | 0:9aa80672eb3d | 178 | ++p; |
procesadores_FAC | 1:0978505fcc1b | 179 | lcd.locate(8,1); |
procesadores_FAC | 1:0978505fcc1b | 180 | lcd.printf("%d", ki); |
lcorralesc1 | 0:9aa80672eb3d | 181 | } |
lcorralesc1 | 0:9aa80672eb3d | 182 | else if (p==4) |
lcorralesc1 | 0:9aa80672eb3d | 183 | { |
procesadores_FAC | 1:0978505fcc1b | 184 | ++p; |
procesadores_FAC | 1:0978505fcc1b | 185 | lcd.locate(13,1); |
procesadores_FAC | 1:0978505fcc1b | 186 | lcd.printf("%d", kd); |
procesadores_FAC | 1:0978505fcc1b | 187 | } |
procesadores_FAC | 1:0978505fcc1b | 188 | else if (p==5) |
procesadores_FAC | 1:0978505fcc1b | 189 | { |
lcorralesc1 | 0:9aa80672eb3d | 190 | p=1; |
lcorralesc1 | 0:9aa80672eb3d | 191 | lcd.locate(3,0); |
procesadores_FAC | 1:0978505fcc1b | 192 | lcd.printf("%d", sp); |
lcorralesc1 | 0:9aa80672eb3d | 193 | } |
procesadores_FAC | 1:0978505fcc1b | 194 | |
lcorralesc1 | 0:9aa80672eb3d | 195 | } |
procesadores_FAC | 1:0978505fcc1b | 196 | |
procesadores_FAC | 1:0978505fcc1b | 197 | if (button4.falling()){ |
procesadores_FAC | 1:0978505fcc1b | 198 | break; //sale del bucle si pisan suiche4 |
procesadores_FAC | 1:0978505fcc1b | 199 | } |
procesadores_FAC | 1:0978505fcc1b | 200 | |
procesadores_FAC | 1:0978505fcc1b | 201 | } |
procesadores_FAC | 1:0978505fcc1b | 202 | lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo |
procesadores_FAC | 1:0978505fcc1b | 203 | lcd.cls(); //borra la pantalla |
procesadores_FAC | 1:0978505fcc1b | 204 | lcd.printf(" GUARDADOS!"); |
procesadores_FAC | 1:0978505fcc1b | 205 | wait(1); |
procesadores_FAC | 1:0978505fcc1b | 206 | lcd.cls(); |
procesadores_FAC | 1:0978505fcc1b | 207 | lcd.printf(" INICIA EL PID"); |
procesadores_FAC | 1:0978505fcc1b | 208 | wait(1); |
procesadores_FAC | 1:0978505fcc1b | 209 | // se imprimen los parches del control ***************************************** |
procesadores_FAC | 1:0978505fcc1b | 210 | lcd.cls(); |
procesadores_FAC | 1:0978505fcc1b | 211 | lcd.printf("Er=%d",err); |
procesadores_FAC | 1:0978505fcc1b | 212 | lcd.locate(8,0); |
procesadores_FAC | 1:0978505fcc1b | 213 | lcd.printf("Me=%d",med); |
procesadores_FAC | 1:0978505fcc1b | 214 | lcd.locate(0,1); |
procesadores_FAC | 1:0978505fcc1b | 215 | lcd.printf("Sp=%d",sp); |
procesadores_FAC | 1:0978505fcc1b | 216 | lcd.locate(8,1); |
procesadores_FAC | 1:0978505fcc1b | 217 | lcd.printf("SC=%d",pid); |
procesadores_FAC | 1:0978505fcc1b | 218 | wait(1); |
procesadores_FAC | 1:0978505fcc1b | 219 | |
procesadores_FAC | 1:0978505fcc1b | 220 | // CICLO PRINCIPAL CONTROLADOR PID |
procesadores_FAC | 1:0978505fcc1b | 221 | // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala |
procesadores_FAC | 1:0978505fcc1b | 222 | |
procesadores_FAC | 1:0978505fcc1b | 223 | kp= kp*fe; |
procesadores_FAC | 1:0978505fcc1b | 224 | ki = ki*fe; |
procesadores_FAC | 1:0978505fcc1b | 225 | kd= kd*fe; |
procesadores_FAC | 1:0978505fcc1b | 226 | |
procesadores_FAC | 1:0978505fcc1b | 227 | cicloPID : |
procesadores_FAC | 1:0978505fcc1b | 228 | |
procesadores_FAC | 1:0978505fcc1b | 229 | med=10*Vin.read(); //leer puerto analogo y asignar a med |
procesadores_FAC | 1:0978505fcc1b | 230 | err = (sp-med); |
procesadores_FAC | 1:0978505fcc1b | 231 | ap = kp*err; |
procesadores_FAC | 1:0978505fcc1b | 232 | |
procesadores_FAC | 1:0978505fcc1b | 233 | ai=(ki*err)+ai; |
procesadores_FAC | 1:0978505fcc1b | 234 | //calculo de la integral del error |
procesadores_FAC | 1:0978505fcc1b | 235 | |
procesadores_FAC | 1:0978505fcc1b | 236 | ad = kd*(err-err_v); //calculo de la accion derivativa |
procesadores_FAC | 1:0978505fcc1b | 237 | pid = (ap+ai+ad); |
procesadores_FAC | 1:0978505fcc1b | 238 | |
procesadores_FAC | 1:0978505fcc1b | 239 | if (pid < 0){ |
procesadores_FAC | 1:0978505fcc1b | 240 | pid=0; |
procesadores_FAC | 1:0978505fcc1b | 241 | } |
procesadores_FAC | 1:0978505fcc1b | 242 | if (pid > 99){ |
procesadores_FAC | 1:0978505fcc1b | 243 | pid=100; |
procesadores_FAC | 1:0978505fcc1b | 244 | } |
procesadores_FAC | 1:0978505fcc1b | 245 | |
procesadores_FAC | 1:0978505fcc1b | 246 | wait(.5); |
procesadores_FAC | 1:0978505fcc1b | 247 | if(err >= 0){ |
procesadores_FAC | 1:0978505fcc1b | 248 | lcd.locate(4,0); |
procesadores_FAC | 1:0978505fcc1b | 249 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 250 | lcd.locate(3,0); |
procesadores_FAC | 1:0978505fcc1b | 251 | lcd.printf("%d",err); |
procesadores_FAC | 1:0978505fcc1b | 252 | } |
procesadores_FAC | 1:0978505fcc1b | 253 | if (err<0){ |
procesadores_FAC | 1:0978505fcc1b | 254 | lcd.locate(3,0); |
procesadores_FAC | 1:0978505fcc1b | 255 | lcd.printf("%d",err); |
procesadores_FAC | 1:0978505fcc1b | 256 | } |
procesadores_FAC | 1:0978505fcc1b | 257 | lcd.locate(12,0); |
procesadores_FAC | 1:0978505fcc1b | 258 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 259 | lcd.locate(11,0); |
procesadores_FAC | 1:0978505fcc1b | 260 | lcd.printf("%d",med); |
procesadores_FAC | 1:0978505fcc1b | 261 | lcd.locate(3,1); |
procesadores_FAC | 1:0978505fcc1b | 262 | lcd.printf("%d",sp); |
procesadores_FAC | 1:0978505fcc1b | 263 | |
procesadores_FAC | 1:0978505fcc1b | 264 | if(pid < 100){ |
procesadores_FAC | 1:0978505fcc1b | 265 | lcd.locate(13,1); |
procesadores_FAC | 1:0978505fcc1b | 266 | lcd.printf(" "); |
procesadores_FAC | 1:0978505fcc1b | 267 | lcd.locate(11,1); |
procesadores_FAC | 1:0978505fcc1b | 268 | lcd.printf("%d",pid);} |
procesadores_FAC | 1:0978505fcc1b | 269 | |
procesadores_FAC | 1:0978505fcc1b | 270 | if(pid >= 100){ |
procesadores_FAC | 1:0978505fcc1b | 271 | lcd.locate(11,1); |
procesadores_FAC | 1:0978505fcc1b | 272 | lcd.printf("%d",pid);} |
procesadores_FAC | 1:0978505fcc1b | 273 | |
procesadores_FAC | 1:0978505fcc1b | 274 | err_v = err; |
procesadores_FAC | 1:0978505fcc1b | 275 | pidn=pid*0.01;//Normalizacion de la salida |
procesadores_FAC | 1:0978505fcc1b | 276 | Vout.write(pidn);//se envia el valor pid a puerto analogico de salida (D/A) |
procesadores_FAC | 1:0978505fcc1b | 277 | wait(0.005); |
procesadores_FAC | 1:0978505fcc1b | 278 | goto cicloPID ; |
procesadores_FAC | 1:0978505fcc1b | 279 | |
procesadores_FAC | 1:0978505fcc1b | 280 | |
procesadores_FAC | 1:0978505fcc1b | 281 | } |