PID_TECLAS

Dependencies:   DebouncedIn TextLCD mbed

Fork of PID_Encoder by Gustavo Ramirez

Committer:
sagilar
Date:
Fri Apr 10 02:37:11 2015 +0000
Revision:
5:a582c64fce81
Parent:
4:d42fe3777735
PID_TECLAS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lcorralesc1 0:8d2bbee60422 1 #include "mbed.h"
lcorralesc1 0:8d2bbee60422 2 #include "DebouncedIn.h"
lcorralesc1 0:8d2bbee60422 3 #include "TextLCD.h"
sagilar 5:a582c64fce81 4 AnalogIn Vin(PTC2);
sagilar 5:a582c64fce81 5 AnalogOut u(PTE30);
lcorralesc1 0:8d2bbee60422 6 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
lcorralesc1 0:8d2bbee60422 7 DigitalOut led1(LED1);
lcorralesc1 0:8d2bbee60422 8 DigitalOut led2(LED2);
lcorralesc1 0:8d2bbee60422 9 DebouncedIn button1(PTC12);
lcorralesc1 0:8d2bbee60422 10 DebouncedIn button2(PTC13);
lcorralesc1 0:8d2bbee60422 11 DebouncedIn button3(PTC16);
lcorralesc1 0:8d2bbee60422 12 DebouncedIn button4(PTC17);
sagilar 5:a582c64fce81 13 Timer t; //se define la función del timer interno que ofrece la plataforma mbed
sagilar 5:a582c64fce81 14
sagilar 5:a582c64fce81 15 /* codigos movimiento del curzor
sagilar 5:a582c64fce81 16 18 para izquierda
sagilar 5:a582c64fce81 17 1A para derecha
sagilar 5:a582c64fce81 18 */
sagilar 5:a582c64fce81 19
sagilar 5:a582c64fce81 20
sagilar 5:a582c64fce81 21 int C1=0x0E; // solo muestra el curzor
lcorralesc1 0:8d2bbee60422 22 int C2=0x18; // desplaza izquierda
lcorralesc1 0:8d2bbee60422 23 int C3=0x1A; // desplaza derecha
lcorralesc1 0:8d2bbee60422 24 int C4=0x0C; // quito cursor bajo
lcorralesc1 0:8d2bbee60422 25 int i; // indice de la variable
sagilar 5:a582c64fce81 26 int j;
sagilar 5:a582c64fce81 27 int kp,ki,kd,sp;
sagilar 5:a582c64fce81 28 float med,pid,pidn,ap,ai,ad,err,err_v,err_v2;
sagilar 5:a582c64fce81 29 int count;
sagilar 5:a582c64fce81 30 int esc=1;
lcorralesc1 0:8d2bbee60422 31 int main() {
lcorralesc1 0:8d2bbee60422 32 lcd.cls();
sagilar 5:a582c64fce81 33 lcd.locate(0,0);
sagilar 5:a582c64fce81 34 lcd.printf("Sp=%d",sp);
sagilar 5:a582c64fce81 35 lcd.locate(6,0);
sagilar 5:a582c64fce81 36 lcd.printf("Kp=%d",kp);
sagilar 5:a582c64fce81 37 lcd.locate(0,1);
sagilar 5:a582c64fce81 38 lcd.printf("Ki=%d",ki);
sagilar 5:a582c64fce81 39 lcd.locate(6,1);
sagilar 5:a582c64fce81 40 lcd.printf("Kd=%d",kd);
sagilar 5:a582c64fce81 41 lcd.locate(12,1);
sagilar 5:a582c64fce81 42 lcd.printf("E%d",esc);
lcorralesc1 0:8d2bbee60422 43 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
lcorralesc1 0:8d2bbee60422 44 lcd.locate(0,0);
sagilar 5:a582c64fce81 45 lcd.printf("Sp=%d",sp);
sagilar 5:a582c64fce81 46
lcorralesc1 0:8d2bbee60422 47 while(1) {
sagilar 5:a582c64fce81 48 if (button3.falling()) {
lcorralesc1 0:8d2bbee60422 49 ++j;
sagilar 5:a582c64fce81 50 } //INCREMENTA POSICION DEL MENU CON BOTON 3
sagilar 5:a582c64fce81 51 if (j==0){
sagilar 5:a582c64fce81 52 lcd.locate(3,0);
sagilar 5:a582c64fce81 53 lcd.printf("%d",sp);
sagilar 5:a582c64fce81 54
sagilar 5:a582c64fce81 55 if (button1.falling()) {
sagilar 5:a582c64fce81 56 t.stop();
sagilar 5:a582c64fce81 57 t.reset();
sagilar 5:a582c64fce81 58 t.start();
sagilar 5:a582c64fce81 59 while (button1==0){
sagilar 5:a582c64fce81 60
sagilar 5:a582c64fce81 61
sagilar 5:a582c64fce81 62 if (sp<999){
sagilar 5:a582c64fce81 63 if (t<=2){++sp;}
sagilar 5:a582c64fce81 64 wait(0.2);
sagilar 5:a582c64fce81 65 if (t>2&&t<=5){sp=sp+5;}
sagilar 5:a582c64fce81 66 wait(0.2);
sagilar 5:a582c64fce81 67 if (t>5&&t<=10){sp=sp+10;}
sagilar 5:a582c64fce81 68 wait(0.2);
sagilar 5:a582c64fce81 69 if (t>10){sp=sp+100;}
sagilar 5:a582c64fce81 70 wait(0.2);
sagilar 5:a582c64fce81 71 if (sp>999){sp=999;}
sagilar 5:a582c64fce81 72 lcd.locate(3,0);
sagilar 5:a582c64fce81 73 lcd.printf(" ");
sagilar 5:a582c64fce81 74 lcd.locate(3,0);
lcorralesc1 0:8d2bbee60422 75 lcd.printf("%d",sp);
sagilar 5:a582c64fce81 76
sagilar 5:a582c64fce81 77 }
sagilar 5:a582c64fce81 78 }
sagilar 5:a582c64fce81 79 }
sagilar 5:a582c64fce81 80 if (button2.falling()) {
sagilar 5:a582c64fce81 81 t.stop();
sagilar 5:a582c64fce81 82 t.reset();
sagilar 5:a582c64fce81 83 t.start();
sagilar 5:a582c64fce81 84 while (button2==0)
sagilar 5:a582c64fce81 85
sagilar 5:a582c64fce81 86 if (sp>0){
sagilar 5:a582c64fce81 87 if (t<=2){--sp;}
sagilar 5:a582c64fce81 88 wait(0.2);
sagilar 5:a582c64fce81 89 if (t>2&&t<=5){sp=sp-5;}
sagilar 5:a582c64fce81 90 wait(0.2);
sagilar 5:a582c64fce81 91 if (t>5&&t<=10){sp=sp-10;}
sagilar 5:a582c64fce81 92 wait(0.2);
sagilar 5:a582c64fce81 93 if (t>10){sp=sp-100;}
sagilar 5:a582c64fce81 94 wait(0.2);
sagilar 5:a582c64fce81 95 if (sp<0){sp=0;}
sagilar 5:a582c64fce81 96 lcd.locate(3,0);
sagilar 5:a582c64fce81 97 lcd.printf(" ");
sagilar 5:a582c64fce81 98 lcd.locate(3,0);
sagilar 5:a582c64fce81 99 lcd.printf("%d",sp);
sagilar 5:a582c64fce81 100 }
sagilar 5:a582c64fce81 101 }
sagilar 5:a582c64fce81 102 }
sagilar 5:a582c64fce81 103 if (j==1) {
lcorralesc1 0:8d2bbee60422 104
sagilar 5:a582c64fce81 105 if (button1.falling()) {
sagilar 5:a582c64fce81 106 t.stop();
sagilar 5:a582c64fce81 107 t.reset();
sagilar 5:a582c64fce81 108 t.start();
sagilar 5:a582c64fce81 109 while (button1==0){
sagilar 5:a582c64fce81 110
sagilar 5:a582c64fce81 111 if (kp<1000){
sagilar 5:a582c64fce81 112 if (t<=2){++kp;}
sagilar 5:a582c64fce81 113 wait(0.2);
sagilar 5:a582c64fce81 114 if (t>2&&t<=5){kp=kp+5;}
sagilar 5:a582c64fce81 115 wait(0.2);
sagilar 5:a582c64fce81 116 if (t>5&&t<=10){kp=kp+10;}
sagilar 5:a582c64fce81 117 wait(0.2);
sagilar 5:a582c64fce81 118 if (t>10){kp=kp+100;}
sagilar 5:a582c64fce81 119 wait(0.2);
sagilar 5:a582c64fce81 120 if (kp>999){kp=999;}
sagilar 5:a582c64fce81 121 lcd.locate(9,0);
sagilar 5:a582c64fce81 122 lcd.printf(" ");
sagilar 5:a582c64fce81 123 lcd.locate(9,0);
lcorralesc1 0:8d2bbee60422 124 lcd.printf("%d",kp);
sagilar 5:a582c64fce81 125
sagilar 5:a582c64fce81 126 }
sagilar 5:a582c64fce81 127 }
sagilar 5:a582c64fce81 128 }
sagilar 5:a582c64fce81 129 if (button2.falling()) {
sagilar 5:a582c64fce81 130 t.stop();
sagilar 5:a582c64fce81 131 t.reset();
sagilar 5:a582c64fce81 132 t.start();
sagilar 5:a582c64fce81 133 while (button2==0){
sagilar 5:a582c64fce81 134 if (kp>=0){
sagilar 5:a582c64fce81 135 if (t<=2){--kp;}
sagilar 5:a582c64fce81 136 wait(0.2);
sagilar 5:a582c64fce81 137 if (t>2&&t<=5){kp=kp-5;}
sagilar 5:a582c64fce81 138 wait(0.2);
sagilar 5:a582c64fce81 139 if (t>5&&t<=10){kp=kp-10;}
sagilar 5:a582c64fce81 140 wait(0.2);
sagilar 5:a582c64fce81 141 if (t>10){kp=kp-100;}
sagilar 5:a582c64fce81 142 wait(0.2);
sagilar 5:a582c64fce81 143 if(kp<0){kp=0;}
sagilar 5:a582c64fce81 144 lcd.locate(9,0);
sagilar 5:a582c64fce81 145 lcd.printf(" ");
sagilar 5:a582c64fce81 146 lcd.locate(9,0);
sagilar 5:a582c64fce81 147 lcd.printf("%d",kp);
sagilar 5:a582c64fce81 148 }
sagilar 5:a582c64fce81 149 }
sagilar 5:a582c64fce81 150 }
sagilar 5:a582c64fce81 151 }
lcorralesc1 0:8d2bbee60422 152 if (j==2) {
sagilar 5:a582c64fce81 153 if (button1.falling()) {
sagilar 5:a582c64fce81 154 t.stop();
sagilar 5:a582c64fce81 155 t.reset();
sagilar 5:a582c64fce81 156 t.start();
sagilar 5:a582c64fce81 157 while (button1==0){
sagilar 5:a582c64fce81 158
sagilar 5:a582c64fce81 159
sagilar 5:a582c64fce81 160 if (ki<1000){
sagilar 5:a582c64fce81 161 if (t<=2){++ki;}
sagilar 5:a582c64fce81 162 wait(0.2);
sagilar 5:a582c64fce81 163 if (t>2&&t<=5){ki=ki+5;}
sagilar 5:a582c64fce81 164 wait(0.2);
sagilar 5:a582c64fce81 165 if (t>5&&t<=10){ki=ki+10;}
sagilar 5:a582c64fce81 166 wait(0.2);
sagilar 5:a582c64fce81 167 if (t>10){ki=ki+100;}
sagilar 5:a582c64fce81 168 wait(0.2);
sagilar 5:a582c64fce81 169 if (ki>999){ki=999;}
sagilar 5:a582c64fce81 170 lcd.locate(3,1);
sagilar 5:a582c64fce81 171 lcd.printf(" ");
sagilar 5:a582c64fce81 172 lcd.locate(3,1);
lcorralesc1 0:8d2bbee60422 173 lcd.printf("%d",ki);
sagilar 5:a582c64fce81 174
sagilar 5:a582c64fce81 175 }
sagilar 5:a582c64fce81 176 }
sagilar 5:a582c64fce81 177 }
sagilar 5:a582c64fce81 178 if (button2.falling()) {
sagilar 5:a582c64fce81 179 t.stop();
sagilar 5:a582c64fce81 180 t.reset();
sagilar 5:a582c64fce81 181 t.start();
sagilar 5:a582c64fce81 182 while (button2==0){
sagilar 5:a582c64fce81 183
sagilar 5:a582c64fce81 184 if (ki>=0){
sagilar 5:a582c64fce81 185 if (t<=2){--ki;}
sagilar 5:a582c64fce81 186 wait(0.2);
sagilar 5:a582c64fce81 187 if (t>2&&t<=5){ki=ki-5;}
sagilar 5:a582c64fce81 188 wait(0.2);
sagilar 5:a582c64fce81 189 if (t>5&&t<=10){ki=ki-10;}
sagilar 5:a582c64fce81 190 wait(0.2);
sagilar 5:a582c64fce81 191 if (t>10){ki=ki-100;}
sagilar 5:a582c64fce81 192 wait(0.2);
sagilar 5:a582c64fce81 193 if (ki<0){ki=0;}
sagilar 5:a582c64fce81 194 lcd.locate(3,1);
sagilar 5:a582c64fce81 195 lcd.printf(" ");
sagilar 5:a582c64fce81 196 lcd.locate(3,1);
sagilar 5:a582c64fce81 197 lcd.printf("%d",ki);
sagilar 5:a582c64fce81 198
sagilar 5:a582c64fce81 199 }
sagilar 5:a582c64fce81 200 }
sagilar 5:a582c64fce81 201 }
sagilar 5:a582c64fce81 202 }
sagilar 5:a582c64fce81 203
lcorralesc1 0:8d2bbee60422 204 if (j==3) {
sagilar 5:a582c64fce81 205 if (button1.falling()) {
sagilar 5:a582c64fce81 206 t.stop();
sagilar 5:a582c64fce81 207 t.reset();
sagilar 5:a582c64fce81 208 t.start();
sagilar 5:a582c64fce81 209 while (button1==0){
sagilar 5:a582c64fce81 210
sagilar 5:a582c64fce81 211
sagilar 5:a582c64fce81 212 if (kd<1000){
sagilar 5:a582c64fce81 213 if (t<=2){++kd;}
sagilar 5:a582c64fce81 214 wait(0.2);
sagilar 5:a582c64fce81 215 if (t>2&&t<=5){kd=kd+5;}
sagilar 5:a582c64fce81 216 wait(0.2);
sagilar 5:a582c64fce81 217 if (t>5&&t<=10){kd=kd+10;}
sagilar 5:a582c64fce81 218 wait(0.2);
sagilar 5:a582c64fce81 219 if (t>10){kd=kd+100;}
sagilar 5:a582c64fce81 220 wait(0.2);
sagilar 5:a582c64fce81 221 if (kd>999){kd=999;}
sagilar 5:a582c64fce81 222 lcd.locate(9,1);
sagilar 5:a582c64fce81 223 lcd.printf(" ");
sagilar 5:a582c64fce81 224 lcd.locate(9,1);
lcorralesc1 0:8d2bbee60422 225 lcd.printf("%d",kd);
sagilar 5:a582c64fce81 226
sagilar 5:a582c64fce81 227 }
sagilar 5:a582c64fce81 228 }
sagilar 5:a582c64fce81 229 }
sagilar 5:a582c64fce81 230 if (button2.falling()) {
sagilar 5:a582c64fce81 231
sagilar 5:a582c64fce81 232 t.stop();
sagilar 5:a582c64fce81 233 t.reset();
sagilar 5:a582c64fce81 234 t.start();
sagilar 5:a582c64fce81 235 while (button2==0){
sagilar 5:a582c64fce81 236 if (kd>=0){
sagilar 5:a582c64fce81 237 if (t<=2){--kd;}
sagilar 5:a582c64fce81 238 wait(0.2);
sagilar 5:a582c64fce81 239
sagilar 5:a582c64fce81 240 if (t>2&&t<=5){kd=kd-5;}
sagilar 5:a582c64fce81 241
sagilar 5:a582c64fce81 242 wait(0.2);
sagilar 5:a582c64fce81 243 if (t>5&&t<=10){kd=kd-10;}
sagilar 5:a582c64fce81 244 wait(0.2);
sagilar 5:a582c64fce81 245 if (t>10){kd=kd-100;}
sagilar 5:a582c64fce81 246 wait(0.2);
sagilar 5:a582c64fce81 247 if (kd<0){kd=0;}
sagilar 5:a582c64fce81 248 lcd.locate(9,1);
sagilar 5:a582c64fce81 249 lcd.printf(" ");
sagilar 5:a582c64fce81 250 lcd.locate(9,1);
sagilar 5:a582c64fce81 251 lcd.printf("%d",kd);
sagilar 5:a582c64fce81 252 }
sagilar 5:a582c64fce81 253 }
sagilar 5:a582c64fce81 254 }
sagilar 5:a582c64fce81 255 }
sagilar 5:a582c64fce81 256 if (j==4) {
lcorralesc1 0:8d2bbee60422 257
sagilar 5:a582c64fce81 258 if (button1.falling()){
sagilar 5:a582c64fce81 259 if (esc<1000){
sagilar 5:a582c64fce81 260 esc=esc*10;
sagilar 5:a582c64fce81 261 lcd.locate(13,1);
sagilar 5:a582c64fce81 262 lcd.printf(" ");
sagilar 5:a582c64fce81 263 lcd.locate(13,1);
sagilar 5:a582c64fce81 264 lcd.printf("%d",esc);
sagilar 5:a582c64fce81 265 }
sagilar 5:a582c64fce81 266 }
sagilar 5:a582c64fce81 267 if (button2.falling()){
sagilar 5:a582c64fce81 268 if (esc>1){
sagilar 5:a582c64fce81 269 esc=esc/10;
sagilar 5:a582c64fce81 270 lcd.locate(13,1);
sagilar 5:a582c64fce81 271 lcd.printf(" ");
sagilar 5:a582c64fce81 272 lcd.locate(13,1);
sagilar 5:a582c64fce81 273 lcd.printf("%d",esc);
sagilar 5:a582c64fce81 274 }
sagilar 5:a582c64fce81 275 }
sagilar 5:a582c64fce81 276 }
sagilar 5:a582c64fce81 277 if (j==5) {
lcorralesc1 0:8d2bbee60422 278 j=0;
sagilar 5:a582c64fce81 279 }
sagilar 5:a582c64fce81 280 if (button4.falling()){
sagilar 5:a582c64fce81 281 break; //sale del bucle si pisan suiche4
sagilar 5:a582c64fce81 282 }
sagilar 5:a582c64fce81 283
sagilar 5:a582c64fce81 284 }
sagilar 5:a582c64fce81 285
sagilar 5:a582c64fce81 286 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
lcorralesc1 0:8d2bbee60422 287 lcd.cls(); //borra la pantalla
sagilar 5:a582c64fce81 288 lcd.printf(" GUARDADOS!");
lcorralesc1 0:8d2bbee60422 289 wait(2);
sagilar 5:a582c64fce81 290 lcd.cls();
sagilar 5:a582c64fce81 291 lcd.printf(" INICIA EL PID");
sagilar 5:a582c64fce81 292 wait(2);
lcorralesc1 0:8d2bbee60422 293 // se imprimen los parches del control *****************************************
sagilar 5:a582c64fce81 294 lcd.cls();
sagilar 5:a582c64fce81 295 lcd.printf("Er%01.3f",err);
lcorralesc1 0:8d2bbee60422 296 lcd.locate(8,0);
sagilar 5:a582c64fce81 297 lcd.printf("Me%01.3f",med);
lcorralesc1 0:8d2bbee60422 298 lcd.locate(0,1);
lcorralesc1 0:8d2bbee60422 299 lcd.printf("Sp%d",sp);
lcorralesc1 0:8d2bbee60422 300 lcd.locate(8,1);
sagilar 5:a582c64fce81 301 lcd.printf("Co%01.3f",pid);
sagilar 5:a582c64fce81 302 wait(5);
lcorralesc1 0:8d2bbee60422 303
lcorralesc1 0:8d2bbee60422 304 // CICLO PRINCIPAL CONTROLADOR PID
sagilar 5:a582c64fce81 305
lcorralesc1 0:8d2bbee60422 306 while(1) {
sagilar 5:a582c64fce81 307 med=Vin.read()/esc; //leer puerto analogo y asignar a med
lcorralesc1 0:8d2bbee60422 308 err = (sp-med);
sagilar 5:a582c64fce81 309 ap = kp*(err-err_v2);
lcorralesc1 3:9347b362d33c 310 if(ai<100)
lcorralesc1 3:9347b362d33c 311 {
sagilar 5:a582c64fce81 312 ai =(ki*(err-err_v))+ai; //calculo de la integral del error
lcorralesc1 3:9347b362d33c 313 }
sagilar 5:a582c64fce81 314 // se verifica que la accion integral no sea muy grande
sagilar 5:a582c64fce81 315 ad = kd*(err-(2*err_v)+err_v2); //calculo de la accion derivativa
lcorralesc1 0:8d2bbee60422 316 pid = (ap+ai+ad);
sagilar 5:a582c64fce81 317 //****se muestran las variables******************************************
sagilar 5:a582c64fce81 318 if (pid > 999){
sagilar 5:a582c64fce81 319 pid=1000;
sagilar 5:a582c64fce81 320 }
sagilar 5:a582c64fce81 321 if (pid < 0){
sagilar 5:a582c64fce81 322 pid=0;
sagilar 5:a582c64fce81 323 }
sagilar 5:a582c64fce81 324 wait(.5);
lcorralesc1 2:fa1d90037a6c 325 lcd.locate(2,0);
sagilar 5:a582c64fce81 326 lcd.printf("%01.3f",err);
lcorralesc1 2:fa1d90037a6c 327 lcd.locate(10,0);
sagilar 5:a582c64fce81 328 lcd.printf("%01.3f",med);
lcorralesc1 2:fa1d90037a6c 329 lcd.locate(2,1);
sagilar 5:a582c64fce81 330 lcd.printf("%01.3f",sp);
lcorralesc1 2:fa1d90037a6c 331 lcd.locate(10,1);
sagilar 5:a582c64fce81 332 lcd.printf("%01.3f",pid);
sagilar 5:a582c64fce81 333
lcorralesc1 0:8d2bbee60422 334
sagilar 5:a582c64fce81 335 // se actualizan las variables *******************************************
sagilar 5:a582c64fce81 336 err_v2=err_v;
sagilar 5:a582c64fce81 337 err_v = err;
sagilar 5:a582c64fce81 338 pidn=pid/esc;
sagilar 5:a582c64fce81 339 // se verifica que pid sea positivo **************************************
lcorralesc1 0:8d2bbee60422 340 u.write(pidn);
sagilar 5:a582c64fce81 341 // se verifica que pid sea menor o igual la valor maximo *****************
sagilar 5:a582c64fce81 342
sagilar 5:a582c64fce81 343
sagilar 5:a582c64fce81 344 // se envia el valor pid a puerto analogico de salida (D/A) **************
lcorralesc1 0:8d2bbee60422 345 // se repite el ciclo
lcorralesc1 0:8d2bbee60422 346 }
sagilar 5:a582c64fce81 347 }