Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PID_encoder by
main.cpp@0:40599894595a, 2015-10-28 (annotated)
- Committer:
- squinteroz
- Date:
- Wed Oct 28 02:13:14 2015 +0000
- Revision:
- 0:40599894595a
- Child:
- 1:954623d16310
Pid utilizando como herramienta el encoder
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
squinteroz | 0:40599894595a | 1 | #include "mbed.h" |
squinteroz | 0:40599894595a | 2 | #include "TextLCD.h"// nos permite usar el lcd en nuestro comando |
squinteroz | 0:40599894595a | 3 | #include "DebouncedIn.h" // esta libreria es útil para podeer declarar todas las teclas o botones que se posean |
squinteroz | 0:40599894595a | 4 | #include "QEI.h" // nos permite utilizar el encoder |
squinteroz | 0:40599894595a | 5 | TextLCD lcd(PTE0, PTE1, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 Teclado |
squinteroz | 0:40599894595a | 6 | QEI wheel (PTD5, PTD0, NC, 100); |
squinteroz | 0:40599894595a | 7 | //asignamos el puerto a cada interruptor |
squinteroz | 0:40599894595a | 8 | |
squinteroz | 0:40599894595a | 9 | DebouncedIn button1(PTC12); //Aumentar |
squinteroz | 0:40599894595a | 10 | DebouncedIn button2(PTC13); //Decrementar |
squinteroz | 0:40599894595a | 11 | DebouncedIn button3(PTC16); //Pasar |
squinteroz | 0:40599894595a | 12 | DebouncedIn button4(PTC17); //inicio |
squinteroz | 0:40599894595a | 13 | |
squinteroz | 0:40599894595a | 14 | // asignamos los pines a la salida y a la entrada (analógicas) |
squinteroz | 0:40599894595a | 15 | |
squinteroz | 0:40599894595a | 16 | AnalogIn y(PTB1); // Salida de la planta |
squinteroz | 0:40599894595a | 17 | AnalogOut u(PTE30); // Señal de control |
squinteroz | 0:40599894595a | 18 | |
squinteroz | 0:40599894595a | 19 | //Salidas digitales utilziadas para la comprobación del funcionamiento |
squinteroz | 0:40599894595a | 20 | |
squinteroz | 0:40599894595a | 21 | DigitalOut led1(LED1); |
squinteroz | 0:40599894595a | 22 | DigitalOut led2(LED2); |
squinteroz | 0:40599894595a | 23 | DigitalOut led3(LED3); |
squinteroz | 0:40599894595a | 24 | Timer t;// nos permite saber cuanto tiempo permanecen presionados los botones asociados al aumento y al decremento |
squinteroz | 0:40599894595a | 25 | int j; |
squinteroz | 0:40599894595a | 26 | int i; |
squinteroz | 0:40599894595a | 27 | int C1=0x0F; // inicializamos el lcd y el tipo de formato que este ultizará |
squinteroz | 0:40599894595a | 28 | int sp=0,kp=0,kd=0,ki=0,p=1; // condiciones iniciales de los parametros de controlador. NOTA: la variable p indica en que se parametro se desea intervenir (kp,ki,kd,sp, pasar e iniciar) |
squinteroz | 0:40599894595a | 29 | float ap, ai, ad, err, med, err_v, pid=0; // |
squinteroz | 0:40599894595a | 30 | |
squinteroz | 0:40599894595a | 31 | int main() { |
squinteroz | 0:40599894595a | 32 | lcd.writeCommand(C1); |
squinteroz | 0:40599894595a | 33 | lcd.printf(" Controlador PID\n"); |
squinteroz | 0:40599894595a | 34 | wait(2); |
squinteroz | 0:40599894595a | 35 | lcd.cls(); |
squinteroz | 0:40599894595a | 36 | lcd.printf(" Equipo_5:\nEliana Mejia E."); |
squinteroz | 0:40599894595a | 37 | wait(2); |
squinteroz | 0:40599894595a | 38 | lcd.cls(); |
squinteroz | 0:40599894595a | 39 | lcd.printf("Sebastian Quintero Z. Sebastian Vergara P"); |
squinteroz | 0:40599894595a | 40 | wait(2); |
squinteroz | 0:40599894595a | 41 | lcd.cls(); |
squinteroz | 0:40599894595a | 42 | lcd.printf(" Ingresar Parametros "); |
squinteroz | 0:40599894595a | 43 | wait(2); |
squinteroz | 0:40599894595a | 44 | |
squinteroz | 0:40599894595a | 45 | retorno: //Cuando se presiona por segunda vez el botón 4 se retorna a la interfaz de parametros para modificarlos |
squinteroz | 0:40599894595a | 46 | p=1; |
squinteroz | 0:40599894595a | 47 | lcd.cls(); |
squinteroz | 0:40599894595a | 48 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
squinteroz | 0:40599894595a | 49 | lcd.locate(8,0); |
squinteroz | 0:40599894595a | 50 | lcd.printf("Kp=%d", kp); |
squinteroz | 0:40599894595a | 51 | lcd.locate(0,1); |
squinteroz | 0:40599894595a | 52 | lcd.printf("Ki=%d", ki); |
squinteroz | 0:40599894595a | 53 | lcd.locate(8,1); |
squinteroz | 0:40599894595a | 54 | lcd.printf("Kd=%d", kd); |
squinteroz | 0:40599894595a | 55 | lcd.locate(0,0); |
squinteroz | 0:40599894595a | 56 | lcd.printf("Sp=%d", sp); |
squinteroz | 0:40599894595a | 57 | |
squinteroz | 0:40599894595a | 58 | while(1) { |
squinteroz | 0:40599894595a | 59 | |
squinteroz | 0:40599894595a | 60 | led3 =1; |
squinteroz | 0:40599894595a | 61 | if (button3.falling()) { //INCREMENTA POSICION DEL MENU CON BOTON 3 (Switche encoder) |
squinteroz | 0:40599894595a | 62 | led3 =!led3; |
squinteroz | 0:40599894595a | 63 | ++j; |
squinteroz | 0:40599894595a | 64 | } |
squinteroz | 0:40599894595a | 65 | |
squinteroz | 0:40599894595a | 66 | if (j==0){ |
squinteroz | 0:40599894595a | 67 | sp=sp+wheel.getPulses(); |
squinteroz | 0:40599894595a | 68 | wheel.reset(); |
squinteroz | 0:40599894595a | 69 | if (sp>999){ |
squinteroz | 0:40599894595a | 70 | sp=999; |
squinteroz | 0:40599894595a | 71 | } |
squinteroz | 0:40599894595a | 72 | if (sp<0){ |
squinteroz | 0:40599894595a | 73 | sp=0; |
squinteroz | 0:40599894595a | 74 | } |
squinteroz | 0:40599894595a | 75 | lcd.locate(2,0); |
squinteroz | 0:40599894595a | 76 | lcd.printf(" ",sp); |
squinteroz | 0:40599894595a | 77 | lcd.locate(2,0); |
squinteroz | 0:40599894595a | 78 | lcd.printf("%d",sp); |
squinteroz | 0:40599894595a | 79 | wait(0.2); |
squinteroz | 0:40599894595a | 80 | |
squinteroz | 0:40599894595a | 81 | if(button3.falling()){ |
squinteroz | 0:40599894595a | 82 | j=1; |
squinteroz | 0:40599894595a | 83 | led3=0; |
squinteroz | 0:40599894595a | 84 | wait(0.3); |
squinteroz | 0:40599894595a | 85 | wheel.reset(); |
squinteroz | 0:40599894595a | 86 | } |
squinteroz | 0:40599894595a | 87 | |
squinteroz | 0:40599894595a | 88 | } |
squinteroz | 0:40599894595a | 89 | |
squinteroz | 0:40599894595a | 90 | if (j==1) { |
squinteroz | 0:40599894595a | 91 | kp=kp+wheel.getPulses(); |
squinteroz | 0:40599894595a | 92 | wheel.reset(); |
squinteroz | 0:40599894595a | 93 | if (kp>999){ |
squinteroz | 0:40599894595a | 94 | kp=999; |
squinteroz | 0:40599894595a | 95 | } |
squinteroz | 0:40599894595a | 96 | if (kp<0){ |
squinteroz | 0:40599894595a | 97 | kp=0; |
squinteroz | 0:40599894595a | 98 | } |
squinteroz | 0:40599894595a | 99 | lcd.locate(10,0); |
squinteroz | 0:40599894595a | 100 | lcd.printf(" "); |
squinteroz | 0:40599894595a | 101 | lcd.locate(10,0); |
squinteroz | 0:40599894595a | 102 | lcd.printf("%d",kp); |
squinteroz | 0:40599894595a | 103 | wait(0.2); |
squinteroz | 0:40599894595a | 104 | |
squinteroz | 0:40599894595a | 105 | if(button3.falling()){ |
squinteroz | 0:40599894595a | 106 | j=2; |
squinteroz | 0:40599894595a | 107 | led3=0; |
squinteroz | 0:40599894595a | 108 | wait(0.3); |
squinteroz | 0:40599894595a | 109 | wheel.reset(); |
squinteroz | 0:40599894595a | 110 | } |
squinteroz | 0:40599894595a | 111 | |
squinteroz | 0:40599894595a | 112 | } |
squinteroz | 0:40599894595a | 113 | |
squinteroz | 0:40599894595a | 114 | if (j==2) { |
squinteroz | 0:40599894595a | 115 | ki=ki+wheel.getPulses(); |
squinteroz | 0:40599894595a | 116 | wheel.reset(); |
squinteroz | 0:40599894595a | 117 | if (ki>999){ |
squinteroz | 0:40599894595a | 118 | ki=999; |
squinteroz | 0:40599894595a | 119 | } |
squinteroz | 0:40599894595a | 120 | if (ki<0){ |
squinteroz | 0:40599894595a | 121 | ki=0; |
squinteroz | 0:40599894595a | 122 | } |
squinteroz | 0:40599894595a | 123 | lcd.locate(2,1); |
squinteroz | 0:40599894595a | 124 | lcd.printf(" "); |
squinteroz | 0:40599894595a | 125 | lcd.locate(2,1); |
squinteroz | 0:40599894595a | 126 | lcd.printf("%d",ki); |
squinteroz | 0:40599894595a | 127 | wait(0.2); |
squinteroz | 0:40599894595a | 128 | |
squinteroz | 0:40599894595a | 129 | if(button3.falling()){ |
squinteroz | 0:40599894595a | 130 | j=3; |
squinteroz | 0:40599894595a | 131 | led3=0; |
squinteroz | 0:40599894595a | 132 | wait(0.3); |
squinteroz | 0:40599894595a | 133 | wheel.reset(); |
squinteroz | 0:40599894595a | 134 | } |
squinteroz | 0:40599894595a | 135 | |
squinteroz | 0:40599894595a | 136 | } |
squinteroz | 0:40599894595a | 137 | |
squinteroz | 0:40599894595a | 138 | if (j==3) { |
squinteroz | 0:40599894595a | 139 | kd=kd+wheel.getPulses(); |
squinteroz | 0:40599894595a | 140 | wheel.reset(); |
squinteroz | 0:40599894595a | 141 | if (kd>999){ |
squinteroz | 0:40599894595a | 142 | kd=999; |
squinteroz | 0:40599894595a | 143 | } |
squinteroz | 0:40599894595a | 144 | if (kd<0){ |
squinteroz | 0:40599894595a | 145 | kd=0; |
squinteroz | 0:40599894595a | 146 | } |
squinteroz | 0:40599894595a | 147 | lcd.locate(10,1); |
squinteroz | 0:40599894595a | 148 | lcd.printf(" "); |
squinteroz | 0:40599894595a | 149 | lcd.locate(10,1); |
squinteroz | 0:40599894595a | 150 | lcd.printf("%d",kd); |
squinteroz | 0:40599894595a | 151 | wait(0.2); |
squinteroz | 0:40599894595a | 152 | |
squinteroz | 0:40599894595a | 153 | if(button3.falling()){ |
squinteroz | 0:40599894595a | 154 | j=0; |
squinteroz | 0:40599894595a | 155 | led3=0; |
squinteroz | 0:40599894595a | 156 | wait(0.3); |
squinteroz | 0:40599894595a | 157 | wheel.reset(); |
squinteroz | 0:40599894595a | 158 | } |
squinteroz | 0:40599894595a | 159 | |
squinteroz | 0:40599894595a | 160 | } |
squinteroz | 0:40599894595a | 161 | |
squinteroz | 0:40599894595a | 162 | if (j==4) { |
squinteroz | 0:40599894595a | 163 | j=0; |
squinteroz | 0:40599894595a | 164 | } |
squinteroz | 0:40599894595a | 165 | |
squinteroz | 0:40599894595a | 166 | if (!button4){ |
squinteroz | 0:40599894595a | 167 | break; //sale del bucle si pisan suiche4 |
squinteroz | 0:40599894595a | 168 | } |
squinteroz | 0:40599894595a | 169 | } //cierro while(1) |
squinteroz | 0:40599894595a | 170 | //%--------------------------------------------------------------------- |
squinteroz | 0:40599894595a | 171 | // accionamiento del botón asociado al inicio del programa realizado |
squinteroz | 0:40599894595a | 172 | |
squinteroz | 0:40599894595a | 173 | |
squinteroz | 0:40599894595a | 174 | |
squinteroz | 0:40599894595a | 175 | // se imprimen los parches del control ***************************************** |
squinteroz | 0:40599894595a | 176 | lcd.cls(); |
squinteroz | 0:40599894595a | 177 | lcd.printf("Er%d",err); |
squinteroz | 0:40599894595a | 178 | lcd.locate(8,0); |
squinteroz | 0:40599894595a | 179 | lcd.printf("Me%d",med); |
squinteroz | 0:40599894595a | 180 | lcd.locate(0,1); |
squinteroz | 0:40599894595a | 181 | lcd.printf("Sp%d",sp); |
squinteroz | 0:40599894595a | 182 | lcd.locate(8,1); |
squinteroz | 0:40599894595a | 183 | lcd.printf("Co%d",pid); |
squinteroz | 0:40599894595a | 184 | wait(1); |
squinteroz | 0:40599894595a | 185 | |
squinteroz | 0:40599894595a | 186 | |
squinteroz | 0:40599894595a | 187 | |
squinteroz | 0:40599894595a | 188 | p=0; |
squinteroz | 0:40599894595a | 189 | if(p==0){ |
squinteroz | 0:40599894595a | 190 | lcd.cls();// limpia la pantalla y la localiza en (0,0) |
squinteroz | 0:40599894595a | 191 | lcd.printf("Iniciando PID\n"); |
squinteroz | 0:40599894595a | 192 | wait(1); |
squinteroz | 0:40599894595a | 193 | while(1){ //si se presiona por segunda vez es para modificar los parámetros |
squinteroz | 0:40599894595a | 194 | |
squinteroz | 0:40599894595a | 195 | |
squinteroz | 0:40599894595a | 196 | med=5*y.read(); // las constantes por la cuál se amplifica la señal dependen del sistema que se desee controlar y en donde lo deseamos limitar |
squinteroz | 0:40599894595a | 197 | err=sp-med; // error del sistema |
squinteroz | 0:40599894595a | 198 | ap = kp*err; |
squinteroz | 0:40599894595a | 199 | |
squinteroz | 0:40599894595a | 200 | // se verifica que la accion integral no sea muy grande |
squinteroz | 0:40599894595a | 201 | |
squinteroz | 0:40599894595a | 202 | if(ai<5) |
squinteroz | 0:40599894595a | 203 | { |
squinteroz | 0:40599894595a | 204 | ai =(ki*err)+ai; //calculo de la integral del error |
squinteroz | 0:40599894595a | 205 | } |
squinteroz | 0:40599894595a | 206 | ad = kd*(err-err_v); //calculo de la acción derivativa |
squinteroz | 0:40599894595a | 207 | pid = (ap+ai+ad); |
squinteroz | 0:40599894595a | 208 | |
squinteroz | 0:40599894595a | 209 | // se verifica que pid sea positivo ************************************** |
squinteroz | 0:40599894595a | 210 | if(pid<=0){pid=0;} |
squinteroz | 0:40599894595a | 211 | |
squinteroz | 0:40599894595a | 212 | // se verifica que pid sea menor o igual l valor maximo ***************** |
squinteroz | 0:40599894595a | 213 | |
squinteroz | 0:40599894595a | 214 | if(pid>=5){pid=5;} |
squinteroz | 0:40599894595a | 215 | u.write(pid); // enviamos el valor de PID al puerto analógico de salida |
squinteroz | 0:40599894595a | 216 | t.start(); |
squinteroz | 0:40599894595a | 217 | |
squinteroz | 0:40599894595a | 218 | if(t>=1) |
squinteroz | 0:40599894595a | 219 | { |
squinteroz | 0:40599894595a | 220 | lcd.cls(); //limpiamos la pantalla del lcd |
squinteroz | 0:40599894595a | 221 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD en este caso modulo 1 |
squinteroz | 0:40599894595a | 222 | lcd.locate(8,0); |
squinteroz | 0:40599894595a | 223 | lcd.printf("Err=%0.1f", err); |
squinteroz | 0:40599894595a | 224 | lcd.locate(0,1); |
squinteroz | 0:40599894595a | 225 | lcd.printf("Med=%0.1f", med); |
squinteroz | 0:40599894595a | 226 | lcd.locate(8,1); |
squinteroz | 0:40599894595a | 227 | lcd.printf("PID=%0.1f", pid); |
squinteroz | 0:40599894595a | 228 | lcd.locate(0,0); |
squinteroz | 0:40599894595a | 229 | lcd.printf("Sp=%d", sp); |
squinteroz | 0:40599894595a | 230 | |
squinteroz | 0:40599894595a | 231 | t.reset(); |
squinteroz | 0:40599894595a | 232 | |
squinteroz | 0:40599894595a | 233 | } |
squinteroz | 0:40599894595a | 234 | } |
squinteroz | 0:40599894595a | 235 | |
squinteroz | 0:40599894595a | 236 | |
squinteroz | 0:40599894595a | 237 | } |
squinteroz | 0:40599894595a | 238 | } |
squinteroz | 0:40599894595a | 239 | |
squinteroz | 0:40599894595a | 240 | |
squinteroz | 0:40599894595a | 241 | |
squinteroz | 0:40599894595a | 242 |