PID para el control de voltaje de un capacitor en un circuito RC

Dependencies:   Debounced TextLCD mbed

Fork of pid_teclas by Gustavo Ramirez

/media/uploads/PabloViana/general.jpg

Committer:
PabloViana
Date:
Thu Oct 01 11:50:42 2015 +0000
Revision:
1:19ecfc5a15c7
Parent:
0:9aa80672eb3d
PID para el control del voltaje sobre un capacitor en un circuito RC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lcorralesc1 0:9aa80672eb3d 1 #include "mbed.h"
lcorralesc1 0:9aa80672eb3d 2 #include "DebouncedIn.h"
lcorralesc1 0:9aa80672eb3d 3 #include "TextLCD.h"
lcorralesc1 0:9aa80672eb3d 4
PabloViana 1:19ecfc5a15c7 5 AnalogIn MedidaAnaloga(PTC2);//Medida de tensión
PabloViana 1:19ecfc5a15c7 6 AnalogOut SalidaAnaloga(PTE30);//Salida analoga;
lcorralesc1 0:9aa80672eb3d 7 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
lcorralesc1 0:9aa80672eb3d 8
lcorralesc1 0:9aa80672eb3d 9 DigitalOut led1(LED1);
lcorralesc1 0:9aa80672eb3d 10 DigitalOut led2(LED2);
lcorralesc1 0:9aa80672eb3d 11 DigitalOut led3(LED3);
PabloViana 1:19ecfc5a15c7 12 DebouncedIn Incrementar(PTC17);//
PabloViana 1:19ecfc5a15c7 13 DebouncedIn Decrementar(PTC16);
PabloViana 1:19ecfc5a15c7 14 DebouncedIn Saltar(PTC13);
PabloViana 1:19ecfc5a15c7 15 DebouncedIn IniciarPID(PTC12);
lcorralesc1 0:9aa80672eb3d 16
PabloViana 1:19ecfc5a15c7 17 int C1=0x0F;//Inicializar el cursor;
PabloViana 1:19ecfc5a15c7 18 float sp=1;
PabloViana 1:19ecfc5a15c7 19 int kp=25,kd=0,ki=10,p=1;
PabloViana 1:19ecfc5a15c7 20 float errormV = 0; //Variable en la que almacenaré la diferencia entre el set point la medida real;
PabloViana 1:19ecfc5a15c7 21 float ek_1=0; //Error en el instante de tiempo anterior;
PabloViana 1:19ecfc5a15c7 22 float medidamV=0;//Variable en la que almacenaré la medida en mV;
PabloViana 1:19ecfc5a15c7 23 float PID;
PabloViana 1:19ecfc5a15c7 24
PabloViana 1:19ecfc5a15c7 25 //Variables del PID
PabloViana 1:19ecfc5a15c7 26 float Proporcional;
PabloViana 1:19ecfc5a15c7 27 float Derivativo;
PabloViana 1:19ecfc5a15c7 28 float Integrativo;
PabloViana 1:19ecfc5a15c7 29 //Función del PID//
PabloViana 1:19ecfc5a15c7 30 void ControlPID()
lcorralesc1 0:9aa80672eb3d 31 {
PabloViana 1:19ecfc5a15c7 32
PabloViana 1:19ecfc5a15c7 33 Proporcional= kp*errormV;
PabloViana 1:19ecfc5a15c7 34 Integrativo= (ki*errormV) + Integrativo;
PabloViana 1:19ecfc5a15c7 35 if(Integrativo>999){Integrativo=999;}//Saturo la salida;
PabloViana 1:19ecfc5a15c7 36 Derivativo = kd*(errormV-ek_1);
PabloViana 1:19ecfc5a15c7 37 ek_1=errormV;//Almaceno el valor para el instante de tiempo sieguiente;
PabloViana 1:19ecfc5a15c7 38 PID = Proporcional + Integrativo + Derivativo;
PabloViana 1:19ecfc5a15c7 39 if (PID>999){PID=999;}//Saturo la salida;
PabloViana 1:19ecfc5a15c7 40 if (PID<0){PID=0;}//saturo la salida
PabloViana 1:19ecfc5a15c7 41
PabloViana 1:19ecfc5a15c7 42
PabloViana 1:19ecfc5a15c7 43 SalidaAnaloga = PID/999; //Escrino en la salida;
PabloViana 1:19ecfc5a15c7 44 }
PabloViana 1:19ecfc5a15c7 45 //Función lectura de botones
PabloViana 1:19ecfc5a15c7 46 void Botones()
PabloViana 1:19ecfc5a15c7 47 /*¡¡¡CÓDIGO RECICLADO!!!!, en este caso se debe considerar que se usarán pulsadores normalmente abiertos,
PabloViana 1:19ecfc5a15c7 48 por esta razón los evento a considerar son los flancos de subida, detectados mediante el la instrucción ".rising" */
PabloViana 1:19ecfc5a15c7 49 {
PabloViana 1:19ecfc5a15c7 50 if (Incrementar.rising())
lcorralesc1 0:9aa80672eb3d 51 {
lcorralesc1 0:9aa80672eb3d 52 led1 =!led1;
lcorralesc1 0:9aa80672eb3d 53 if (p==1)
lcorralesc1 0:9aa80672eb3d 54 {
PabloViana 1:19ecfc5a15c7 55 sp=sp+0.1;
PabloViana 1:19ecfc5a15c7 56 if(sp>3.3){sp=3.3;}//Limito el valor del Set Point;
lcorralesc1 0:9aa80672eb3d 57 lcd.locate(3,0);
lcorralesc1 0:9aa80672eb3d 58 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 59 lcd.locate(3,0);
PabloViana 1:19ecfc5a15c7 60 lcd.printf("%0.1f", sp);
lcorralesc1 0:9aa80672eb3d 61 }
lcorralesc1 0:9aa80672eb3d 62 else if (p==2)
lcorralesc1 0:9aa80672eb3d 63 {
lcorralesc1 0:9aa80672eb3d 64 ++kp;
lcorralesc1 0:9aa80672eb3d 65 lcd.locate(11,0);
lcorralesc1 0:9aa80672eb3d 66 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 67 lcd.locate(11,0);
lcorralesc1 0:9aa80672eb3d 68 lcd.printf("%d", kp);
lcorralesc1 0:9aa80672eb3d 69 }
lcorralesc1 0:9aa80672eb3d 70 else if (p==3)
lcorralesc1 0:9aa80672eb3d 71 {
lcorralesc1 0:9aa80672eb3d 72 ++ki;
lcorralesc1 0:9aa80672eb3d 73 lcd.locate(3,1);
lcorralesc1 0:9aa80672eb3d 74 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 75 lcd.locate(3,1);
lcorralesc1 0:9aa80672eb3d 76 lcd.printf("%d", ki);
lcorralesc1 0:9aa80672eb3d 77 }
lcorralesc1 0:9aa80672eb3d 78 else if (p==4)
lcorralesc1 0:9aa80672eb3d 79 {
lcorralesc1 0:9aa80672eb3d 80 ++kd;
lcorralesc1 0:9aa80672eb3d 81 lcd.locate(11,1);
lcorralesc1 0:9aa80672eb3d 82 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 83 lcd.locate(11,1);
lcorralesc1 0:9aa80672eb3d 84 lcd.printf("%d", kd);
lcorralesc1 0:9aa80672eb3d 85 }
lcorralesc1 0:9aa80672eb3d 86 }
PabloViana 1:19ecfc5a15c7 87 if (Decrementar.rising())
lcorralesc1 0:9aa80672eb3d 88 {
lcorralesc1 0:9aa80672eb3d 89 led2 =!led2;
lcorralesc1 0:9aa80672eb3d 90 if (p==1)
lcorralesc1 0:9aa80672eb3d 91 {
lcorralesc1 0:9aa80672eb3d 92 if (sp==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 93 {
lcorralesc1 0:9aa80672eb3d 94 }
lcorralesc1 0:9aa80672eb3d 95 else
lcorralesc1 0:9aa80672eb3d 96 {
PabloViana 1:19ecfc5a15c7 97 sp=sp-0.1;
PabloViana 1:19ecfc5a15c7 98 if(sp<0){sp=0;}//Limito el valor del Set Point
lcorralesc1 0:9aa80672eb3d 99 lcd.locate(3,0);
lcorralesc1 0:9aa80672eb3d 100 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 101 lcd.locate(3,0);
PabloViana 1:19ecfc5a15c7 102 lcd.printf("%.1f", sp);
lcorralesc1 0:9aa80672eb3d 103 }
lcorralesc1 0:9aa80672eb3d 104 }
lcorralesc1 0:9aa80672eb3d 105 if (p==2)
lcorralesc1 0:9aa80672eb3d 106 {
lcorralesc1 0:9aa80672eb3d 107 if (kp==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 108 {
lcorralesc1 0:9aa80672eb3d 109 }
lcorralesc1 0:9aa80672eb3d 110 else
lcorralesc1 0:9aa80672eb3d 111 {
lcorralesc1 0:9aa80672eb3d 112 --kp;
lcorralesc1 0:9aa80672eb3d 113 lcd.locate(11,0);
lcorralesc1 0:9aa80672eb3d 114 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 115 lcd.locate(11,0);
lcorralesc1 0:9aa80672eb3d 116 lcd.printf("%d", kp);
lcorralesc1 0:9aa80672eb3d 117 }
lcorralesc1 0:9aa80672eb3d 118 }
lcorralesc1 0:9aa80672eb3d 119 if (p==3)
lcorralesc1 0:9aa80672eb3d 120 {
lcorralesc1 0:9aa80672eb3d 121 if (ki==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 122 {
lcorralesc1 0:9aa80672eb3d 123 }
lcorralesc1 0:9aa80672eb3d 124 else
lcorralesc1 0:9aa80672eb3d 125 {
lcorralesc1 0:9aa80672eb3d 126 --ki;
lcorralesc1 0:9aa80672eb3d 127 lcd.locate(3,1);
lcorralesc1 0:9aa80672eb3d 128 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 129 lcd.locate(3,1);
lcorralesc1 0:9aa80672eb3d 130 lcd.printf("%d", ki);
lcorralesc1 0:9aa80672eb3d 131 }
lcorralesc1 0:9aa80672eb3d 132 }
lcorralesc1 0:9aa80672eb3d 133 if (p==4)
lcorralesc1 0:9aa80672eb3d 134 {
lcorralesc1 0:9aa80672eb3d 135 if (kd==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 136 {
lcorralesc1 0:9aa80672eb3d 137 }
lcorralesc1 0:9aa80672eb3d 138 else
lcorralesc1 0:9aa80672eb3d 139 {
lcorralesc1 0:9aa80672eb3d 140 --kd;
lcorralesc1 0:9aa80672eb3d 141 lcd.locate(11,1);
lcorralesc1 0:9aa80672eb3d 142 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 143 lcd.locate(11,1);
lcorralesc1 0:9aa80672eb3d 144 lcd.printf("%d", kd);
lcorralesc1 0:9aa80672eb3d 145 }
lcorralesc1 0:9aa80672eb3d 146 }
lcorralesc1 0:9aa80672eb3d 147 }
PabloViana 1:19ecfc5a15c7 148 if (Saltar.rising())
lcorralesc1 0:9aa80672eb3d 149 {
lcorralesc1 0:9aa80672eb3d 150 led3 =!led3;
lcorralesc1 0:9aa80672eb3d 151 if (p==1)
lcorralesc1 0:9aa80672eb3d 152 {
lcorralesc1 0:9aa80672eb3d 153 ++p;
lcorralesc1 0:9aa80672eb3d 154 lcd.locate(11,0);
lcorralesc1 0:9aa80672eb3d 155 lcd.printf("%d", kp);
lcorralesc1 0:9aa80672eb3d 156
lcorralesc1 0:9aa80672eb3d 157
lcorralesc1 0:9aa80672eb3d 158 }
lcorralesc1 0:9aa80672eb3d 159 else if (p==2)
lcorralesc1 0:9aa80672eb3d 160 {
lcorralesc1 0:9aa80672eb3d 161 ++p;
lcorralesc1 0:9aa80672eb3d 162 lcd.locate(3,1);
lcorralesc1 0:9aa80672eb3d 163 lcd.printf("%d", ki);
lcorralesc1 0:9aa80672eb3d 164 lcd.locate(3,1);
lcorralesc1 0:9aa80672eb3d 165
lcorralesc1 0:9aa80672eb3d 166 }
lcorralesc1 0:9aa80672eb3d 167 else if (p==3)
lcorralesc1 0:9aa80672eb3d 168 {
lcorralesc1 0:9aa80672eb3d 169 ++p;
lcorralesc1 0:9aa80672eb3d 170 lcd.locate(11,1);
lcorralesc1 0:9aa80672eb3d 171 lcd.printf("%d", kd);
lcorralesc1 0:9aa80672eb3d 172
lcorralesc1 0:9aa80672eb3d 173
lcorralesc1 0:9aa80672eb3d 174 }
lcorralesc1 0:9aa80672eb3d 175 else if (p==4)
lcorralesc1 0:9aa80672eb3d 176 {
lcorralesc1 0:9aa80672eb3d 177 p=1;
lcorralesc1 0:9aa80672eb3d 178 lcd.locate(3,0);
PabloViana 1:19ecfc5a15c7 179 lcd.printf("%.1f", sp);
lcorralesc1 0:9aa80672eb3d 180
lcorralesc1 0:9aa80672eb3d 181
lcorralesc1 0:9aa80672eb3d 182 }
PabloViana 1:19ecfc5a15c7 183 }
PabloViana 1:19ecfc5a15c7 184
PabloViana 1:19ecfc5a15c7 185
PabloViana 1:19ecfc5a15c7 186 }//Botones
PabloViana 1:19ecfc5a15c7 187
PabloViana 1:19ecfc5a15c7 188
PabloViana 1:19ecfc5a15c7 189
PabloViana 1:19ecfc5a15c7 190 //Inicio la función principal;
PabloViana 1:19ecfc5a15c7 191 int main()
PabloViana 1:19ecfc5a15c7 192 { int contador=0;
PabloViana 1:19ecfc5a15c7 193 lcd.cls();
PabloViana 1:19ecfc5a15c7 194 lcd.writeCommand(C1);//Mando al LCD el comano que inicializa el cursor
PabloViana 1:19ecfc5a15c7 195 lcd.locate(8,0);
PabloViana 1:19ecfc5a15c7 196 lcd.printf("kp=%d", kp);
PabloViana 1:19ecfc5a15c7 197 lcd.locate(0,1);
PabloViana 1:19ecfc5a15c7 198 lcd.printf("Ki=%d", ki);
PabloViana 1:19ecfc5a15c7 199 lcd.locate(8,1);
PabloViana 1:19ecfc5a15c7 200 lcd.printf("Kd=%d", kd);
PabloViana 1:19ecfc5a15c7 201 lcd.locate(0,0);
PabloViana 1:19ecfc5a15c7 202 lcd.printf("Sp=%.1f", sp);
PabloViana 1:19ecfc5a15c7 203 SalidaAnaloga=0;
PabloViana 1:19ecfc5a15c7 204
PabloViana 1:19ecfc5a15c7 205 while(1) //Iniciar Ciclo Infinito
PabloViana 1:19ecfc5a15c7 206 {
PabloViana 1:19ecfc5a15c7 207 Botones(); //Inicia la función que revisa el estado de los botones
PabloViana 1:19ecfc5a15c7 208
PabloViana 1:19ecfc5a15c7 209 if(IniciarPID.rising()) //Se presiona el botón Iniciar PID
PabloViana 1:19ecfc5a15c7 210 {
PabloViana 1:19ecfc5a15c7 211 lcd.cls();//Borrar pantalla;
PabloViana 1:19ecfc5a15c7 212 lcd.locate(0,0);
PabloViana 1:19ecfc5a15c7 213 lcd.printf("PID...");
PabloViana 1:19ecfc5a15c7 214 wait(1);
PabloViana 1:19ecfc5a15c7 215 lcd.cls();//Borrar pantalla;
PabloViana 1:19ecfc5a15c7 216 break; // Termino el ciclo infinito;
PabloViana 1:19ecfc5a15c7 217 }//if
PabloViana 1:19ecfc5a15c7 218 }//while
PabloViana 1:19ecfc5a15c7 219
PabloViana 1:19ecfc5a15c7 220 while(1)//ciclo infinito para el PID
PabloViana 1:19ecfc5a15c7 221 {
PabloViana 1:19ecfc5a15c7 222 medidamV=MedidaAnaloga*3300;//La medida es convertida a un valor en mV, siendo el máximo valor esperado 3300mV (3.3V)
PabloViana 1:19ecfc5a15c7 223
PabloViana 1:19ecfc5a15c7 224 errormV= (sp*1000)- medidamV; //Estoy ingresando un valor en V, pero opero internamente en mV
PabloViana 1:19ecfc5a15c7 225 contador++; //Contador para actualizar la pantalla cada cierto número de ciclos;
PabloViana 1:19ecfc5a15c7 226 if(contador ==10)
PabloViana 1:19ecfc5a15c7 227 {
PabloViana 1:19ecfc5a15c7 228 lcd.cls();
PabloViana 1:19ecfc5a15c7 229 lcd.locate(0,0);
PabloViana 1:19ecfc5a15c7 230 lcd.printf("Sp:%.2fV", sp);//Muestro el set point;
PabloViana 1:19ecfc5a15c7 231
PabloViana 1:19ecfc5a15c7 232 lcd.locate(0,1);
PabloViana 1:19ecfc5a15c7 233 lcd.printf("M:%.2fV", medidamV/1000);//Muestro la medida;
PabloViana 1:19ecfc5a15c7 234
PabloViana 1:19ecfc5a15c7 235 lcd.locate(8,1);
PabloViana 1:19ecfc5a15c7 236 lcd.printf("E:%.2fV", errormV/1000);//Muestro el error;
PabloViana 1:19ecfc5a15c7 237
PabloViana 1:19ecfc5a15c7 238 lcd.locate(9,0);
PabloViana 1:19ecfc5a15c7 239 lcd.printf("U:%.1fV",PID*3.3/999); //Muestro el esfuerzo de control
PabloViana 1:19ecfc5a15c7 240 contador=0;//Reinicializo el contador;
PabloViana 1:19ecfc5a15c7 241 }//if
PabloViana 1:19ecfc5a15c7 242 ControlPID();//Llamo la función PID;
PabloViana 1:19ecfc5a15c7 243 if(Incrementar.rising()){sp=sp+0.5;}
PabloViana 1:19ecfc5a15c7 244 if(sp>3.3){sp=3.3;}//Limito el valor del Set Point;
PabloViana 1:19ecfc5a15c7 245 if(Decrementar.rising()){sp=sp-0.5;}
PabloViana 1:19ecfc5a15c7 246 if(sp<0){sp=0;}//Limito el valor del Set Point;
PabloViana 1:19ecfc5a15c7 247 wait(0.05);//Espero un tiempo;
lcorralesc1 0:9aa80672eb3d 248 }
lcorralesc1 0:9aa80672eb3d 249 }