LCD Connection

Dependencies:   TextLCD mbed

Fork of PID_encoder by Sebastian Quintero Zapata

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?

UserRevisionLine numberNew 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