programa controlador pid https://drive.google.com/drive/u/0/folders/0B17IW4rNa3-UZDlEdlBNVzlWdGc
Dependencies: QEI TextLCD mbed
main.cpp@0:7f32c2a0d548, 2016-10-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |