LCD Connection
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 |