PID simple

Dependencies:   DebouncedIn TextLCD2 mbed

Committer:
JuanC
Date:
Fri Dec 13 17:47:06 2013 +0000
Revision:
0:535d93f18f39
PID

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JuanC 0:535d93f18f39 1 #include "mbed.h"
JuanC 0:535d93f18f39 2 #include "DebouncedIn.h"
JuanC 0:535d93f18f39 3 #include "TextLCD.h"
JuanC 0:535d93f18f39 4
JuanC 0:535d93f18f39 5 AnalogIn AI(PTC2);
JuanC 0:535d93f18f39 6 AnalogOut AO(PTE30);
JuanC 0:535d93f18f39 7 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // Rs, E, D4-D7
JuanC 0:535d93f18f39 8
JuanC 0:535d93f18f39 9 DigitalOut led1(LED1);
JuanC 0:535d93f18f39 10 DigitalOut led2(LED2);
JuanC 0:535d93f18f39 11 DebouncedIn button1(PTC12);
JuanC 0:535d93f18f39 12 DebouncedIn button2(PTC13);
JuanC 0:535d93f18f39 13 DebouncedIn button3(PTA1);
JuanC 0:535d93f18f39 14 DebouncedIn button4(PTC16);
JuanC 0:535d93f18f39 15
JuanC 0:535d93f18f39 16 Timer t;
JuanC 0:535d93f18f39 17 int flag;
JuanC 0:535d93f18f39 18
JuanC 0:535d93f18f39 19
JuanC 0:535d93f18f39 20 /* Definiendo variables Globales */
JuanC 0:535d93f18f39 21
JuanC 0:535d93f18f39 22 int C1=0x0E; // solo muestra el curzor
JuanC 0:535d93f18f39 23 int C2=0x18; // desplaza izquierda
JuanC 0:535d93f18f39 24 int C3=0x1A; // desplaza derecha
JuanC 0:535d93f18f39 25 int C4=0x0C; // Quita cursor bajo
JuanC 0:535d93f18f39 26 int i; // índice de la variable
JuanC 0:535d93f18f39 27 int j;
JuanC 0:535d93f18f39 28 int kp, ki, kd, sp, cycle;
JuanC 0:535d93f18f39 29 int ap, ai, ad, err, PV, pid, err_v;
JuanC 0:535d93f18f39 30 /* Programa fundamental*/
JuanC 0:535d93f18f39 31
JuanC 0:535d93f18f39 32
JuanC 0:535d93f18f39 33 int main()
JuanC 0:535d93f18f39 34 {
JuanC 0:535d93f18f39 35 /* Imprimir en Pantalla Los labels y valores=? de
JuanC 0:535d93f18f39 36 * los parametros del PID
JuanC 0:535d93f18f39 37 */
JuanC 0:535d93f18f39 38
JuanC 0:535d93f18f39 39 lcd.cls(); //Borra la Pantalla
JuanC 0:535d93f18f39 40 lcd.printf("Sp%d",sp);
JuanC 0:535d93f18f39 41 lcd.locate(8,0); //sistema coordenado para posicionar en pantalla
JuanC 0:535d93f18f39 42 lcd.printf("Kp%d",kp);
JuanC 0:535d93f18f39 43 lcd.locate(0,1);
JuanC 0:535d93f18f39 44 lcd.printf("Ki%d",ki);
JuanC 0:535d93f18f39 45 lcd.locate(8,1);
JuanC 0:535d93f18f39 46 lcd.printf("Kd%d",kd);
JuanC 0:535d93f18f39 47 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
JuanC 0:535d93f18f39 48 /* No me cuadra muy bien la
JuanC 0:535d93f18f39 49 * lectura de los valores (consultar en las otras tareas)
JuanC 0:535d93f18f39 50 */
JuanC 0:535d93f18f39 51 lcd.locate(0,0);
JuanC 0:535d93f18f39 52 lcd.printf("Sp%d",sp);
JuanC 0:535d93f18f39 53
JuanC 0:535d93f18f39 54 /* Ciclo while para alterar los valores de los parametros*/
JuanC 0:535d93f18f39 55 while (1)
JuanC 0:535d93f18f39 56 {
JuanC 0:535d93f18f39 57 if (button3.falling()) //Boton con flanco de caida
JuanC 0:535d93f18f39 58 {
JuanC 0:535d93f18f39 59 ++j;
JuanC 0:535d93f18f39 60 }
JuanC 0:535d93f18f39 61 if (j==0) //Este if realiza dos revisiones y actua solo en este valor (SP)
JuanC 0:535d93f18f39 62 {
JuanC 0:535d93f18f39 63 lcd.locate(2,0);
JuanC 0:535d93f18f39 64 lcd.printf("%d",sp); //sigo con la inquietud del write lectura
JuanC 0:535d93f18f39 65 if (button1.falling())
JuanC 0:535d93f18f39 66 {
JuanC 0:535d93f18f39 67 ++sp;
JuanC 0:535d93f18f39 68 }
JuanC 0:535d93f18f39 69 if (button2.falling())
JuanC 0:535d93f18f39 70 {
JuanC 0:535d93f18f39 71 --sp;
JuanC 0:535d93f18f39 72 }
JuanC 0:535d93f18f39 73 }
JuanC 0:535d93f18f39 74 if (j==1) //Verificar si estos if son mas efectivos quetus Whiles Tarea1
JuanC 0:535d93f18f39 75 {
JuanC 0:535d93f18f39 76 lcd.locate(10,0);
JuanC 0:535d93f18f39 77 lcd.printf("%d",kp);
JuanC 0:535d93f18f39 78 if (button1.falling())
JuanC 0:535d93f18f39 79 {
JuanC 0:535d93f18f39 80 ++kp;
JuanC 0:535d93f18f39 81 }
JuanC 0:535d93f18f39 82 if (button2.falling())
JuanC 0:535d93f18f39 83 {
JuanC 0:535d93f18f39 84 --kp;
JuanC 0:535d93f18f39 85 }
JuanC 0:535d93f18f39 86 }
JuanC 0:535d93f18f39 87 if (j==2)
JuanC 0:535d93f18f39 88 {
JuanC 0:535d93f18f39 89 lcd.locate(2,1);
JuanC 0:535d93f18f39 90 lcd.printf("%d",ki);
JuanC 0:535d93f18f39 91 if (button1.falling())
JuanC 0:535d93f18f39 92 {
JuanC 0:535d93f18f39 93 ++ki;
JuanC 0:535d93f18f39 94 }
JuanC 0:535d93f18f39 95 if (button2.falling())
JuanC 0:535d93f18f39 96 {
JuanC 0:535d93f18f39 97 --ki;
JuanC 0:535d93f18f39 98 }
JuanC 0:535d93f18f39 99 }
JuanC 0:535d93f18f39 100 if (j==3)
JuanC 0:535d93f18f39 101 {
JuanC 0:535d93f18f39 102 lcd.locate(10,1);
JuanC 0:535d93f18f39 103 lcd.printf("%d",kd);
JuanC 0:535d93f18f39 104 if (button1.falling())
JuanC 0:535d93f18f39 105 {
JuanC 0:535d93f18f39 106 ++kd;
JuanC 0:535d93f18f39 107 }
JuanC 0:535d93f18f39 108 if (button2.falling())
JuanC 0:535d93f18f39 109 {
JuanC 0:535d93f18f39 110 --kd;
JuanC 0:535d93f18f39 111 }
JuanC 0:535d93f18f39 112 }
JuanC 0:535d93f18f39 113 if (j==4) //Este if realiza dos revisiones y actua solo en este valor (SP)
JuanC 0:535d93f18f39 114 {
JuanC 0:535d93f18f39 115 j=0;
JuanC 0:535d93f18f39 116 }
JuanC 0:535d93f18f39 117 if (button4.falling())
JuanC 0:535d93f18f39 118 {
JuanC 0:535d93f18f39 119 break; //Salir de este ciclo while
JuanC 0:535d93f18f39 120 }
JuanC 0:535d93f18f39 121 }
JuanC 0:535d93f18f39 122 /* Interaccion y avisos al usuario de sistema listo!!*/
JuanC 0:535d93f18f39 123 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
JuanC 0:535d93f18f39 124 lcd.cls();
JuanC 0:535d93f18f39 125 lcd.printf("DATOS GUARDADOS");
JuanC 0:535d93f18f39 126 wait(2);
JuanC 0:535d93f18f39 127 lcd.cls();
JuanC 0:535d93f18f39 128 lcd.printf("INICIA EL PID");
JuanC 0:535d93f18f39 129 wait(2);
JuanC 0:535d93f18f39 130 lcd.cls();
JuanC 0:535d93f18f39 131 /* Imprimir los labels de algunas variables y parametros de Control en Ejecucion */
JuanC 0:535d93f18f39 132 lcd.printf("Er%g",err);
JuanC 0:535d93f18f39 133 lcd.locate(8,0);
JuanC 0:535d93f18f39 134 lcd.printf("Me%g",PV);
JuanC 0:535d93f18f39 135 lcd.locate(0,1);
JuanC 0:535d93f18f39 136 lcd.printf("SP%d",sp);
JuanC 0:535d93f18f39 137 lcd.locate(8,1);
JuanC 0:535d93f18f39 138 lcd.printf("Co%g",pid);
JuanC 0:535d93f18f39 139 /*Ziegler–Nichols_method*/
JuanC 0:535d93f18f39 140 /*kp=((kp*3.3)/(kp*4.5));
JuanC 0:535d93f18f39 141 ki=2*kp;
JuanC 0:535d93f18f39 142 kd=kp/8*/;
JuanC 0:535d93f18f39 143 wait(.5);
JuanC 0:535d93f18f39 144
JuanC 0:535d93f18f39 145 /* Ciclo while contiene el codigo especifico rutiona del PID*/
JuanC 0:535d93f18f39 146 while (1)
JuanC 0:535d93f18f39 147 {
JuanC 0:535d93f18f39 148 /* pilas con leer el puerto analogo y asignarlo a med*/
JuanC 0:535d93f18f39 149 PV = AI.read();
JuanC 0:535d93f18f39 150 PV =PV*1000;
JuanC 0:535d93f18f39 151 err =sp-PV;
JuanC 0:535d93f18f39 152 err=err/100;
JuanC 0:535d93f18f39 153 ap=kp*err; //Proporcional incremento en funcion del error Parte P
JuanC 0:535d93f18f39 154 ai=(ki*err)+ai; //Acumula los errores Parte I
JuanC 0:535d93f18f39 155 ad=kd*(err-err_v); // tiene en cuenta el delta del error Parte D
JuanC 0:535d93f18f39 156 pid=ap+ai+ad; // comentar esta y ponerla despues de comentar los ifs
JuanC 0:535d93f18f39 157 if (ai>999)
JuanC 0:535d93f18f39 158 {
JuanC 0:535d93f18f39 159 ai=1000;
JuanC 0:535d93f18f39 160 }
JuanC 0:535d93f18f39 161 else if (pid<0)
JuanC 0:535d93f18f39 162 {
JuanC 0:535d93f18f39 163 pid=0;
JuanC 0:535d93f18f39 164 }
JuanC 0:535d93f18f39 165 AO.write(pid/1000);
JuanC 0:535d93f18f39 166 if(flag==0)
JuanC 0:535d93f18f39 167 {
JuanC 0:535d93f18f39 168 t.start();
JuanC 0:535d93f18f39 169 flag=1;
JuanC 0:535d93f18f39 170 }
JuanC 0:535d93f18f39 171
JuanC 0:535d93f18f39 172 //AO=pid;
JuanC 0:535d93f18f39 173 if (t>0.3)
JuanC 0:535d93f18f39 174 {
JuanC 0:535d93f18f39 175 /* Imprimir algunas variables y parametros de Control en Ejecucion */
JuanC 0:535d93f18f39 176 lcd.locate(2,0);
JuanC 0:535d93f18f39 177 printf("%g",err);
JuanC 0:535d93f18f39 178 lcd.locate(2,1);
JuanC 0:535d93f18f39 179 printf("%d",sp);
JuanC 0:535d93f18f39 180 lcd.locate(10,0);
JuanC 0:535d93f18f39 181 printf("%g",PV);
JuanC 0:535d93f18f39 182 lcd.locate(10,1);
JuanC 0:535d93f18f39 183 printf("%g",pid);
JuanC 0:535d93f18f39 184 t.reset();
JuanC 0:535d93f18f39 185 flag=0;
JuanC 0:535d93f18f39 186 wait(.3);
JuanC 0:535d93f18f39 187 }
JuanC 0:535d93f18f39 188
JuanC 0:535d93f18f39 189 err_v = err;
JuanC 0:535d93f18f39 190
JuanC 0:535d93f18f39 191
JuanC 0:535d93f18f39 192 }
JuanC 0:535d93f18f39 193
JuanC 0:535d93f18f39 194
JuanC 0:535d93f18f39 195 }
JuanC 0:535d93f18f39 196
JuanC 0:535d93f18f39 197