tarea#3

Dependencies:   FPointer TextLCD keypad mbed

Fork of Tarea2_Teclado by Jose Ruiz

Committer:
walterg
Date:
Thu Apr 03 05:15:46 2014 +0000
Revision:
3:3ebf00293772
Parent:
2:4c3de5a37f24
tarea# 3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lcorralesc1 0:54e8dab91b77 1 //Programa para hacer control PID simple, ingresa parámetros con teclado 4x4. Imprime resultados en LCD 16x2
walterg 3:3ebf00293772 2
lcorralesc1 0:54e8dab91b77 3 #include "mbed.h"
lcorralesc1 0:54e8dab91b77 4 #include "TextLCD.h"
lcorralesc1 0:54e8dab91b77 5 #include"keypad.h" //Librería del teclado 4x4
lcorralesc1 0:54e8dab91b77 6 #include"FPointer.h" //Librería complementaria para libreria keypad
walterg 3:3ebf00293772 7
lcorralesc1 0:54e8dab91b77 8 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
jaruiz 2:4c3de5a37f24 9 Keypad keypad(PTA2,PTD4,PTD3,PTD7,PTA13,PTD5,PTD0,PTD2); //Entradas del teclado (4r,3r,2r,1r,8,7,6,5)
walterg 3:3ebf00293772 10
walterg 3:3ebf00293772 11
walterg 3:3ebf00293772 12 float Tdo=1/2093.005;
walterg 3:3ebf00293772 13 float Pdo=Tdo/2;
walterg 3:3ebf00293772 14 float Tre=1/2637.02;
walterg 3:3ebf00293772 15 float Pre=Tre/2;
walterg 3:3ebf00293772 16 float Tmi=1/3135.963;
walterg 3:3ebf00293772 17 float Pmi=Tmi/2;
walterg 3:3ebf00293772 18
lcorralesc1 0:54e8dab91b77 19 AnalogIn Vin(PTB0); //Voltaje de alimentación
lcorralesc1 0:54e8dab91b77 20 AnalogOut Vout(PTE30); //Marcar la salida analógica
walterg 3:3ebf00293772 21 //DigitalOut Vparlante(PTC5);
walterg 3:3ebf00293772 22 PwmOut pw(PTA12);
lcorralesc1 0:54e8dab91b77 23 //ASIGNACION DE VARIABLES
lcorralesc1 0:54e8dab91b77 24 Timer t;
lcorralesc1 0:54e8dab91b77 25 int cero;
lcorralesc1 0:54e8dab91b77 26 int flag;
lcorralesc1 0:54e8dab91b77 27 int q;
lcorralesc1 0:54e8dab91b77 28 int k;
lcorralesc1 0:54e8dab91b77 29 int C1=0x0E; //configurar el lcd para mostrar el guin bajo
lcorralesc1 0:54e8dab91b77 30 int C2=0x0C; //configurar el lcd para QUITAR el guion bajo
lcorralesc1 0:54e8dab91b77 31 float sp=0; //set point
lcorralesc1 0:54e8dab91b77 32 float kp=0; //ganancia proporcional
lcorralesc1 0:54e8dab91b77 33 float ki=0; //ganancia integral
lcorralesc1 0:54e8dab91b77 34 float kd=0; //ganancia derivativa
lcorralesc1 0:54e8dab91b77 35 int ind=0; //vector de caracteres.
lcorralesc1 0:54e8dab91b77 36 float err, med, yr, ap, ai, ad, err_v, cycle; //Variable de control PID
lcorralesc1 0:54e8dab91b77 37 float pid;
walterg 3:3ebf00293772 38
lcorralesc1 0:54e8dab91b77 39 //MATRIZ DEL TECLADO
lcorralesc1 0:54e8dab91b77 40 float Keytable[] = {1,2,3,11,
lcorralesc1 0:54e8dab91b77 41 4,5,6,12,
lcorralesc1 0:54e8dab91b77 42 7,8,9,13,
lcorralesc1 0:54e8dab91b77 43 0,0,0,0};
lcorralesc1 0:54e8dab91b77 44
lcorralesc1 0:54e8dab91b77 45 //Se crea una función que incremente los valores
lcorralesc1 0:54e8dab91b77 46 void increment(int j){
lcorralesc1 0:54e8dab91b77 47 if(j==0){
lcorralesc1 0:54e8dab91b77 48 if (q!=1 && sp<10){
lcorralesc1 0:54e8dab91b77 49 sp=ind;
lcorralesc1 0:54e8dab91b77 50 q=1;
lcorralesc1 0:54e8dab91b77 51 }
jaruiz 1:c1571c87c8ee 52 else {
jaruiz 1:c1571c87c8ee 53 sp=10*sp+ind;
jaruiz 1:c1571c87c8ee 54 }
lcorralesc1 0:54e8dab91b77 55 if(sp>999)sp=999;
jaruiz 1:c1571c87c8ee 56
jaruiz 1:c1571c87c8ee 57
lcorralesc1 0:54e8dab91b77 58 lcd.locate(3,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 59 lcd.locate(3,0); lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 60
walterg 3:3ebf00293772 61 pw.period(Tdo);
walterg 3:3ebf00293772 62 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 63 wait(0.1);
walterg 3:3ebf00293772 64 pw=0;
walterg 3:3ebf00293772 65
jaruiz 1:c1571c87c8ee 66 }
lcorralesc1 0:54e8dab91b77 67 else if(j==1){
lcorralesc1 0:54e8dab91b77 68 if (q!=1 && kp<10){
lcorralesc1 0:54e8dab91b77 69 kp=ind;
lcorralesc1 0:54e8dab91b77 70 q=1;
lcorralesc1 0:54e8dab91b77 71 }
lcorralesc1 0:54e8dab91b77 72 else{
lcorralesc1 0:54e8dab91b77 73 kp=10*kp+ind;
lcorralesc1 0:54e8dab91b77 74 }
lcorralesc1 0:54e8dab91b77 75 if(kp>999)kp=999;
lcorralesc1 0:54e8dab91b77 76 lcd.locate(11,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 77 lcd.locate(11,0); lcd.printf("%.0f",kp);
walterg 3:3ebf00293772 78 pw.period(Tdo);
walterg 3:3ebf00293772 79 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 80 wait(0.1);
walterg 3:3ebf00293772 81 pw=0;
walterg 3:3ebf00293772 82
lcorralesc1 0:54e8dab91b77 83 }
lcorralesc1 0:54e8dab91b77 84 else if(j==2){
lcorralesc1 0:54e8dab91b77 85 if (q!=1 && ki<10){
lcorralesc1 0:54e8dab91b77 86 ki=ind;
lcorralesc1 0:54e8dab91b77 87 q=1;
lcorralesc1 0:54e8dab91b77 88 }
lcorralesc1 0:54e8dab91b77 89 else{
lcorralesc1 0:54e8dab91b77 90 ki=10*ki+ind;
lcorralesc1 0:54e8dab91b77 91 }
lcorralesc1 0:54e8dab91b77 92 if(ki>999)ki=999;
lcorralesc1 0:54e8dab91b77 93 lcd.locate(3,1); lcd.printf(" ");
jaruiz 2:4c3de5a37f24 94 lcd.locate(3,1); lcd.printf("%.0f",ki);
walterg 3:3ebf00293772 95 pw.period(Tdo);
walterg 3:3ebf00293772 96 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 97 wait(0.1);
walterg 3:3ebf00293772 98 pw=0;
walterg 3:3ebf00293772 99
lcorralesc1 0:54e8dab91b77 100 }
lcorralesc1 0:54e8dab91b77 101 else{
lcorralesc1 0:54e8dab91b77 102 if (q!=1 && kd<10){
lcorralesc1 0:54e8dab91b77 103 kd=ind;
lcorralesc1 0:54e8dab91b77 104 q=1;
lcorralesc1 0:54e8dab91b77 105 }
lcorralesc1 0:54e8dab91b77 106 else{
lcorralesc1 0:54e8dab91b77 107 kd=10*kd+ind;
lcorralesc1 0:54e8dab91b77 108 }
lcorralesc1 0:54e8dab91b77 109 if(kd>999)kd=999;
lcorralesc1 0:54e8dab91b77 110 lcd.locate(11,1); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 111 lcd.locate(11,1); lcd.printf("%.0f",kd);
lcorralesc1 0:54e8dab91b77 112 }
lcorralesc1 0:54e8dab91b77 113 ind=0; cero=0;
walterg 3:3ebf00293772 114 pw.period(Tdo);
walterg 3:3ebf00293772 115 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 116 wait(0.1);
walterg 3:3ebf00293772 117 pw=0;
walterg 3:3ebf00293772 118
lcorralesc1 0:54e8dab91b77 119 }
walterg 3:3ebf00293772 120
lcorralesc1 0:54e8dab91b77 121 uint32_t cbAfterInput(uint32_t index) {
lcorralesc1 0:54e8dab91b77 122 ind=Keytable[index];
lcorralesc1 0:54e8dab91b77 123 cero=index;
lcorralesc1 0:54e8dab91b77 124 return 0;
lcorralesc1 0:54e8dab91b77 125 }
walterg 3:3ebf00293772 126
lcorralesc1 0:54e8dab91b77 127 void def_posicion(int j){
lcorralesc1 0:54e8dab91b77 128 if (j==0){
lcorralesc1 0:54e8dab91b77 129 lcd.locate(3,0); lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 130 lcd.locate(3,0);
lcorralesc1 0:54e8dab91b77 131 }
lcorralesc1 0:54e8dab91b77 132 else if(j==1){
lcorralesc1 0:54e8dab91b77 133 lcd.locate(11,0); lcd.printf("%.0f",kp);
lcorralesc1 0:54e8dab91b77 134 lcd.locate(11,0);
lcorralesc1 0:54e8dab91b77 135 }
lcorralesc1 0:54e8dab91b77 136 else if (j==2){
lcorralesc1 0:54e8dab91b77 137 lcd.locate(3,1); lcd.printf("%.0f",ki);
lcorralesc1 0:54e8dab91b77 138 lcd.locate(3,1);
lcorralesc1 0:54e8dab91b77 139 }
lcorralesc1 0:54e8dab91b77 140 else {
lcorralesc1 0:54e8dab91b77 141 lcd.locate(11,1); lcd.printf("%.0f",kd);
lcorralesc1 0:54e8dab91b77 142 lcd.locate(11,1);
lcorralesc1 0:54e8dab91b77 143 }
lcorralesc1 0:54e8dab91b77 144 }
walterg 3:3ebf00293772 145
lcorralesc1 0:54e8dab91b77 146 //Dado que hay parámetros que no varía en el display en esta parte del código, se crea una función que los mantenga.
lcorralesc1 0:54e8dab91b77 147 void star_patch1(void){
lcorralesc1 0:54e8dab91b77 148 lcd.cls();
lcorralesc1 0:54e8dab91b77 149 lcd.locate(8,0);
lcorralesc1 0:54e8dab91b77 150 lcd.printf("Kp=%.0f",kp);
lcorralesc1 0:54e8dab91b77 151 lcd.locate(0,1);
lcorralesc1 0:54e8dab91b77 152 lcd.printf("Ki=%.0f",ki);
lcorralesc1 0:54e8dab91b77 153 lcd.locate(8,1);
lcorralesc1 0:54e8dab91b77 154 lcd.printf("Kd=%.0f",kd);
lcorralesc1 0:54e8dab91b77 155 lcd.writeCommand(C1); //cursor se vea y sea intermitente
lcorralesc1 0:54e8dab91b77 156 lcd.locate(0,0);
lcorralesc1 0:54e8dab91b77 157 lcd.printf("Sp=%.0f",sp);
lcorralesc1 0:54e8dab91b77 158 }
walterg 3:3ebf00293772 159
lcorralesc1 0:54e8dab91b77 160 void star_patch2(void){ // uso nuevamente función que imprime los caracteres que no van a variar en el display
lcorralesc1 0:54e8dab91b77 161 lcd.writeCommand(C2);
lcorralesc1 0:54e8dab91b77 162 lcd.cls();
lcorralesc1 0:54e8dab91b77 163 lcd.printf("Iniciamos el PID |m|");
lcorralesc1 0:54e8dab91b77 164 wait(2);
lcorralesc1 0:54e8dab91b77 165 lcd.cls();
lcorralesc1 0:54e8dab91b77 166 lcd.printf("Er%=f",err);
lcorralesc1 0:54e8dab91b77 167 lcd.locate(8,0); lcd.printf("Me=%.0f",med);
lcorralesc1 0:54e8dab91b77 168 lcd.locate(0,1); lcd.printf("Sp=%.0f",sp);
lcorralesc1 0:54e8dab91b77 169 lcd.locate(8,1); lcd.printf("Co=%.0f",pid);
lcorralesc1 0:54e8dab91b77 170 wait(3);
lcorralesc1 0:54e8dab91b77 171 }
walterg 3:3ebf00293772 172
lcorralesc1 0:54e8dab91b77 173 int main(){
lcorralesc1 0:54e8dab91b77 174 ini:
lcorralesc1 0:54e8dab91b77 175 ind=0;
lcorralesc1 0:54e8dab91b77 176 star_patch1();
lcorralesc1 0:54e8dab91b77 177 keypad.CallAfterInput(&cbAfterInput);
lcorralesc1 0:54e8dab91b77 178 keypad.Start();
lcorralesc1 0:54e8dab91b77 179 ini1:
lcorralesc1 0:54e8dab91b77 180 if(ind==12){
lcorralesc1 0:54e8dab91b77 181 if (k<3) k++;
lcorralesc1 0:54e8dab91b77 182 else k=0;
lcorralesc1 0:54e8dab91b77 183 def_posicion(k);
lcorralesc1 0:54e8dab91b77 184 ind=0;
lcorralesc1 0:54e8dab91b77 185 q=0;
walterg 3:3ebf00293772 186 pw.period(Tdo);
walterg 3:3ebf00293772 187 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 188 wait(0.1);
walterg 3:3ebf00293772 189 pw=0;
walterg 3:3ebf00293772 190
lcorralesc1 0:54e8dab91b77 191 }
lcorralesc1 0:54e8dab91b77 192 if(ind==13){
walterg 3:3ebf00293772 193 pw.period(Tdo);
walterg 3:3ebf00293772 194 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 195 wait(0.1);
walterg 3:3ebf00293772 196 pw=0;
walterg 3:3ebf00293772 197
lcorralesc1 0:54e8dab91b77 198 ind=0;
lcorralesc1 0:54e8dab91b77 199 goto PID;
jaruiz 1:c1571c87c8ee 200
lcorralesc1 0:54e8dab91b77 201 }
lcorralesc1 0:54e8dab91b77 202 if(ind==11){
walterg 3:3ebf00293772 203 pw.period(Tdo);
walterg 3:3ebf00293772 204 pw.pulsewidth(Pdo);
walterg 3:3ebf00293772 205 wait(0.1);
walterg 3:3ebf00293772 206 pw=0;
walterg 3:3ebf00293772 207
lcorralesc1 0:54e8dab91b77 208 if (k==0){
lcorralesc1 0:54e8dab91b77 209 sp=0;
lcorralesc1 0:54e8dab91b77 210 lcd.locate(3,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 211 lcd.locate(3,0); lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 212 }
lcorralesc1 0:54e8dab91b77 213 else if(k==1){
lcorralesc1 0:54e8dab91b77 214 kp=0;
lcorralesc1 0:54e8dab91b77 215 lcd.locate(11,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 216 lcd.locate(11,0); lcd.printf("%.0f",kp);
lcorralesc1 0:54e8dab91b77 217 }
lcorralesc1 0:54e8dab91b77 218 else if (k==2){
lcorralesc1 0:54e8dab91b77 219 ki=0;
lcorralesc1 0:54e8dab91b77 220 lcd.locate(3,1); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 221 lcd.locate(3,1); lcd.printf("%.0f",ki);
lcorralesc1 0:54e8dab91b77 222 }
lcorralesc1 0:54e8dab91b77 223 else {
lcorralesc1 0:54e8dab91b77 224 kd=0;
lcorralesc1 0:54e8dab91b77 225 lcd.locate(11,1); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 226 lcd.locate(11,1); lcd.printf("%.0f",kd);
lcorralesc1 0:54e8dab91b77 227 }
lcorralesc1 0:54e8dab91b77 228 q=0; ind=0;
lcorralesc1 0:54e8dab91b77 229 }
lcorralesc1 0:54e8dab91b77 230 if (ind!=0 && ind!=12 && ind!=13 && ind!=11 || cero==13 ){
lcorralesc1 0:54e8dab91b77 231 increment(k);
lcorralesc1 0:54e8dab91b77 232 }
lcorralesc1 0:54e8dab91b77 233 goto ini1;
lcorralesc1 0:54e8dab91b77 234
lcorralesc1 0:54e8dab91b77 235 PID:
lcorralesc1 0:54e8dab91b77 236 star_patch2();
lcorralesc1 0:54e8dab91b77 237
lcorralesc1 0:54e8dab91b77 238 while (1){
lcorralesc1 0:54e8dab91b77 239
lcorralesc1 0:54e8dab91b77 240 med=Vin.read()*1000;
lcorralesc1 0:54e8dab91b77 241 err =sp-med;
lcorralesc1 0:54e8dab91b77 242 ap = kp*err;
lcorralesc1 0:54e8dab91b77 243 ai =(ki*0.001*err)+ai; //calculo de la integral del error
lcorralesc1 0:54e8dab91b77 244 // VERIFICAMOS QUE LA ACCION INTEGRAL NO SEA MUY GRANDE!!!
lcorralesc1 0:54e8dab91b77 245 if(ai>0.5){
lcorralesc1 0:54e8dab91b77 246 ai=0.5;
lcorralesc1 0:54e8dab91b77 247 }
lcorralesc1 0:54e8dab91b77 248 ad = kd*(err-err_v); //calculo de la accion derivativa
lcorralesc1 0:54e8dab91b77 249 pid =(ap+ai+ad);
lcorralesc1 0:54e8dab91b77 250
lcorralesc1 0:54e8dab91b77 251 //MOSTRAMOS LAS VARIABLES
lcorralesc1 0:54e8dab91b77 252 if (pid > 999)pid=1000;
lcorralesc1 0:54e8dab91b77 253 if (pid<0)pid=0;
lcorralesc1 0:54e8dab91b77 254
lcorralesc1 0:54e8dab91b77 255
lcorralesc1 0:54e8dab91b77 256 Vout.write(pid/1000);
lcorralesc1 0:54e8dab91b77 257 if(flag==0){
lcorralesc1 0:54e8dab91b77 258 t.start();
lcorralesc1 0:54e8dab91b77 259 flag=1;
lcorralesc1 0:54e8dab91b77 260 }
lcorralesc1 0:54e8dab91b77 261 if (t>0.3){
lcorralesc1 0:54e8dab91b77 262 lcd.locate(3,0);
lcorralesc1 0:54e8dab91b77 263 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 264 lcd.locate(3,0);
lcorralesc1 0:54e8dab91b77 265 lcd.printf("%.0f",err);
lcorralesc1 0:54e8dab91b77 266 lcd.locate(11,0);
lcorralesc1 0:54e8dab91b77 267 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 268 lcd.locate(11,0);
lcorralesc1 0:54e8dab91b77 269 lcd.printf("%.0f",med);
lcorralesc1 0:54e8dab91b77 270 lcd.locate(3,1);
lcorralesc1 0:54e8dab91b77 271 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 272 lcd.locate(3,1);
lcorralesc1 0:54e8dab91b77 273 lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 274 lcd.locate(11,1);
lcorralesc1 0:54e8dab91b77 275 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 276 lcd.locate(11,1);
lcorralesc1 0:54e8dab91b77 277 lcd.printf("%.2f ",pid/1000);
lcorralesc1 0:54e8dab91b77 278 t.reset();
lcorralesc1 0:54e8dab91b77 279 flag=0;
lcorralesc1 0:54e8dab91b77 280 wait(.3);
lcorralesc1 0:54e8dab91b77 281 }
lcorralesc1 0:54e8dab91b77 282
lcorralesc1 0:54e8dab91b77 283 //ACTUALIZACION DE LAS VARIABLES
lcorralesc1 0:54e8dab91b77 284 err_v = err;
lcorralesc1 0:54e8dab91b77 285 if(ind==13)goto ini;
lcorralesc1 0:54e8dab91b77 286 }
walterg 3:3ebf00293772 287 }
walterg 3:3ebf00293772 288