
PID para el control de voltaje de un capacitor en un circuito RC
Dependencies: Debounced TextLCD mbed
Fork of pid_teclas by
main.cpp@1:19ecfc5a15c7, 2015-10-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |