Control PID simple con una tarjeta Freescale KL25Z y display de pantalla líquida de 16x2. Trabajo conjunto con el usuario jmcallef (Jose Calle)

Dependencies:   DebouncedIn TextLCD1 mbed

Committer:
cmorab
Date:
Tue Nov 05 19:34:03 2013 +0000
Revision:
0:3e5f40db8cb3
Backup de un control PID simle usando la tarjeta Freescale KL25Z y pantalla de cristal l?quido de 16x2.; Trabajo conjunto con el usuario jmcallej (Jose Calle)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cmorab 0:3e5f40db8cb3 1 #include "mbed.h"
cmorab 0:3e5f40db8cb3 2 #include "DebouncedIn.h"
cmorab 0:3e5f40db8cb3 3 #include "TextLCD.h"
cmorab 0:3e5f40db8cb3 4
cmorab 0:3e5f40db8cb3 5 AnalogIn Vin(PTC2);
cmorab 0:3e5f40db8cb3 6 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
cmorab 0:3e5f40db8cb3 7
cmorab 0:3e5f40db8cb3 8 DigitalOut led1(LED1);
cmorab 0:3e5f40db8cb3 9 DigitalOut led2(LED2);
cmorab 0:3e5f40db8cb3 10 DigitalOut led3(LED3);
cmorab 0:3e5f40db8cb3 11 DigitalOut led4(LED4);
cmorab 0:3e5f40db8cb3 12 DebouncedIn button1(PTC12); // Aumento
cmorab 0:3e5f40db8cb3 13 DebouncedIn button2(PTC13); // Disminución
cmorab 0:3e5f40db8cb3 14 DebouncedIn button3(PTC16); // Cambio de variable
cmorab 0:3e5f40db8cb3 15 DebouncedIn button4(PTC17); // Reset
cmorab 0:3e5f40db8cb3 16
cmorab 0:3e5f40db8cb3 17 int C1=0x0E; // solo muestra el curzor.
cmorab 0:3e5f40db8cb3 18 int C2=0x18; // desplaza izquierda.
cmorab 0:3e5f40db8cb3 19 int C3=0x1A; // desplaza derecha.
cmorab 0:3e5f40db8cb3 20 int C4=0x0C; // quito cursor bajo.
cmorab 0:3e5f40db8cb3 21
cmorab 0:3e5f40db8cb3 22 int i; // Indice de la variable.
cmorab 0:3e5f40db8cb3 23 int j; // Controla cambio de posición.
cmorab 0:3e5f40db8cb3 24 int kp, ki, kd, sp, cont;
cmorab 0:3e5f40db8cb3 25 int med, pid, err, ap, ai, ad, err_v;
cmorab 0:3e5f40db8cb3 26
cmorab 0:3e5f40db8cb3 27 int main(){
cmorab 0:3e5f40db8cb3 28 lcd.writeCommand(C1); // Escribimos un comando segun el manual del modulo LCD
cmorab 0:3e5f40db8cb3 29 lcd.cls(); // Borro toda la pantalla
cmorab 0:3e5f40db8cb3 30 lcd.locate(0,0); // Localizo donde se escribirá el siguiente comando.
cmorab 0:3e5f40db8cb3 31 lcd.printf("Sp %d",sp); // Escribe Sp (aparecen desde el punto (0,0)
cmorab 0:3e5f40db8cb3 32 lcd.locate(8,0); // Localizo donde se escribirá el siguiente comando.
cmorab 0:3e5f40db8cb3 33 lcd.printf("Kp %d",kp); // Escribe Kp (aparecen desde el punto (8,0)
cmorab 0:3e5f40db8cb3 34 lcd.locate(0,1);
cmorab 0:3e5f40db8cb3 35 lcd.printf("Ki %d",ki);
cmorab 0:3e5f40db8cb3 36 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 37 lcd.printf("Kd %d",kd);
cmorab 0:3e5f40db8cb3 38
cmorab 0:3e5f40db8cb3 39
cmorab 0:3e5f40db8cb3 40 while(1){
cmorab 0:3e5f40db8cb3 41 led3 =1;
cmorab 0:3e5f40db8cb3 42 if (button3.falling()){
cmorab 0:3e5f40db8cb3 43 led3 =!led3; // Prendo el LED color rojo cada vez que pulso el boton 3 ya que pasa a valer 0 (encendido).
cmorab 0:3e5f40db8cb3 44 ++j;
cmorab 0:3e5f40db8cb3 45 } // INCREMENTA POSICION DEL MENU CON BOTON 3
cmorab 0:3e5f40db8cb3 46 if (j==0){
cmorab 0:3e5f40db8cb3 47 lcd.locate(3,0);
cmorab 0:3e5f40db8cb3 48 lcd.printf("%d",sp);
cmorab 0:3e5f40db8cb3 49 wait(0.2);
cmorab 0:3e5f40db8cb3 50
cmorab 0:3e5f40db8cb3 51 led1 = 1;
cmorab 0:3e5f40db8cb3 52
cmorab 0:3e5f40db8cb3 53 if(button1.falling()) {
cmorab 0:3e5f40db8cb3 54 led1 =!led1; // Prendo el LED color azul cada vez que pulso el boton 1 ya que pasa a valer 0 (encendido).
cmorab 0:3e5f40db8cb3 55 //++sp; // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
cmorab 0:3e5f40db8cb3 56
cmorab 0:3e5f40db8cb3 57
cmorab 0:3e5f40db8cb3 58 // Ahora comienza el incremental.
cmorab 0:3e5f40db8cb3 59
cmorab 0:3e5f40db8cb3 60 if (!button1) {
cmorab 0:3e5f40db8cb3 61 cont=0;
cmorab 0:3e5f40db8cb3 62 wait(0.2);
cmorab 0:3e5f40db8cb3 63
cmorab 0:3e5f40db8cb3 64 while(cont<20){
cmorab 0:3e5f40db8cb3 65 cont = cont + 1;
cmorab 0:3e5f40db8cb3 66 sp=sp+1;
cmorab 0:3e5f40db8cb3 67 if (sp>1000){ // Ponemos un tope incremental en 1.000
cmorab 0:3e5f40db8cb3 68 sp=1000;
cmorab 0:3e5f40db8cb3 69 }
cmorab 0:3e5f40db8cb3 70 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 71 lcd.printf("Sp %d",sp);
cmorab 0:3e5f40db8cb3 72
cmorab 0:3e5f40db8cb3 73 wait(0.3);
cmorab 0:3e5f40db8cb3 74 if(button1){
cmorab 0:3e5f40db8cb3 75 break;
cmorab 0:3e5f40db8cb3 76 }
cmorab 0:3e5f40db8cb3 77 while(cont>=20 and cont<=40){
cmorab 0:3e5f40db8cb3 78 cont=cont+1;
cmorab 0:3e5f40db8cb3 79 sp=sp+10;
cmorab 0:3e5f40db8cb3 80 if (sp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 81 sp=1000;
cmorab 0:3e5f40db8cb3 82 }
cmorab 0:3e5f40db8cb3 83 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 84 lcd.printf("Sp %d",sp);
cmorab 0:3e5f40db8cb3 85
cmorab 0:3e5f40db8cb3 86 wait(0.3);
cmorab 0:3e5f40db8cb3 87 if(button1){
cmorab 0:3e5f40db8cb3 88 break;
cmorab 0:3e5f40db8cb3 89 }
cmorab 0:3e5f40db8cb3 90
cmorab 0:3e5f40db8cb3 91 while(cont>40){
cmorab 0:3e5f40db8cb3 92 cont = cont + 1;
cmorab 0:3e5f40db8cb3 93 sp=sp+100;
cmorab 0:3e5f40db8cb3 94 if (sp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 95 sp=1000;
cmorab 0:3e5f40db8cb3 96 }
cmorab 0:3e5f40db8cb3 97 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 98 lcd.printf("Sp %d",sp);
cmorab 0:3e5f40db8cb3 99
cmorab 0:3e5f40db8cb3 100 wait(0.3);
cmorab 0:3e5f40db8cb3 101 if(button1){
cmorab 0:3e5f40db8cb3 102 break;
cmorab 0:3e5f40db8cb3 103 }
cmorab 0:3e5f40db8cb3 104 }
cmorab 0:3e5f40db8cb3 105 }
cmorab 0:3e5f40db8cb3 106 }
cmorab 0:3e5f40db8cb3 107 }
cmorab 0:3e5f40db8cb3 108
cmorab 0:3e5f40db8cb3 109 // Aqui termina el incremental.
cmorab 0:3e5f40db8cb3 110 }
cmorab 0:3e5f40db8cb3 111
cmorab 0:3e5f40db8cb3 112
cmorab 0:3e5f40db8cb3 113 led2 =1;
cmorab 0:3e5f40db8cb3 114 if (button2.falling()) {
cmorab 0:3e5f40db8cb3 115 led2 =!led2; // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).
cmorab 0:3e5f40db8cb3 116
cmorab 0:3e5f40db8cb3 117 //--sp; // Reduce el valor al pulsar el botón.
cmorab 0:3e5f40db8cb3 118 }
cmorab 0:3e5f40db8cb3 119
cmorab 0:3e5f40db8cb3 120
cmorab 0:3e5f40db8cb3 121 // Ahora comienza el decremental.
cmorab 0:3e5f40db8cb3 122
cmorab 0:3e5f40db8cb3 123 if (!button2) {
cmorab 0:3e5f40db8cb3 124 cont=0;
cmorab 0:3e5f40db8cb3 125 wait(0.2);
cmorab 0:3e5f40db8cb3 126
cmorab 0:3e5f40db8cb3 127 while(cont<20){
cmorab 0:3e5f40db8cb3 128 cont = cont + 1;
cmorab 0:3e5f40db8cb3 129 sp=sp-1;
cmorab 0:3e5f40db8cb3 130
cmorab 0:3e5f40db8cb3 131 if (sp<=0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 132 sp=0;
cmorab 0:3e5f40db8cb3 133 }
cmorab 0:3e5f40db8cb3 134 lcd.locate(3,0);
cmorab 0:3e5f40db8cb3 135 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 136 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 137 lcd.printf("Sp %d",sp);
cmorab 0:3e5f40db8cb3 138
cmorab 0:3e5f40db8cb3 139 wait(0.3);
cmorab 0:3e5f40db8cb3 140 if(button2){
cmorab 0:3e5f40db8cb3 141 break;
cmorab 0:3e5f40db8cb3 142 }
cmorab 0:3e5f40db8cb3 143
cmorab 0:3e5f40db8cb3 144 while(cont>=20 and cont<=40){
cmorab 0:3e5f40db8cb3 145 cont=cont+1;
cmorab 0:3e5f40db8cb3 146 sp=sp-10;
cmorab 0:3e5f40db8cb3 147 if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 148 sp=0;
cmorab 0:3e5f40db8cb3 149 }
cmorab 0:3e5f40db8cb3 150
cmorab 0:3e5f40db8cb3 151 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 152 lcd.printf("Sp %d ",sp);
cmorab 0:3e5f40db8cb3 153
cmorab 0:3e5f40db8cb3 154
cmorab 0:3e5f40db8cb3 155 wait(0.3);
cmorab 0:3e5f40db8cb3 156 if(button2){
cmorab 0:3e5f40db8cb3 157 break;
cmorab 0:3e5f40db8cb3 158 }
cmorab 0:3e5f40db8cb3 159
cmorab 0:3e5f40db8cb3 160 while(cont>40){
cmorab 0:3e5f40db8cb3 161 cont = cont + 1;
cmorab 0:3e5f40db8cb3 162 sp=sp-100;
cmorab 0:3e5f40db8cb3 163
cmorab 0:3e5f40db8cb3 164 if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 165 sp=0;
cmorab 0:3e5f40db8cb3 166 }
cmorab 0:3e5f40db8cb3 167
cmorab 0:3e5f40db8cb3 168 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 169 lcd.printf("Sp %d ",sp);
cmorab 0:3e5f40db8cb3 170
cmorab 0:3e5f40db8cb3 171
cmorab 0:3e5f40db8cb3 172 wait(0.3);
cmorab 0:3e5f40db8cb3 173 if(button2){
cmorab 0:3e5f40db8cb3 174 break;
cmorab 0:3e5f40db8cb3 175 }
cmorab 0:3e5f40db8cb3 176 }
cmorab 0:3e5f40db8cb3 177 }
cmorab 0:3e5f40db8cb3 178 }
cmorab 0:3e5f40db8cb3 179 }
cmorab 0:3e5f40db8cb3 180
cmorab 0:3e5f40db8cb3 181 // Aqui termina el decremental.
cmorab 0:3e5f40db8cb3 182
cmorab 0:3e5f40db8cb3 183
cmorab 0:3e5f40db8cb3 184 }
cmorab 0:3e5f40db8cb3 185 if (j==1){
cmorab 0:3e5f40db8cb3 186 lcd.locate(11,0);
cmorab 0:3e5f40db8cb3 187 lcd.printf("%d",kp);
cmorab 0:3e5f40db8cb3 188 wait(0.3);
cmorab 0:3e5f40db8cb3 189 led1 =1;
cmorab 0:3e5f40db8cb3 190 if (button1.falling()) {
cmorab 0:3e5f40db8cb3 191 led1 =!led1;
cmorab 0:3e5f40db8cb3 192 // ++kp;
cmorab 0:3e5f40db8cb3 193 }
cmorab 0:3e5f40db8cb3 194
cmorab 0:3e5f40db8cb3 195 // Ahora comienza el incremental.
cmorab 0:3e5f40db8cb3 196
cmorab 0:3e5f40db8cb3 197 if (!button1) {
cmorab 0:3e5f40db8cb3 198 cont=0;
cmorab 0:3e5f40db8cb3 199 wait(0.2);
cmorab 0:3e5f40db8cb3 200
cmorab 0:3e5f40db8cb3 201 while(cont<20){
cmorab 0:3e5f40db8cb3 202 cont = cont + 1;
cmorab 0:3e5f40db8cb3 203 kp=kp+1;
cmorab 0:3e5f40db8cb3 204 if (kp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 205 kp=1000;
cmorab 0:3e5f40db8cb3 206 }
cmorab 0:3e5f40db8cb3 207 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 208 lcd.printf("Kp %d",kp);
cmorab 0:3e5f40db8cb3 209
cmorab 0:3e5f40db8cb3 210 wait(0.3);
cmorab 0:3e5f40db8cb3 211 if(button1){
cmorab 0:3e5f40db8cb3 212 break;
cmorab 0:3e5f40db8cb3 213 }
cmorab 0:3e5f40db8cb3 214 while(cont>=20){
cmorab 0:3e5f40db8cb3 215 cont=cont+1;
cmorab 0:3e5f40db8cb3 216 kp=kp+10;
cmorab 0:3e5f40db8cb3 217 if (kp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 218 kp=1000;
cmorab 0:3e5f40db8cb3 219 }
cmorab 0:3e5f40db8cb3 220 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 221 lcd.printf("Kp %d",kp);
cmorab 0:3e5f40db8cb3 222
cmorab 0:3e5f40db8cb3 223 wait(0.3);
cmorab 0:3e5f40db8cb3 224 if(button1){
cmorab 0:3e5f40db8cb3 225 break;
cmorab 0:3e5f40db8cb3 226 }
cmorab 0:3e5f40db8cb3 227
cmorab 0:3e5f40db8cb3 228 while(cont>40){
cmorab 0:3e5f40db8cb3 229 cont = cont + 1;
cmorab 0:3e5f40db8cb3 230 kp=kp+100;
cmorab 0:3e5f40db8cb3 231 if (kp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 232 kp=1000;
cmorab 0:3e5f40db8cb3 233 }
cmorab 0:3e5f40db8cb3 234 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 235 lcd.printf("Kp %d",kp);
cmorab 0:3e5f40db8cb3 236
cmorab 0:3e5f40db8cb3 237 wait(0.3);
cmorab 0:3e5f40db8cb3 238 if(button1){
cmorab 0:3e5f40db8cb3 239 break;
cmorab 0:3e5f40db8cb3 240 }
cmorab 0:3e5f40db8cb3 241 }
cmorab 0:3e5f40db8cb3 242 }
cmorab 0:3e5f40db8cb3 243 }
cmorab 0:3e5f40db8cb3 244 }
cmorab 0:3e5f40db8cb3 245
cmorab 0:3e5f40db8cb3 246 // Aqui termina el incremental.
cmorab 0:3e5f40db8cb3 247 }
cmorab 0:3e5f40db8cb3 248
cmorab 0:3e5f40db8cb3 249
cmorab 0:3e5f40db8cb3 250 led2 =1;
cmorab 0:3e5f40db8cb3 251 if (button2.falling()) {
cmorab 0:3e5f40db8cb3 252 led2 =!led2; // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).
cmorab 0:3e5f40db8cb3 253
cmorab 0:3e5f40db8cb3 254 //--sp; // Reduce el valor al pulsar el botón.
cmorab 0:3e5f40db8cb3 255 }
cmorab 0:3e5f40db8cb3 256
cmorab 0:3e5f40db8cb3 257
cmorab 0:3e5f40db8cb3 258 // Ahora comienza el decremental.
cmorab 0:3e5f40db8cb3 259
cmorab 0:3e5f40db8cb3 260 if (!button2) {
cmorab 0:3e5f40db8cb3 261 cont=0;
cmorab 0:3e5f40db8cb3 262 wait(0.2);
cmorab 0:3e5f40db8cb3 263
cmorab 0:3e5f40db8cb3 264 while(cont<20){
cmorab 0:3e5f40db8cb3 265 cont = cont + 1;
cmorab 0:3e5f40db8cb3 266
cmorab 0:3e5f40db8cb3 267 kp=kp-1;
cmorab 0:3e5f40db8cb3 268
cmorab 0:3e5f40db8cb3 269 if (kp<=0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 270 kp=0;
cmorab 0:3e5f40db8cb3 271 }
cmorab 0:3e5f40db8cb3 272
cmorab 0:3e5f40db8cb3 273 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 274 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 275 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 276 lcd.printf("Kp %d",kp);
cmorab 0:3e5f40db8cb3 277
cmorab 0:3e5f40db8cb3 278 wait(0.3);
cmorab 0:3e5f40db8cb3 279 if(button2){
cmorab 0:3e5f40db8cb3 280 break;
cmorab 0:3e5f40db8cb3 281 }
cmorab 0:3e5f40db8cb3 282
cmorab 0:3e5f40db8cb3 283 while(cont>=20){
cmorab 0:3e5f40db8cb3 284 cont=cont+1;
cmorab 0:3e5f40db8cb3 285 kp=kp-10;
cmorab 0:3e5f40db8cb3 286 if (kp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 287 kp=0;
cmorab 0:3e5f40db8cb3 288 }
cmorab 0:3e5f40db8cb3 289
cmorab 0:3e5f40db8cb3 290 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 291 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 292 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 293 lcd.printf("Kp %d ",kp);
cmorab 0:3e5f40db8cb3 294
cmorab 0:3e5f40db8cb3 295 wait(0.3);
cmorab 0:3e5f40db8cb3 296 if(button2){
cmorab 0:3e5f40db8cb3 297 break;
cmorab 0:3e5f40db8cb3 298 }
cmorab 0:3e5f40db8cb3 299
cmorab 0:3e5f40db8cb3 300 while(cont>40){
cmorab 0:3e5f40db8cb3 301 cont = cont + 1;
cmorab 0:3e5f40db8cb3 302 kp=kp-100;
cmorab 0:3e5f40db8cb3 303
cmorab 0:3e5f40db8cb3 304 if (kp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 305 kp=0;
cmorab 0:3e5f40db8cb3 306 }
cmorab 0:3e5f40db8cb3 307 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 308 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 309 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 310 lcd.printf("Kp %d ",kp);
cmorab 0:3e5f40db8cb3 311
cmorab 0:3e5f40db8cb3 312
cmorab 0:3e5f40db8cb3 313 wait(0.3);
cmorab 0:3e5f40db8cb3 314 if(button2){
cmorab 0:3e5f40db8cb3 315 break;
cmorab 0:3e5f40db8cb3 316 }
cmorab 0:3e5f40db8cb3 317 }
cmorab 0:3e5f40db8cb3 318 }
cmorab 0:3e5f40db8cb3 319 }
cmorab 0:3e5f40db8cb3 320 }
cmorab 0:3e5f40db8cb3 321
cmorab 0:3e5f40db8cb3 322
cmorab 0:3e5f40db8cb3 323
cmorab 0:3e5f40db8cb3 324 if (j==2){
cmorab 0:3e5f40db8cb3 325 lcd.locate(3,1);
cmorab 0:3e5f40db8cb3 326 lcd.printf("%d",ki);
cmorab 0:3e5f40db8cb3 327 wait(0.3);
cmorab 0:3e5f40db8cb3 328 led1 =1;
cmorab 0:3e5f40db8cb3 329 if (button1.falling()){
cmorab 0:3e5f40db8cb3 330 led1 =!led1;
cmorab 0:3e5f40db8cb3 331
cmorab 0:3e5f40db8cb3 332 //++sp; // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
cmorab 0:3e5f40db8cb3 333
cmorab 0:3e5f40db8cb3 334
cmorab 0:3e5f40db8cb3 335 // Ahora comienza el incremental.
cmorab 0:3e5f40db8cb3 336
cmorab 0:3e5f40db8cb3 337 if (!button1) {
cmorab 0:3e5f40db8cb3 338 cont=0;
cmorab 0:3e5f40db8cb3 339 wait(0.2);
cmorab 0:3e5f40db8cb3 340
cmorab 0:3e5f40db8cb3 341 while(cont<20){
cmorab 0:3e5f40db8cb3 342 cont = cont + 1;
cmorab 0:3e5f40db8cb3 343 ki=ki+1;
cmorab 0:3e5f40db8cb3 344 if (ki>1000){ // Ponemos un tope incremental en 1.000
cmorab 0:3e5f40db8cb3 345 ki=1000;
cmorab 0:3e5f40db8cb3 346 }
cmorab 0:3e5f40db8cb3 347 lcd.locate(0,1);
cmorab 0:3e5f40db8cb3 348 lcd.printf("Ki %d",ki);
cmorab 0:3e5f40db8cb3 349
cmorab 0:3e5f40db8cb3 350 wait(0.3);
cmorab 0:3e5f40db8cb3 351 if(button1){
cmorab 0:3e5f40db8cb3 352 break;
cmorab 0:3e5f40db8cb3 353 }
cmorab 0:3e5f40db8cb3 354 while(cont>=20 and cont<=40){
cmorab 0:3e5f40db8cb3 355 cont=cont+1;
cmorab 0:3e5f40db8cb3 356 ki=ki+10;
cmorab 0:3e5f40db8cb3 357 if (ki>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 358 ki=1000;
cmorab 0:3e5f40db8cb3 359 }
cmorab 0:3e5f40db8cb3 360 lcd.locate(0,1);
cmorab 0:3e5f40db8cb3 361 lcd.printf("Ki %d",ki);
cmorab 0:3e5f40db8cb3 362
cmorab 0:3e5f40db8cb3 363 wait(0.3);
cmorab 0:3e5f40db8cb3 364 if(button1){
cmorab 0:3e5f40db8cb3 365 break;
cmorab 0:3e5f40db8cb3 366 }
cmorab 0:3e5f40db8cb3 367
cmorab 0:3e5f40db8cb3 368 while(cont>40){
cmorab 0:3e5f40db8cb3 369 cont = cont + 1;
cmorab 0:3e5f40db8cb3 370 ki=ki+100;
cmorab 0:3e5f40db8cb3 371 if (ki>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:3e5f40db8cb3 372 ki=1000;
cmorab 0:3e5f40db8cb3 373 }
cmorab 0:3e5f40db8cb3 374 lcd.locate(0,1);
cmorab 0:3e5f40db8cb3 375 lcd.printf("Ki %d",ki);
cmorab 0:3e5f40db8cb3 376
cmorab 0:3e5f40db8cb3 377 wait(0.3);
cmorab 0:3e5f40db8cb3 378 if(button1){
cmorab 0:3e5f40db8cb3 379 break;
cmorab 0:3e5f40db8cb3 380 }
cmorab 0:3e5f40db8cb3 381 }
cmorab 0:3e5f40db8cb3 382 }
cmorab 0:3e5f40db8cb3 383 }
cmorab 0:3e5f40db8cb3 384 }
cmorab 0:3e5f40db8cb3 385 }
cmorab 0:3e5f40db8cb3 386 // Aqui termina el incremental.
cmorab 0:3e5f40db8cb3 387 }
cmorab 0:3e5f40db8cb3 388
cmorab 0:3e5f40db8cb3 389
cmorab 0:3e5f40db8cb3 390 led2 =1;
cmorab 0:3e5f40db8cb3 391 if (button2.falling()) {
cmorab 0:3e5f40db8cb3 392 led2 =!led2; // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).
cmorab 0:3e5f40db8cb3 393
cmorab 0:3e5f40db8cb3 394 //--sp; // Reduce el valor al pulsar el botón.
cmorab 0:3e5f40db8cb3 395 }
cmorab 0:3e5f40db8cb3 396
cmorab 0:3e5f40db8cb3 397
cmorab 0:3e5f40db8cb3 398 // Ahora comienza el decremental.
cmorab 0:3e5f40db8cb3 399
cmorab 0:3e5f40db8cb3 400 if (!button2) {
cmorab 0:3e5f40db8cb3 401 cont=0;
cmorab 0:3e5f40db8cb3 402 wait(0.2);
cmorab 0:3e5f40db8cb3 403
cmorab 0:3e5f40db8cb3 404 while(cont<20){
cmorab 0:3e5f40db8cb3 405 cont = cont + 1;
cmorab 0:3e5f40db8cb3 406 ki=ki-1;
cmorab 0:3e5f40db8cb3 407
cmorab 0:3e5f40db8cb3 408 if (ki<=0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 409 ki=0;
cmorab 0:3e5f40db8cb3 410 }
cmorab 0:3e5f40db8cb3 411 lcd.locate(3,1);
cmorab 0:3e5f40db8cb3 412 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 413 lcd.locate(0,1);
cmorab 0:3e5f40db8cb3 414 lcd.printf("Ki %d",ki);
cmorab 0:3e5f40db8cb3 415
cmorab 0:3e5f40db8cb3 416 wait(0.3);
cmorab 0:3e5f40db8cb3 417 if(button2){
cmorab 0:3e5f40db8cb3 418 break;
cmorab 0:3e5f40db8cb3 419 }
cmorab 0:3e5f40db8cb3 420
cmorab 0:3e5f40db8cb3 421 while(cont>=20 and cont<=40){
cmorab 0:3e5f40db8cb3 422 cont=cont+1;
cmorab 0:3e5f40db8cb3 423 ki=ki-10;
cmorab 0:3e5f40db8cb3 424 if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 425 ki=0;
cmorab 0:3e5f40db8cb3 426 }
cmorab 0:3e5f40db8cb3 427
cmorab 0:3e5f40db8cb3 428 lcd.locate(3,1);
cmorab 0:3e5f40db8cb3 429 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 430 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 431 lcd.printf("Ki %d ",ki);
cmorab 0:3e5f40db8cb3 432
cmorab 0:3e5f40db8cb3 433
cmorab 0:3e5f40db8cb3 434 wait(0.3);
cmorab 0:3e5f40db8cb3 435 if(button2){
cmorab 0:3e5f40db8cb3 436 break;
cmorab 0:3e5f40db8cb3 437 }
cmorab 0:3e5f40db8cb3 438
cmorab 0:3e5f40db8cb3 439 while(cont>40){
cmorab 0:3e5f40db8cb3 440 cont = cont + 1;
cmorab 0:3e5f40db8cb3 441 ki=ki-100;
cmorab 0:3e5f40db8cb3 442
cmorab 0:3e5f40db8cb3 443 if (ki<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 444 ki=0;
cmorab 0:3e5f40db8cb3 445 }
cmorab 0:3e5f40db8cb3 446
cmorab 0:3e5f40db8cb3 447 lcd.locate(3,1);
cmorab 0:3e5f40db8cb3 448 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 449 lcd.locate(0,0);
cmorab 0:3e5f40db8cb3 450 lcd.printf("Ki %d ",ki);
cmorab 0:3e5f40db8cb3 451
cmorab 0:3e5f40db8cb3 452
cmorab 0:3e5f40db8cb3 453 wait(0.3);
cmorab 0:3e5f40db8cb3 454 if(button2){
cmorab 0:3e5f40db8cb3 455 break;
cmorab 0:3e5f40db8cb3 456 }
cmorab 0:3e5f40db8cb3 457 }
cmorab 0:3e5f40db8cb3 458 }
cmorab 0:3e5f40db8cb3 459 }
cmorab 0:3e5f40db8cb3 460 }
cmorab 0:3e5f40db8cb3 461
cmorab 0:3e5f40db8cb3 462 // Aqui termina el decremental.
cmorab 0:3e5f40db8cb3 463
cmorab 0:3e5f40db8cb3 464 if (j==3){
cmorab 0:3e5f40db8cb3 465 lcd.locate(11,1);
cmorab 0:3e5f40db8cb3 466 lcd.printf("%d",kd);
cmorab 0:3e5f40db8cb3 467 wait(0.3);
cmorab 0:3e5f40db8cb3 468 led1 =1;
cmorab 0:3e5f40db8cb3 469 if (button1.falling()){
cmorab 0:3e5f40db8cb3 470 led1 =!led1;
cmorab 0:3e5f40db8cb3 471
cmorab 0:3e5f40db8cb3 472 //++sp; // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
cmorab 0:3e5f40db8cb3 473
cmorab 0:3e5f40db8cb3 474
cmorab 0:3e5f40db8cb3 475 // Ahora comienza el incremental.
cmorab 0:3e5f40db8cb3 476
cmorab 0:3e5f40db8cb3 477 if (!button1) {
cmorab 0:3e5f40db8cb3 478 cont=0;
cmorab 0:3e5f40db8cb3 479 wait(0.2);
cmorab 0:3e5f40db8cb3 480
cmorab 0:3e5f40db8cb3 481 while(cont<20){
cmorab 0:3e5f40db8cb3 482 cont = cont + 1;
cmorab 0:3e5f40db8cb3 483 kd=kd+1;
cmorab 0:3e5f40db8cb3 484
cmorab 0:3e5f40db8cb3 485 if (kd>1000){ // Ponemos un tope incremental en 1.000
cmorab 0:3e5f40db8cb3 486 kd=1000;
cmorab 0:3e5f40db8cb3 487 }
cmorab 0:3e5f40db8cb3 488 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 489 lcd.printf("Kd %d",kd);
cmorab 0:3e5f40db8cb3 490
cmorab 0:3e5f40db8cb3 491 wait(0.3);
cmorab 0:3e5f40db8cb3 492 if(button1){
cmorab 0:3e5f40db8cb3 493 break;
cmorab 0:3e5f40db8cb3 494 }
cmorab 0:3e5f40db8cb3 495 while(cont>=20 and cont<=40){
cmorab 0:3e5f40db8cb3 496 cont=cont+1;
cmorab 0:3e5f40db8cb3 497 kd=kd+10;
cmorab 0:3e5f40db8cb3 498 if (kd>1000){ // Ponemos un tope incremental en 100
cmorab 0:3e5f40db8cb3 499 kd=1000;
cmorab 0:3e5f40db8cb3 500 }
cmorab 0:3e5f40db8cb3 501 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 502 lcd.printf("Kd %d",kd);
cmorab 0:3e5f40db8cb3 503
cmorab 0:3e5f40db8cb3 504 wait(0.3);
cmorab 0:3e5f40db8cb3 505 if(button1){
cmorab 0:3e5f40db8cb3 506 break;
cmorab 0:3e5f40db8cb3 507 }
cmorab 0:3e5f40db8cb3 508
cmorab 0:3e5f40db8cb3 509 while(cont>40){
cmorab 0:3e5f40db8cb3 510 cont = cont + 1;
cmorab 0:3e5f40db8cb3 511 kd=kd+100;
cmorab 0:3e5f40db8cb3 512 if (kd>1000){ // Ponemos un tope incremental en 1000
cmorab 0:3e5f40db8cb3 513 kd=1000;
cmorab 0:3e5f40db8cb3 514 }
cmorab 0:3e5f40db8cb3 515 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 516 lcd.printf("Kd %d",kd);
cmorab 0:3e5f40db8cb3 517
cmorab 0:3e5f40db8cb3 518 wait(0.3);
cmorab 0:3e5f40db8cb3 519 if(button1){
cmorab 0:3e5f40db8cb3 520 break;
cmorab 0:3e5f40db8cb3 521 }
cmorab 0:3e5f40db8cb3 522 }
cmorab 0:3e5f40db8cb3 523 }
cmorab 0:3e5f40db8cb3 524 }
cmorab 0:3e5f40db8cb3 525 }
cmorab 0:3e5f40db8cb3 526 }
cmorab 0:3e5f40db8cb3 527 // Aqui termina el incremental.
cmorab 0:3e5f40db8cb3 528 }
cmorab 0:3e5f40db8cb3 529
cmorab 0:3e5f40db8cb3 530
cmorab 0:3e5f40db8cb3 531 led2 =1;
cmorab 0:3e5f40db8cb3 532 if (button2.falling()) {
cmorab 0:3e5f40db8cb3 533 led2 =!led2; // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).
cmorab 0:3e5f40db8cb3 534
cmorab 0:3e5f40db8cb3 535 //--sp; // Reduce el valor al pulsar el botón.
cmorab 0:3e5f40db8cb3 536 }
cmorab 0:3e5f40db8cb3 537
cmorab 0:3e5f40db8cb3 538
cmorab 0:3e5f40db8cb3 539 // Ahora comienza el decremental.
cmorab 0:3e5f40db8cb3 540
cmorab 0:3e5f40db8cb3 541 if (!button2) {
cmorab 0:3e5f40db8cb3 542 cont=0;
cmorab 0:3e5f40db8cb3 543 wait(0.2);
cmorab 0:3e5f40db8cb3 544
cmorab 0:3e5f40db8cb3 545 while(cont<20){
cmorab 0:3e5f40db8cb3 546 cont = cont + 1;
cmorab 0:3e5f40db8cb3 547 kd=kd-1;
cmorab 0:3e5f40db8cb3 548
cmorab 0:3e5f40db8cb3 549 if (kd<=0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 550 kd=0;
cmorab 0:3e5f40db8cb3 551 }
cmorab 0:3e5f40db8cb3 552 lcd.locate(11,1);
cmorab 0:3e5f40db8cb3 553 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 554 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 555 lcd.printf("Kd %d",kd);
cmorab 0:3e5f40db8cb3 556
cmorab 0:3e5f40db8cb3 557 wait(0.3);
cmorab 0:3e5f40db8cb3 558 if(button2){
cmorab 0:3e5f40db8cb3 559 break;
cmorab 0:3e5f40db8cb3 560 }
cmorab 0:3e5f40db8cb3 561
cmorab 0:3e5f40db8cb3 562 while(cont>=20 and cont<=40){
cmorab 0:3e5f40db8cb3 563 cont=cont+1;
cmorab 0:3e5f40db8cb3 564 kd=kd-10;
cmorab 0:3e5f40db8cb3 565 if (kd<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 566 kd=0;
cmorab 0:3e5f40db8cb3 567 }
cmorab 0:3e5f40db8cb3 568
cmorab 0:3e5f40db8cb3 569 lcd.locate(11,1);
cmorab 0:3e5f40db8cb3 570 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 571 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 572 lcd.printf("Kd %d ",kd);
cmorab 0:3e5f40db8cb3 573
cmorab 0:3e5f40db8cb3 574
cmorab 0:3e5f40db8cb3 575 wait(0.3);
cmorab 0:3e5f40db8cb3 576 if(button2){
cmorab 0:3e5f40db8cb3 577 break;
cmorab 0:3e5f40db8cb3 578 }
cmorab 0:3e5f40db8cb3 579
cmorab 0:3e5f40db8cb3 580 while(cont>40){
cmorab 0:3e5f40db8cb3 581 cont = cont + 1;
cmorab 0:3e5f40db8cb3 582 kd=kd-100;
cmorab 0:3e5f40db8cb3 583
cmorab 0:3e5f40db8cb3 584 if (kd<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:3e5f40db8cb3 585 kd=0;
cmorab 0:3e5f40db8cb3 586 }
cmorab 0:3e5f40db8cb3 587
cmorab 0:3e5f40db8cb3 588 lcd.locate(11,1);
cmorab 0:3e5f40db8cb3 589 lcd.printf(" ");
cmorab 0:3e5f40db8cb3 590 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 591 lcd.printf("Kd %d ",kd);
cmorab 0:3e5f40db8cb3 592
cmorab 0:3e5f40db8cb3 593
cmorab 0:3e5f40db8cb3 594 wait(0.3);
cmorab 0:3e5f40db8cb3 595 if(button2){
cmorab 0:3e5f40db8cb3 596 break;
cmorab 0:3e5f40db8cb3 597 }
cmorab 0:3e5f40db8cb3 598 }
cmorab 0:3e5f40db8cb3 599 }
cmorab 0:3e5f40db8cb3 600 }
cmorab 0:3e5f40db8cb3 601 }
cmorab 0:3e5f40db8cb3 602
cmorab 0:3e5f40db8cb3 603 // Aqui termina el decremental.
cmorab 0:3e5f40db8cb3 604
cmorab 0:3e5f40db8cb3 605 if (button4.falling()){
cmorab 0:3e5f40db8cb3 606 break; //sale del bucle si pisan suiche4
cmorab 0:3e5f40db8cb3 607 }
cmorab 0:3e5f40db8cb3 608 }
cmorab 0:3e5f40db8cb3 609
cmorab 0:3e5f40db8cb3 610 //**********************************************************************************
cmorab 0:3e5f40db8cb3 611 //*******************************************************************************************************
cmorab 0:3e5f40db8cb3 612
cmorab 0:3e5f40db8cb3 613
cmorab 0:3e5f40db8cb3 614
cmorab 0:3e5f40db8cb3 615 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
cmorab 0:3e5f40db8cb3 616 lcd.cls(); //borra la pantalla
cmorab 0:3e5f40db8cb3 617 lcd.printf(" GUARDADOS!");
cmorab 0:3e5f40db8cb3 618 wait(2);
cmorab 0:3e5f40db8cb3 619 lcd.cls();
cmorab 0:3e5f40db8cb3 620 lcd.printf(" INICIA EL PID");
cmorab 0:3e5f40db8cb3 621 wait(2);
cmorab 0:3e5f40db8cb3 622 // se imprimen los parches del control *****************************************
cmorab 0:3e5f40db8cb3 623 lcd.cls();
cmorab 0:3e5f40db8cb3 624 lcd.printf("Error%d",err);
cmorab 0:3e5f40db8cb3 625 lcd.locate(8,0);
cmorab 0:3e5f40db8cb3 626 lcd.printf("Medida%d",med);
cmorab 0:3e5f40db8cb3 627 lcd.locate(0,1);
cmorab 0:3e5f40db8cb3 628 lcd.printf("Sp%d",sp);
cmorab 0:3e5f40db8cb3 629 lcd.locate(8,1);
cmorab 0:3e5f40db8cb3 630 lcd.printf("Co%d",pid);
cmorab 0:3e5f40db8cb3 631 wait(5);
cmorab 0:3e5f40db8cb3 632
cmorab 0:3e5f40db8cb3 633 // CICLO PRINCIPAL CONTROLADOR PID
cmorab 0:3e5f40db8cb3 634
cmorab 0:3e5f40db8cb3 635 while(1) {
cmorab 0:3e5f40db8cb3 636 med=Vin;
cmorab 0:3e5f40db8cb3 637 //leer puerto analogo y asignar a med
cmorab 0:3e5f40db8cb3 638 err = (sp-med);
cmorab 0:3e5f40db8cb3 639 ap = kp*err;
cmorab 0:3e5f40db8cb3 640 ai =(ki*err)+ai; //calculo de la integral del error
cmorab 0:3e5f40db8cb3 641 // se verifica que la accion integral no sea muy grande
cmorab 0:3e5f40db8cb3 642 ad = kd*(err-err_v); //calculo de la accion derivativa
cmorab 0:3e5f40db8cb3 643 pid = (ap+ai+ad);
cmorab 0:3e5f40db8cb3 644 //****se muestran las variables******************************************
cmorab 0:3e5f40db8cb3 645 if (pid > 999){
cmorab 0:3e5f40db8cb3 646 pid=1000;
cmorab 0:3e5f40db8cb3 647 }
cmorab 0:3e5f40db8cb3 648
cmorab 0:3e5f40db8cb3 649 wait(.5);
cmorab 0:3e5f40db8cb3 650 lcd.locate(5,0);
cmorab 0:3e5f40db8cb3 651 lcd.printf("%d",err);
cmorab 0:3e5f40db8cb3 652 lcd.locate(14,0);
cmorab 0:3e5f40db8cb3 653 lcd.printf("%d",med);
cmorab 0:3e5f40db8cb3 654 lcd.locate(2,1);
cmorab 0:3e5f40db8cb3 655 lcd.printf("%d",sp);
cmorab 0:3e5f40db8cb3 656 lcd.locate(10,1);
cmorab 0:3e5f40db8cb3 657 lcd.printf("%d",pid);
cmorab 0:3e5f40db8cb3 658
cmorab 0:3e5f40db8cb3 659
cmorab 0:3e5f40db8cb3 660
cmorab 0:3e5f40db8cb3 661 // se actualizan las variables *******************************************
cmorab 0:3e5f40db8cb3 662 err_v = err;
cmorab 0:3e5f40db8cb3 663 // se verifica que pid sea positivo **************************************
cmorab 0:3e5f40db8cb3 664
cmorab 0:3e5f40db8cb3 665 // se verifica que pid sea menor o igual la valor maximo *****************
cmorab 0:3e5f40db8cb3 666
cmorab 0:3e5f40db8cb3 667
cmorab 0:3e5f40db8cb3 668 // se envia el valor pid a puerto analogico de salida (D/A) **************
cmorab 0:3e5f40db8cb3 669 // se repite el ciclo
cmorab 0:3e5f40db8cb3 670 }
cmorab 0:3e5f40db8cb3 671
cmorab 0:3e5f40db8cb3 672
cmorab 0:3e5f40db8cb3 673
cmorab 0:3e5f40db8cb3 674 }
cmorab 0:3e5f40db8cb3 675