programa controlador pid https://drive.google.com/drive/u/0/folders/0B17IW4rNa3-UZDlEdlBNVzlWdGc

Dependencies:   QEI TextLCD mbed

Committer:
deiwidricaurte
Date:
Wed Oct 26 14:36:17 2016 +0000
Revision:
0:7f32c2a0d548
programa para ontrolar un pid con un app de appinventor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
deiwidricaurte 0:7f32c2a0d548 1 #include "mbed.h"
deiwidricaurte 0:7f32c2a0d548 2 #include "stdio.h"
deiwidricaurte 0:7f32c2a0d548 3 #include "string.h"
deiwidricaurte 0:7f32c2a0d548 4 #include "TextLCD.h"
deiwidricaurte 0:7f32c2a0d548 5 #include "QEI.h"
deiwidricaurte 0:7f32c2a0d548 6
deiwidricaurte 0:7f32c2a0d548 7 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
deiwidricaurte 0:7f32c2a0d548 8 QEI encoder (PTA13, PTD5, NC, 624);
deiwidricaurte 0:7f32c2a0d548 9 AnalogIn y(PTB3);//entrada analoga
deiwidricaurte 0:7f32c2a0d548 10 AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer
deiwidricaurte 0:7f32c2a0d548 11
deiwidricaurte 0:7f32c2a0d548 12 DigitalOut led1(LED1);
deiwidricaurte 0:7f32c2a0d548 13 DigitalOut led2(LED2);
deiwidricaurte 0:7f32c2a0d548 14 DigitalOut led3(LED3);
deiwidricaurte 0:7f32c2a0d548 15
deiwidricaurte 0:7f32c2a0d548 16 DigitalIn button3(PTC16);//cambia ingreso de los 4 parametros
deiwidricaurte 0:7f32c2a0d548 17 DigitalIn button4(PTC17);//termina y consolida valores de 4 parametros y sale del loop
deiwidricaurte 0:7f32c2a0d548 18
deiwidricaurte 0:7f32c2a0d548 19 Serial uart(PTE0,PTE1); //puertos del FRDM para el modem
deiwidricaurte 0:7f32c2a0d548 20 Serial pc(USBTX,USBRX); //puertos del PC
deiwidricaurte 0:7f32c2a0d548 21
deiwidricaurte 0:7f32c2a0d548 22 char buffer[4];// TAMAÑO DEL BUFER
deiwidricaurte 0:7f32c2a0d548 23 Timer t,t1; //VALOR DEL TIEMPO
deiwidricaurte 0:7f32c2a0d548 24 int count;
deiwidricaurte 0:7f32c2a0d548 25 int contador;
deiwidricaurte 0:7f32c2a0d548 26 int i = 0;
deiwidricaurte 0:7f32c2a0d548 27 int c=0;
deiwidricaurte 0:7f32c2a0d548 28 int sp=0,ki=0,kp=0,kd=0;
deiwidricaurte 0:7f32c2a0d548 29 int C1=0x0F;
deiwidricaurte 0:7f32c2a0d548 30 int C4=0x0C;
deiwidricaurte 0:7f32c2a0d548 31 int j,k;
deiwidricaurte 0:7f32c2a0d548 32 float pid,o,ai,ad,ap,med=0.0,err=0.0;
deiwidricaurte 0:7f32c2a0d548 33 float err_v,med_v;
deiwidricaurte 0:7f32c2a0d548 34 //char r[]="";
deiwidricaurte 0:7f32c2a0d548 35 //char clave[]="abcdefghijklmnopqrst";
deiwidricaurte 0:7f32c2a0d548 36
deiwidricaurte 0:7f32c2a0d548 37 int readBuffer(char *buffer,int count) //esta funcion lee un bufer de datos
deiwidricaurte 0:7f32c2a0d548 38 {
deiwidricaurte 0:7f32c2a0d548 39 int i=0;
deiwidricaurte 0:7f32c2a0d548 40 t.start(); //CUENTA EL TIEMPO DE CONEXION E INICIA
deiwidricaurte 0:7f32c2a0d548 41 while(1) {
deiwidricaurte 0:7f32c2a0d548 42
deiwidricaurte 0:7f32c2a0d548 43 while (uart.readable()) {
deiwidricaurte 0:7f32c2a0d548 44 char c = uart.getc();
deiwidricaurte 0:7f32c2a0d548 45 if (c == '\r' || c == '\n') c = '$';//si se envia fin de linea o de caracxter inserta $
deiwidricaurte 0:7f32c2a0d548 46 buffer[i++] = c;//mete al bufer el caracter leido
deiwidricaurte 0:7f32c2a0d548 47 if(i > count)break;//sale del loop si ya detecto terminacion
deiwidricaurte 0:7f32c2a0d548 48 }
deiwidricaurte 0:7f32c2a0d548 49 if(i > count)break;
deiwidricaurte 0:7f32c2a0d548 50 if(t.read() > 1) { //MAS DE UN SEGUNDO DE ESPERA SE SALE Y REINICA EL RELOJ Y SE SALE
deiwidricaurte 0:7f32c2a0d548 51 t.stop();
deiwidricaurte 0:7f32c2a0d548 52 t.reset();
deiwidricaurte 0:7f32c2a0d548 53 break;
deiwidricaurte 0:7f32c2a0d548 54 }
deiwidricaurte 0:7f32c2a0d548 55 }
deiwidricaurte 0:7f32c2a0d548 56 return 0;
deiwidricaurte 0:7f32c2a0d548 57 }
deiwidricaurte 0:7f32c2a0d548 58
deiwidricaurte 0:7f32c2a0d548 59 void cleanBuffer(char *buffer, int count) //esta funcion limpia el bufer
deiwidricaurte 0:7f32c2a0d548 60 {
deiwidricaurte 0:7f32c2a0d548 61 for(int i=0; i < count; i++) {
deiwidricaurte 0:7f32c2a0d548 62 buffer[i] = '\0';
deiwidricaurte 0:7f32c2a0d548 63 }
deiwidricaurte 0:7f32c2a0d548 64 }
deiwidricaurte 0:7f32c2a0d548 65
deiwidricaurte 0:7f32c2a0d548 66 //
deiwidricaurte 0:7f32c2a0d548 67 void enviarvalores()
deiwidricaurte 0:7f32c2a0d548 68 {
deiwidricaurte 0:7f32c2a0d548 69 wait(0.1);
deiwidricaurte 0:7f32c2a0d548 70 if(sp<256)
deiwidricaurte 0:7f32c2a0d548 71 {
deiwidricaurte 0:7f32c2a0d548 72 uart.putc(sp);
deiwidricaurte 0:7f32c2a0d548 73 uart.putc(0);
deiwidricaurte 0:7f32c2a0d548 74
deiwidricaurte 0:7f32c2a0d548 75 }
deiwidricaurte 0:7f32c2a0d548 76 if(sp>255)
deiwidricaurte 0:7f32c2a0d548 77 {
deiwidricaurte 0:7f32c2a0d548 78 j=sp/256;
deiwidricaurte 0:7f32c2a0d548 79 k=sp-j*256;
deiwidricaurte 0:7f32c2a0d548 80 uart.putc(k);
deiwidricaurte 0:7f32c2a0d548 81 uart.putc(j);
deiwidricaurte 0:7f32c2a0d548 82
deiwidricaurte 0:7f32c2a0d548 83 }
deiwidricaurte 0:7f32c2a0d548 84 wait(0.001);
deiwidricaurte 0:7f32c2a0d548 85 if(kp<256)
deiwidricaurte 0:7f32c2a0d548 86 {
deiwidricaurte 0:7f32c2a0d548 87 uart.putc(kp);
deiwidricaurte 0:7f32c2a0d548 88 uart.putc(0);
deiwidricaurte 0:7f32c2a0d548 89
deiwidricaurte 0:7f32c2a0d548 90 }
deiwidricaurte 0:7f32c2a0d548 91 if(kp>255)
deiwidricaurte 0:7f32c2a0d548 92 {
deiwidricaurte 0:7f32c2a0d548 93 j=kp/256;
deiwidricaurte 0:7f32c2a0d548 94 k=kp-j*256;
deiwidricaurte 0:7f32c2a0d548 95 uart.putc(k);
deiwidricaurte 0:7f32c2a0d548 96 uart.putc(j);
deiwidricaurte 0:7f32c2a0d548 97
deiwidricaurte 0:7f32c2a0d548 98 }
deiwidricaurte 0:7f32c2a0d548 99 wait(0.001);
deiwidricaurte 0:7f32c2a0d548 100 if(ki<256)
deiwidricaurte 0:7f32c2a0d548 101 {
deiwidricaurte 0:7f32c2a0d548 102
deiwidricaurte 0:7f32c2a0d548 103 uart.putc(ki);
deiwidricaurte 0:7f32c2a0d548 104 uart.putc(0);
deiwidricaurte 0:7f32c2a0d548 105
deiwidricaurte 0:7f32c2a0d548 106 }
deiwidricaurte 0:7f32c2a0d548 107 if(ki>255)
deiwidricaurte 0:7f32c2a0d548 108 {
deiwidricaurte 0:7f32c2a0d548 109 j=ki/256;
deiwidricaurte 0:7f32c2a0d548 110 k=ki-j*256;
deiwidricaurte 0:7f32c2a0d548 111 uart.putc(k);
deiwidricaurte 0:7f32c2a0d548 112 uart.putc(j);
deiwidricaurte 0:7f32c2a0d548 113
deiwidricaurte 0:7f32c2a0d548 114 }
deiwidricaurte 0:7f32c2a0d548 115 wait(0.001);
deiwidricaurte 0:7f32c2a0d548 116 if(kd<256)
deiwidricaurte 0:7f32c2a0d548 117 {
deiwidricaurte 0:7f32c2a0d548 118 uart.putc(kd);
deiwidricaurte 0:7f32c2a0d548 119 uart.putc(0);
deiwidricaurte 0:7f32c2a0d548 120
deiwidricaurte 0:7f32c2a0d548 121 }
deiwidricaurte 0:7f32c2a0d548 122 if(sp>255)
deiwidricaurte 0:7f32c2a0d548 123 {
deiwidricaurte 0:7f32c2a0d548 124 j=kd/256;
deiwidricaurte 0:7f32c2a0d548 125 k=kd-j*256;
deiwidricaurte 0:7f32c2a0d548 126 uart.putc(k);
deiwidricaurte 0:7f32c2a0d548 127 uart.putc(j);
deiwidricaurte 0:7f32c2a0d548 128
deiwidricaurte 0:7f32c2a0d548 129 }
deiwidricaurte 0:7f32c2a0d548 130 err_v = err;
deiwidricaurte 0:7f32c2a0d548 131 if(err_v<0)
deiwidricaurte 0:7f32c2a0d548 132 {
deiwidricaurte 0:7f32c2a0d548 133 err_v=err_v*(-1);
deiwidricaurte 0:7f32c2a0d548 134 }
deiwidricaurte 0:7f32c2a0d548 135
deiwidricaurte 0:7f32c2a0d548 136 if(err_v<256)
deiwidricaurte 0:7f32c2a0d548 137 {
deiwidricaurte 0:7f32c2a0d548 138 uart.putc(err_v);
deiwidricaurte 0:7f32c2a0d548 139 uart.putc(0);
deiwidricaurte 0:7f32c2a0d548 140
deiwidricaurte 0:7f32c2a0d548 141 }
deiwidricaurte 0:7f32c2a0d548 142
deiwidricaurte 0:7f32c2a0d548 143 if(err_v>255)
deiwidricaurte 0:7f32c2a0d548 144 {
deiwidricaurte 0:7f32c2a0d548 145 j=err_v/256;
deiwidricaurte 0:7f32c2a0d548 146 k=err_v-j*256;
deiwidricaurte 0:7f32c2a0d548 147 uart.putc(k);
deiwidricaurte 0:7f32c2a0d548 148 uart.putc(j);
deiwidricaurte 0:7f32c2a0d548 149
deiwidricaurte 0:7f32c2a0d548 150 }
deiwidricaurte 0:7f32c2a0d548 151 //wait(0.1);
deiwidricaurte 0:7f32c2a0d548 152
deiwidricaurte 0:7f32c2a0d548 153 med_v = med;
deiwidricaurte 0:7f32c2a0d548 154 //wait(0.1);
deiwidricaurte 0:7f32c2a0d548 155 if(med_v<256)
deiwidricaurte 0:7f32c2a0d548 156 {
deiwidricaurte 0:7f32c2a0d548 157 uart.putc(med_v);
deiwidricaurte 0:7f32c2a0d548 158 uart.putc(0);
deiwidricaurte 0:7f32c2a0d548 159
deiwidricaurte 0:7f32c2a0d548 160 }
deiwidricaurte 0:7f32c2a0d548 161
deiwidricaurte 0:7f32c2a0d548 162 if(med_v>255)
deiwidricaurte 0:7f32c2a0d548 163 {
deiwidricaurte 0:7f32c2a0d548 164 j=med_v/256;
deiwidricaurte 0:7f32c2a0d548 165 k=med_v-j*256;
deiwidricaurte 0:7f32c2a0d548 166 uart.putc(k);
deiwidricaurte 0:7f32c2a0d548 167 uart.putc(j);
deiwidricaurte 0:7f32c2a0d548 168
deiwidricaurte 0:7f32c2a0d548 169 }
deiwidricaurte 0:7f32c2a0d548 170
deiwidricaurte 0:7f32c2a0d548 171 }
deiwidricaurte 0:7f32c2a0d548 172 //
deiwidricaurte 0:7f32c2a0d548 173 void encoderdatos()
deiwidricaurte 0:7f32c2a0d548 174 {
deiwidricaurte 0:7f32c2a0d548 175
deiwidricaurte 0:7f32c2a0d548 176 int pos=1;
deiwidricaurte 0:7f32c2a0d548 177 int cambio=0, diferencia=0;
deiwidricaurte 0:7f32c2a0d548 178
deiwidricaurte 0:7f32c2a0d548 179 while(1)
deiwidricaurte 0:7f32c2a0d548 180 {
deiwidricaurte 0:7f32c2a0d548 181
deiwidricaurte 0:7f32c2a0d548 182 diferencia=encoder.getPulses()-cambio;
deiwidricaurte 0:7f32c2a0d548 183 cambio=encoder.getPulses();
deiwidricaurte 0:7f32c2a0d548 184 if (diferencia==0)
deiwidricaurte 0:7f32c2a0d548 185 {
deiwidricaurte 0:7f32c2a0d548 186 //nada
deiwidricaurte 0:7f32c2a0d548 187 }
deiwidricaurte 0:7f32c2a0d548 188 else if(diferencia>0)
deiwidricaurte 0:7f32c2a0d548 189 {
deiwidricaurte 0:7f32c2a0d548 190 if(pos==1)
deiwidricaurte 0:7f32c2a0d548 191 {
deiwidricaurte 0:7f32c2a0d548 192
deiwidricaurte 0:7f32c2a0d548 193 if(sp+diferencia>=999)
deiwidricaurte 0:7f32c2a0d548 194 {
deiwidricaurte 0:7f32c2a0d548 195 sp=999;
deiwidricaurte 0:7f32c2a0d548 196 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 197 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 198 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 199 lcd.printf("%d", sp);
deiwidricaurte 0:7f32c2a0d548 200 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 201 }
deiwidricaurte 0:7f32c2a0d548 202 else
deiwidricaurte 0:7f32c2a0d548 203 {
deiwidricaurte 0:7f32c2a0d548 204 sp+=diferencia;
deiwidricaurte 0:7f32c2a0d548 205 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 206 lcd.printf("%d", sp);
deiwidricaurte 0:7f32c2a0d548 207 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 208
deiwidricaurte 0:7f32c2a0d548 209
deiwidricaurte 0:7f32c2a0d548 210 }
deiwidricaurte 0:7f32c2a0d548 211 }
deiwidricaurte 0:7f32c2a0d548 212 else if(pos==2)
deiwidricaurte 0:7f32c2a0d548 213 {
deiwidricaurte 0:7f32c2a0d548 214 if(kp+diferencia>=999)
deiwidricaurte 0:7f32c2a0d548 215 {
deiwidricaurte 0:7f32c2a0d548 216 kp=999;
deiwidricaurte 0:7f32c2a0d548 217 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 218 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 219 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 220 lcd.printf("%d", kp);
deiwidricaurte 0:7f32c2a0d548 221 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 222 }
deiwidricaurte 0:7f32c2a0d548 223 else
deiwidricaurte 0:7f32c2a0d548 224 {
deiwidricaurte 0:7f32c2a0d548 225 kp+=diferencia;
deiwidricaurte 0:7f32c2a0d548 226 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 227 lcd.printf("%d", kp);
deiwidricaurte 0:7f32c2a0d548 228 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 229 }
deiwidricaurte 0:7f32c2a0d548 230 }
deiwidricaurte 0:7f32c2a0d548 231 else if(pos==3)
deiwidricaurte 0:7f32c2a0d548 232 {
deiwidricaurte 0:7f32c2a0d548 233 if(ki+diferencia>=999)
deiwidricaurte 0:7f32c2a0d548 234 {
deiwidricaurte 0:7f32c2a0d548 235 ki=999;
deiwidricaurte 0:7f32c2a0d548 236 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 237 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 238 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 239 lcd.printf("%d", ki);
deiwidricaurte 0:7f32c2a0d548 240 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 241 }
deiwidricaurte 0:7f32c2a0d548 242 else
deiwidricaurte 0:7f32c2a0d548 243 {
deiwidricaurte 0:7f32c2a0d548 244 ki+=diferencia;
deiwidricaurte 0:7f32c2a0d548 245 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 246 lcd.printf("%d", ki);
deiwidricaurte 0:7f32c2a0d548 247 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 248 }
deiwidricaurte 0:7f32c2a0d548 249 }
deiwidricaurte 0:7f32c2a0d548 250 else if(pos==4)
deiwidricaurte 0:7f32c2a0d548 251 {
deiwidricaurte 0:7f32c2a0d548 252 if(kd+diferencia>=999)
deiwidricaurte 0:7f32c2a0d548 253 {
deiwidricaurte 0:7f32c2a0d548 254 kd=999;
deiwidricaurte 0:7f32c2a0d548 255 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 256 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 257 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 258 lcd.printf("%d", kd);
deiwidricaurte 0:7f32c2a0d548 259 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 260 }
deiwidricaurte 0:7f32c2a0d548 261 else
deiwidricaurte 0:7f32c2a0d548 262 {
deiwidricaurte 0:7f32c2a0d548 263 kd+=diferencia;
deiwidricaurte 0:7f32c2a0d548 264 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 265 lcd.printf("%d", kd);
deiwidricaurte 0:7f32c2a0d548 266 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 267 }
deiwidricaurte 0:7f32c2a0d548 268 }
deiwidricaurte 0:7f32c2a0d548 269 }
deiwidricaurte 0:7f32c2a0d548 270 else if(diferencia<0)
deiwidricaurte 0:7f32c2a0d548 271 {
deiwidricaurte 0:7f32c2a0d548 272 if(pos==1)
deiwidricaurte 0:7f32c2a0d548 273 {
deiwidricaurte 0:7f32c2a0d548 274 if(sp+diferencia<0)
deiwidricaurte 0:7f32c2a0d548 275 {
deiwidricaurte 0:7f32c2a0d548 276 //No ocurre nada
deiwidricaurte 0:7f32c2a0d548 277 }
deiwidricaurte 0:7f32c2a0d548 278 else
deiwidricaurte 0:7f32c2a0d548 279 {
deiwidricaurte 0:7f32c2a0d548 280 sp+=diferencia;
deiwidricaurte 0:7f32c2a0d548 281 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 282 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 283 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 284 lcd.printf("%d", sp);
deiwidricaurte 0:7f32c2a0d548 285 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 286 }
deiwidricaurte 0:7f32c2a0d548 287 }
deiwidricaurte 0:7f32c2a0d548 288 else if(pos==2)
deiwidricaurte 0:7f32c2a0d548 289 {
deiwidricaurte 0:7f32c2a0d548 290 if(kp+diferencia<0)
deiwidricaurte 0:7f32c2a0d548 291 {
deiwidricaurte 0:7f32c2a0d548 292 //No ocurre nada
deiwidricaurte 0:7f32c2a0d548 293 }
deiwidricaurte 0:7f32c2a0d548 294 else
deiwidricaurte 0:7f32c2a0d548 295 {
deiwidricaurte 0:7f32c2a0d548 296 kp+=diferencia;
deiwidricaurte 0:7f32c2a0d548 297 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 298 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 299 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 300 lcd.printf("%d", kp);
deiwidricaurte 0:7f32c2a0d548 301 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 302 }
deiwidricaurte 0:7f32c2a0d548 303 }
deiwidricaurte 0:7f32c2a0d548 304 else if(pos==3)
deiwidricaurte 0:7f32c2a0d548 305 {
deiwidricaurte 0:7f32c2a0d548 306 if(ki+diferencia<0)
deiwidricaurte 0:7f32c2a0d548 307 {
deiwidricaurte 0:7f32c2a0d548 308 //No ocurre nada
deiwidricaurte 0:7f32c2a0d548 309 }
deiwidricaurte 0:7f32c2a0d548 310 else
deiwidricaurte 0:7f32c2a0d548 311 {
deiwidricaurte 0:7f32c2a0d548 312 ki+=diferencia;
deiwidricaurte 0:7f32c2a0d548 313 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 314 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 315 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 316 lcd.printf("%d", ki);
deiwidricaurte 0:7f32c2a0d548 317 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 318 }
deiwidricaurte 0:7f32c2a0d548 319 }
deiwidricaurte 0:7f32c2a0d548 320 else if(pos==4)
deiwidricaurte 0:7f32c2a0d548 321 {
deiwidricaurte 0:7f32c2a0d548 322 if(kd+diferencia<0)
deiwidricaurte 0:7f32c2a0d548 323 {
deiwidricaurte 0:7f32c2a0d548 324 //No ocurre nada
deiwidricaurte 0:7f32c2a0d548 325 }
deiwidricaurte 0:7f32c2a0d548 326 else
deiwidricaurte 0:7f32c2a0d548 327 {
deiwidricaurte 0:7f32c2a0d548 328 kd+=diferencia;
deiwidricaurte 0:7f32c2a0d548 329 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 330 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 331 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 332 lcd.printf("%d", kd);
deiwidricaurte 0:7f32c2a0d548 333 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 334 }
deiwidricaurte 0:7f32c2a0d548 335 }
deiwidricaurte 0:7f32c2a0d548 336 }
deiwidricaurte 0:7f32c2a0d548 337 if (!button3) //cambia la posicion de ingreso de parametros
deiwidricaurte 0:7f32c2a0d548 338 {
deiwidricaurte 0:7f32c2a0d548 339 led3 =!led3;
deiwidricaurte 0:7f32c2a0d548 340 if(pos==4)
deiwidricaurte 0:7f32c2a0d548 341 {
deiwidricaurte 0:7f32c2a0d548 342 pos=1;
deiwidricaurte 0:7f32c2a0d548 343 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 344 lcd.printf("%d", sp);
deiwidricaurte 0:7f32c2a0d548 345 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 346 }
deiwidricaurte 0:7f32c2a0d548 347 else if (pos==1)
deiwidricaurte 0:7f32c2a0d548 348 {
deiwidricaurte 0:7f32c2a0d548 349 pos++;
deiwidricaurte 0:7f32c2a0d548 350 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 351 lcd.printf("%d", kp);
deiwidricaurte 0:7f32c2a0d548 352 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 353 }
deiwidricaurte 0:7f32c2a0d548 354 else if(pos==2)
deiwidricaurte 0:7f32c2a0d548 355 {
deiwidricaurte 0:7f32c2a0d548 356 pos++;
deiwidricaurte 0:7f32c2a0d548 357 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 358 lcd.printf("%d", ki);
deiwidricaurte 0:7f32c2a0d548 359 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 360 }
deiwidricaurte 0:7f32c2a0d548 361 else if(pos==3)
deiwidricaurte 0:7f32c2a0d548 362 {
deiwidricaurte 0:7f32c2a0d548 363 pos++;
deiwidricaurte 0:7f32c2a0d548 364 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 365 lcd.printf("%d", kd);
deiwidricaurte 0:7f32c2a0d548 366 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 367 }
deiwidricaurte 0:7f32c2a0d548 368 wait(0.25);
deiwidricaurte 0:7f32c2a0d548 369
deiwidricaurte 0:7f32c2a0d548 370 }
deiwidricaurte 0:7f32c2a0d548 371
deiwidricaurte 0:7f32c2a0d548 372
deiwidricaurte 0:7f32c2a0d548 373 if (!button4)
deiwidricaurte 0:7f32c2a0d548 374 {
deiwidricaurte 0:7f32c2a0d548 375 break; //sale del bucle si pisan suiche4
deiwidricaurte 0:7f32c2a0d548 376 }
deiwidricaurte 0:7f32c2a0d548 377
deiwidricaurte 0:7f32c2a0d548 378 wait(0.01);
deiwidricaurte 0:7f32c2a0d548 379 }
deiwidricaurte 0:7f32c2a0d548 380 //return spnum,kinum,kpnum,kdnum;
deiwidricaurte 0:7f32c2a0d548 381
deiwidricaurte 0:7f32c2a0d548 382 }
deiwidricaurte 0:7f32c2a0d548 383 //
deiwidricaurte 0:7f32c2a0d548 384
deiwidricaurte 0:7f32c2a0d548 385 int main(void)
deiwidricaurte 0:7f32c2a0d548 386 {
deiwidricaurte 0:7f32c2a0d548 387
deiwidricaurte 0:7f32c2a0d548 388 uart.baud(9600);
deiwidricaurte 0:7f32c2a0d548 389 uart.format(8,Serial::None,1);
deiwidricaurte 0:7f32c2a0d548 390 lcd.locate(0,1);
deiwidricaurte 0:7f32c2a0d548 391 lcd.printf("**Control PID**");
deiwidricaurte 0:7f32c2a0d548 392 wait(2);
deiwidricaurte 0:7f32c2a0d548 393 lcd.cls(); // Borrar Pantalla
deiwidricaurte 0:7f32c2a0d548 394 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
deiwidricaurte 0:7f32c2a0d548 395
deiwidricaurte 0:7f32c2a0d548 396 lcd.locate(8,0);
deiwidricaurte 0:7f32c2a0d548 397 lcd.printf("Kp=%d",kp);
deiwidricaurte 0:7f32c2a0d548 398 lcd.locate(0,1);
deiwidricaurte 0:7f32c2a0d548 399 lcd.printf("Ki=%d",ki);
deiwidricaurte 0:7f32c2a0d548 400 lcd.locate(8,1);
deiwidricaurte 0:7f32c2a0d548 401 lcd.printf("Kd=%d",kd);
deiwidricaurte 0:7f32c2a0d548 402 lcd.locate(0,0);
deiwidricaurte 0:7f32c2a0d548 403 lcd.printf("Sp=%d",sp);
deiwidricaurte 0:7f32c2a0d548 404 wait(0.2);
deiwidricaurte 0:7f32c2a0d548 405 encoderdatos();
deiwidricaurte 0:7f32c2a0d548 406 wait(0.1);
deiwidricaurte 0:7f32c2a0d548 407
deiwidricaurte 0:7f32c2a0d548 408
deiwidricaurte 0:7f32c2a0d548 409 //Transicion
deiwidricaurte 0:7f32c2a0d548 410 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
deiwidricaurte 0:7f32c2a0d548 411 lcd.cls(); //borra la pantalla
deiwidricaurte 0:7f32c2a0d548 412 lcd.printf(" GUARDADOS!");
deiwidricaurte 0:7f32c2a0d548 413 wait(1);
deiwidricaurte 0:7f32c2a0d548 414 lcd.cls();
deiwidricaurte 0:7f32c2a0d548 415 lcd.printf(" INICIA EL PID");
deiwidricaurte 0:7f32c2a0d548 416 wait(1);
deiwidricaurte 0:7f32c2a0d548 417 // se imprimen los parches del control *****************************************
deiwidricaurte 0:7f32c2a0d548 418 lcd.cls();
deiwidricaurte 0:7f32c2a0d548 419 lcd.printf("Er=%3.0f",err);
deiwidricaurte 0:7f32c2a0d548 420 lcd.locate(8,0);
deiwidricaurte 0:7f32c2a0d548 421 lcd.printf("Me=%3.0f",med);
deiwidricaurte 0:7f32c2a0d548 422 lcd.locate(0,1);
deiwidricaurte 0:7f32c2a0d548 423 lcd.printf("Sp=%3.0f",sp);
deiwidricaurte 0:7f32c2a0d548 424 lcd.locate(8,1);
deiwidricaurte 0:7f32c2a0d548 425 lcd.printf("Co=%3.0f",pid);
deiwidricaurte 0:7f32c2a0d548 426 wait(1);
deiwidricaurte 0:7f32c2a0d548 427
deiwidricaurte 0:7f32c2a0d548 428
deiwidricaurte 0:7f32c2a0d548 429 //ciclo control
deiwidricaurte 0:7f32c2a0d548 430 while(1)
deiwidricaurte 0:7f32c2a0d548 431 {
deiwidricaurte 0:7f32c2a0d548 432 //Serial uart(PTE0,PTE1);
deiwidricaurte 0:7f32c2a0d548 433 //Serial pc(USBTX,USBRX);
deiwidricaurte 0:7f32c2a0d548 434 //uart.baud(9600);
deiwidricaurte 0:7f32c2a0d548 435 //uart.format(8,Serial::None,1);
deiwidricaurte 0:7f32c2a0d548 436 if (uart.readable())
deiwidricaurte 0:7f32c2a0d548 437 {
deiwidricaurte 0:7f32c2a0d548 438 readBuffer(buffer,4);
deiwidricaurte 0:7f32c2a0d548 439
deiwidricaurte 0:7f32c2a0d548 440 pc.printf("buffer= %s\n\r ",buffer);
deiwidricaurte 0:7f32c2a0d548 441 if(buffer[0] == 'n')
deiwidricaurte 0:7f32c2a0d548 442 {
deiwidricaurte 0:7f32c2a0d548 443 med = y.read()*999;
deiwidricaurte 0:7f32c2a0d548 444 err = (sp-med); //se calcula el error
deiwidricaurte 0:7f32c2a0d548 445 ap = kp*err*0.01f; //se calcula la accion proporcinal
deiwidricaurte 0:7f32c2a0d548 446 ai =(ki*err*0.01f)+ai; //calculo de la integral del error
deiwidricaurte 0:7f32c2a0d548 447 ad = kd*(err-err_v)*0.01f; //calculo de la accion derivativa
deiwidricaurte 0:7f32c2a0d548 448 pid = (ap+ai+ad);
deiwidricaurte 0:7f32c2a0d548 449 // se verifica que pid sea positivo **************************************
deiwidricaurte 0:7f32c2a0d548 450 if(pid<=0)
deiwidricaurte 0:7f32c2a0d548 451 {
deiwidricaurte 0:7f32c2a0d548 452 pid=0;
deiwidricaurte 0:7f32c2a0d548 453 }
deiwidricaurte 0:7f32c2a0d548 454
deiwidricaurte 0:7f32c2a0d548 455 // se verifica que pid sea menor o igual la valor maximo *****************
deiwidricaurte 0:7f32c2a0d548 456 if (pid > 999)
deiwidricaurte 0:7f32c2a0d548 457 {
deiwidricaurte 0:7f32c2a0d548 458 pid=999;
deiwidricaurte 0:7f32c2a0d548 459 }
deiwidricaurte 0:7f32c2a0d548 460
deiwidricaurte 0:7f32c2a0d548 461 //se muestran las variables******************************************
deiwidricaurte 0:7f32c2a0d548 462 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 463 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 464 lcd.locate(3,0);
deiwidricaurte 0:7f32c2a0d548 465 lcd.printf("%3.0f",err);
deiwidricaurte 0:7f32c2a0d548 466 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 467 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 468 lcd.locate(11,0);
deiwidricaurte 0:7f32c2a0d548 469 lcd.printf("%3.0f",med);
deiwidricaurte 0:7f32c2a0d548 470 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 471 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 472 lcd.locate(3,1);
deiwidricaurte 0:7f32c2a0d548 473 lcd.printf("%d",sp);
deiwidricaurte 0:7f32c2a0d548 474 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 475 lcd.printf(" ");
deiwidricaurte 0:7f32c2a0d548 476 lcd.locate(11,1);
deiwidricaurte 0:7f32c2a0d548 477 lcd.printf("%3.0f",pid);
deiwidricaurte 0:7f32c2a0d548 478
deiwidricaurte 0:7f32c2a0d548 479
deiwidricaurte 0:7f32c2a0d548 480
deiwidricaurte 0:7f32c2a0d548 481 o = pid/999;
deiwidricaurte 0:7f32c2a0d548 482 u.write(o);
deiwidricaurte 0:7f32c2a0d548 483 // se envia el valor pid a puerto analogico de salida (D/A) **************
deiwidricaurte 0:7f32c2a0d548 484
deiwidricaurte 0:7f32c2a0d548 485 // se repite el ciclo
deiwidricaurte 0:7f32c2a0d548 486 wait_ms(10);
deiwidricaurte 0:7f32c2a0d548 487 }
deiwidricaurte 0:7f32c2a0d548 488 else if(buffer[0] == 's')
deiwidricaurte 0:7f32c2a0d548 489 {
deiwidricaurte 0:7f32c2a0d548 490 int sp1=int(buffer[1]-48)*100+int(buffer[2]-48)*10+int(buffer[3]-48)*1;
deiwidricaurte 0:7f32c2a0d548 491 if(sp1<1000)
deiwidricaurte 0:7f32c2a0d548 492 {
deiwidricaurte 0:7f32c2a0d548 493 sp=sp1;
deiwidricaurte 0:7f32c2a0d548 494 }
deiwidricaurte 0:7f32c2a0d548 495 wait(0.01);
deiwidricaurte 0:7f32c2a0d548 496 }
deiwidricaurte 0:7f32c2a0d548 497 else if(buffer[0] == 'p')
deiwidricaurte 0:7f32c2a0d548 498 {
deiwidricaurte 0:7f32c2a0d548 499 int kp1=int(buffer[1]-48)*100+int(buffer[2]-48)*10+int(buffer[3]-48)*1;
deiwidricaurte 0:7f32c2a0d548 500 if(kp1<1000)
deiwidricaurte 0:7f32c2a0d548 501 {
deiwidricaurte 0:7f32c2a0d548 502 kp=kp1;
deiwidricaurte 0:7f32c2a0d548 503 }
deiwidricaurte 0:7f32c2a0d548 504 wait(0.01);
deiwidricaurte 0:7f32c2a0d548 505 }
deiwidricaurte 0:7f32c2a0d548 506 else if(buffer[0] == 'd')
deiwidricaurte 0:7f32c2a0d548 507 {
deiwidricaurte 0:7f32c2a0d548 508 int kd1=int(buffer[1]-48)*100+int(buffer[2]-48)*10+int(buffer[3]-48)*1;
deiwidricaurte 0:7f32c2a0d548 509 if(kd1<1000)
deiwidricaurte 0:7f32c2a0d548 510 {
deiwidricaurte 0:7f32c2a0d548 511 kd=kd1;
deiwidricaurte 0:7f32c2a0d548 512 }
deiwidricaurte 0:7f32c2a0d548 513 wait(0.01);;
deiwidricaurte 0:7f32c2a0d548 514 }
deiwidricaurte 0:7f32c2a0d548 515 else if(buffer[0] == 'i')
deiwidricaurte 0:7f32c2a0d548 516 {
deiwidricaurte 0:7f32c2a0d548 517 int ki1=int(buffer[1]-48)*100+int(buffer[2]-48)*10+int(buffer[3]-48)*1;
deiwidricaurte 0:7f32c2a0d548 518 if(ki1<1000)
deiwidricaurte 0:7f32c2a0d548 519 {
deiwidricaurte 0:7f32c2a0d548 520 ki=ki1;
deiwidricaurte 0:7f32c2a0d548 521 }
deiwidricaurte 0:7f32c2a0d548 522 wait(0.01);
deiwidricaurte 0:7f32c2a0d548 523 }
deiwidricaurte 0:7f32c2a0d548 524 cleanBuffer(buffer,6);
deiwidricaurte 0:7f32c2a0d548 525 enviarvalores();
deiwidricaurte 0:7f32c2a0d548 526 }
deiwidricaurte 0:7f32c2a0d548 527
deiwidricaurte 0:7f32c2a0d548 528 }
deiwidricaurte 0:7f32c2a0d548 529
deiwidricaurte 0:7f32c2a0d548 530
deiwidricaurte 0:7f32c2a0d548 531 }