PID con teclado matricial 4x4

Dependencies:   FPointer TextLCD-modificada keypad mbed

Committer:
salondonog
Date:
Fri Nov 29 17:46:57 2013 +0000
Revision:
0:4d8420272696
PID con teclado matricial 4x4;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salondonog 0:4d8420272696 1 #include "mbed.h"
salondonog 0:4d8420272696 2 #include "TextLCD.h"
salondonog 0:4d8420272696 3 #include"keypad.h"
salondonog 0:4d8420272696 4 #include"FPointer.h"
salondonog 0:4d8420272696 5
salondonog 0:4d8420272696 6 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); //configura los puestos PTE0,PTE1,PTE2,PTE3,PTE4,PTE5, donde se conectara el LCD 16x2
salondonog 0:4d8420272696 7 Keypad keypad(PTA2,PTD4,PTD3,PTD7,PTA13,PTD5,PTD0,PTD2);
salondonog 0:4d8420272696 8 AnalogIn Vin(PTB0);
salondonog 0:4d8420272696 9 AnalogOut Vout(PTE30);
salondonog 0:4d8420272696 10 Timer t;
salondonog 0:4d8420272696 11 int cero;
salondonog 0:4d8420272696 12 int flag;
salondonog 0:4d8420272696 13 int q;
salondonog 0:4d8420272696 14 int k;
salondonog 0:4d8420272696 15 int C1=0x0E; //configurar el lcd para mostrar el guin bajo
salondonog 0:4d8420272696 16 int C2=0x0C; //configurar el lcd para no mostrar el guion bajo
salondonog 0:4d8420272696 17 float s=0; //set point
salondonog 0:4d8420272696 18 float p=0; //ganancia proporcional
salondonog 0:4d8420272696 19 float i=0; //ganancia integral
salondonog 0:4d8420272696 20 float d=0; //ganancia derivativa
salondonog 0:4d8420272696 21 int ind=0; //vector de caracteres.
salondonog 0:4d8420272696 22 float err, med, yr, ap, ai, ad, err_v, cycle;
salondonog 0:4d8420272696 23 float pid;
salondonog 0:4d8420272696 24 float Keytable[] = {1,2,3,11,
salondonog 0:4d8420272696 25 4,5,6,12,
salondonog 0:4d8420272696 26 7,8, 9,13,
salondonog 0:4d8420272696 27 0,0,0,0};
salondonog 0:4d8420272696 28
salondonog 0:4d8420272696 29 void incremento(int h){ //Funcion que incremente los valores
salondonog 0:4d8420272696 30 if(h==0){
salondonog 0:4d8420272696 31 if (q!=1 && s<10){
salondonog 0:4d8420272696 32 s=ind;
salondonog 0:4d8420272696 33 q=1;
salondonog 0:4d8420272696 34 }
salondonog 0:4d8420272696 35 else{
salondonog 0:4d8420272696 36 s=10*s+ind;
salondonog 0:4d8420272696 37 }
salondonog 0:4d8420272696 38 if(s>999)s=999;
salondonog 0:4d8420272696 39 lcd.locate(3,0); lcd.printf(" ");
salondonog 0:4d8420272696 40 lcd.locate(3,0); lcd.printf("%.0f",s);
salondonog 0:4d8420272696 41
salondonog 0:4d8420272696 42 }
salondonog 0:4d8420272696 43 else if(h==1){
salondonog 0:4d8420272696 44 if (q!=1 && p<10){
salondonog 0:4d8420272696 45 p=ind;
salondonog 0:4d8420272696 46 q=1;
salondonog 0:4d8420272696 47 }
salondonog 0:4d8420272696 48 else{
salondonog 0:4d8420272696 49 p=10*p+ind;
salondonog 0:4d8420272696 50 }
salondonog 0:4d8420272696 51 if(p>999)p=999;
salondonog 0:4d8420272696 52 lcd.locate(11,0); lcd.printf(" ");
salondonog 0:4d8420272696 53 lcd.locate(11,0); lcd.printf("%.0f",p);
salondonog 0:4d8420272696 54 }
salondonog 0:4d8420272696 55 else if(h==2){
salondonog 0:4d8420272696 56 if (q!=1 && i<10){
salondonog 0:4d8420272696 57 i=ind;
salondonog 0:4d8420272696 58 q=1;
salondonog 0:4d8420272696 59 }
salondonog 0:4d8420272696 60 else{
salondonog 0:4d8420272696 61 i=10*i+ind;
salondonog 0:4d8420272696 62 }
salondonog 0:4d8420272696 63 if(i>999)i=999;
salondonog 0:4d8420272696 64 lcd.locate(3,1); lcd.printf(" ");
salondonog 0:4d8420272696 65 lcd.locate(3,1); lcd.printf("%.0f",i);
salondonog 0:4d8420272696 66 }
salondonog 0:4d8420272696 67 else{
salondonog 0:4d8420272696 68 if (q!=1 && d<10){
salondonog 0:4d8420272696 69 d=ind;
salondonog 0:4d8420272696 70 q=1;
salondonog 0:4d8420272696 71 }
salondonog 0:4d8420272696 72 else{
salondonog 0:4d8420272696 73 d=10*d+ind;
salondonog 0:4d8420272696 74 }
salondonog 0:4d8420272696 75 if(d>999)d=999;
salondonog 0:4d8420272696 76 lcd.locate(11,1); lcd.printf(" ");
salondonog 0:4d8420272696 77 lcd.locate(11,1); lcd.printf("%.0f",d);
salondonog 0:4d8420272696 78 }
salondonog 0:4d8420272696 79 ind=0; cero=0;
salondonog 0:4d8420272696 80 }
salondonog 0:4d8420272696 81
salondonog 0:4d8420272696 82 uint32_t cbAfterInput(uint32_t index) {
salondonog 0:4d8420272696 83 ind=Keytable[index];
salondonog 0:4d8420272696 84 cero=index;
salondonog 0:4d8420272696 85 return 0;
salondonog 0:4d8420272696 86 }
salondonog 0:4d8420272696 87
salondonog 0:4d8420272696 88 void def_posicion(int h){
salondonog 0:4d8420272696 89 if (h==0){
salondonog 0:4d8420272696 90 lcd.locate(3,0); lcd.printf("%.0f",s);
salondonog 0:4d8420272696 91 lcd.locate(3,0);
salondonog 0:4d8420272696 92 }
salondonog 0:4d8420272696 93 else if(h==1){
salondonog 0:4d8420272696 94 lcd.locate(11,0); lcd.printf("%.0f",p);
salondonog 0:4d8420272696 95 lcd.locate(11,0);
salondonog 0:4d8420272696 96 }
salondonog 0:4d8420272696 97 else if (h==2){
salondonog 0:4d8420272696 98 lcd.locate(3,1); lcd.printf("%.0f",i);
salondonog 0:4d8420272696 99 lcd.locate(3,1);
salondonog 0:4d8420272696 100 }
salondonog 0:4d8420272696 101 else {
salondonog 0:4d8420272696 102 lcd.locate(11,1); lcd.printf("%.0f",d);
salondonog 0:4d8420272696 103 lcd.locate(11,1);
salondonog 0:4d8420272696 104 }
salondonog 0:4d8420272696 105 }
salondonog 0:4d8420272696 106
salondonog 0:4d8420272696 107 void star_patch1(void){ //funcion que imprime los caracteres que no van a variar en el display
salondonog 0:4d8420272696 108 lcd.cls();
salondonog 0:4d8420272696 109 lcd.locate(8,0);
salondonog 0:4d8420272696 110 lcd.printf("Kp=%.0f",p);
salondonog 0:4d8420272696 111 lcd.locate(0,1);
salondonog 0:4d8420272696 112 lcd.printf("Ki=%.0f",i);
salondonog 0:4d8420272696 113 lcd.locate(8,1);
salondonog 0:4d8420272696 114 lcd.printf("Kd=%.0f",d);
salondonog 0:4d8420272696 115 lcd.writeCommand(C1); //permite que el cursor se vea y sea intermitente
salondonog 0:4d8420272696 116 lcd.locate(0,0);
salondonog 0:4d8420272696 117 lcd.printf("Sp=%.0f",s);
salondonog 0:4d8420272696 118 }
salondonog 0:4d8420272696 119
salondonog 0:4d8420272696 120 void star_patch2(void){ //funcion que imprime los caracteres que no van a variar en el display
salondonog 0:4d8420272696 121 lcd.writeCommand(C2);
salondonog 0:4d8420272696 122 lcd.cls();
salondonog 0:4d8420272696 123 lcd.printf("***INICIA PID***"); lcd.printf("****************");
salondonog 0:4d8420272696 124 wait(2);
salondonog 0:4d8420272696 125 lcd.cls();
salondonog 0:4d8420272696 126 lcd.printf("Er%=f",err);
salondonog 0:4d8420272696 127 lcd.locate(8,0); lcd.printf("Me=%.0f",med);
salondonog 0:4d8420272696 128 lcd.locate(0,1); lcd.printf("Sp=%.0f",s);
salondonog 0:4d8420272696 129 lcd.locate(8,1); lcd.printf("Co=%.0f",pid);
salondonog 0:4d8420272696 130 wait(3);
salondonog 0:4d8420272696 131 }
salondonog 0:4d8420272696 132
salondonog 0:4d8420272696 133 int main(){
salondonog 0:4d8420272696 134 star_patch1();
salondonog 0:4d8420272696 135 keypad.CallAfterInput(&cbAfterInput);
salondonog 0:4d8420272696 136 keypad.Start();
salondonog 0:4d8420272696 137 ini1:
salondonog 0:4d8420272696 138 if(ind==12){
salondonog 0:4d8420272696 139 if (k<3) k++;
salondonog 0:4d8420272696 140 else k=0;
salondonog 0:4d8420272696 141 def_posicion(k);
salondonog 0:4d8420272696 142 ind=0;
salondonog 0:4d8420272696 143 q=0;
salondonog 0:4d8420272696 144 }
salondonog 0:4d8420272696 145 if(ind==13){
salondonog 0:4d8420272696 146 ind=0;
salondonog 0:4d8420272696 147 goto PID;
salondonog 0:4d8420272696 148 }
salondonog 0:4d8420272696 149 if(ind==11){
salondonog 0:4d8420272696 150 if (k==0){
salondonog 0:4d8420272696 151 s=0;
salondonog 0:4d8420272696 152 lcd.locate(3,0); lcd.printf(" ");
salondonog 0:4d8420272696 153 lcd.locate(3,0); lcd.printf("%.0f",s);
salondonog 0:4d8420272696 154 }
salondonog 0:4d8420272696 155 else if(k==1){
salondonog 0:4d8420272696 156 p=0;
salondonog 0:4d8420272696 157 lcd.locate(11,0); lcd.printf(" ");
salondonog 0:4d8420272696 158 lcd.locate(11,0); lcd.printf("%.0f",p);
salondonog 0:4d8420272696 159 }
salondonog 0:4d8420272696 160 else if (k==2){
salondonog 0:4d8420272696 161 i=0;
salondonog 0:4d8420272696 162 lcd.locate(3,1); lcd.printf(" ");
salondonog 0:4d8420272696 163 lcd.locate(3,1); lcd.printf("%.0f",i);
salondonog 0:4d8420272696 164 }
salondonog 0:4d8420272696 165 else {
salondonog 0:4d8420272696 166 d=0;
salondonog 0:4d8420272696 167 lcd.locate(11,1); lcd.printf(" ");
salondonog 0:4d8420272696 168 lcd.locate(11,1); lcd.printf("%.0f",d);
salondonog 0:4d8420272696 169 }
salondonog 0:4d8420272696 170 q=0; ind=0;
salondonog 0:4d8420272696 171 }
salondonog 0:4d8420272696 172 if (ind!=0 && ind!=12 && ind!=13 && ind!=11 || cero==13 ){
salondonog 0:4d8420272696 173 incremento(k);
salondonog 0:4d8420272696 174 }
salondonog 0:4d8420272696 175 goto ini1;
salondonog 0:4d8420272696 176
salondonog 0:4d8420272696 177 PID:
salondonog 0:4d8420272696 178 star_patch2();
salondonog 0:4d8420272696 179
salondonog 0:4d8420272696 180 while (1){
salondonog 0:4d8420272696 181
salondonog 0:4d8420272696 182 med=Vin.read()*1000;
salondonog 0:4d8420272696 183 err =s-med;
salondonog 0:4d8420272696 184 ap = p*err;
salondonog 0:4d8420272696 185 ai =(i*0.001*err)+ai; //calculo de la integral del error
salondonog 0:4d8420272696 186 // se verifica que la accion integral no sea muy grande
salondonog 0:4d8420272696 187 ad = d*(err-err_v); //calculo de la accion derivativa
salondonog 0:4d8420272696 188 pid =(ap+ai+ad);
salondonog 0:4d8420272696 189 //****se muestran las variables******************************************
salondonog 0:4d8420272696 190 if (pid > 999)pid=1000;
salondonog 0:4d8420272696 191 if (pid<0)pid=0;
salondonog 0:4d8420272696 192
salondonog 0:4d8420272696 193
salondonog 0:4d8420272696 194 Vout.write(pid/1000);
salondonog 0:4d8420272696 195 if(flag==0){
salondonog 0:4d8420272696 196 t.start();
salondonog 0:4d8420272696 197 flag=1;
salondonog 0:4d8420272696 198 }
salondonog 0:4d8420272696 199 if (t>0.3){
salondonog 0:4d8420272696 200 lcd.locate(3,0);
salondonog 0:4d8420272696 201 lcd.printf(" ");
salondonog 0:4d8420272696 202 lcd.locate(3,0);
salondonog 0:4d8420272696 203 lcd.printf("%.0f",err);
salondonog 0:4d8420272696 204 lcd.locate(11,0);
salondonog 0:4d8420272696 205 lcd.printf(" ");
salondonog 0:4d8420272696 206 lcd.locate(11,0);
salondonog 0:4d8420272696 207 lcd.printf("%.0f",med);
salondonog 0:4d8420272696 208 lcd.locate(3,1);
salondonog 0:4d8420272696 209 lcd.printf(" ");
salondonog 0:4d8420272696 210 lcd.locate(3,1);
salondonog 0:4d8420272696 211 lcd.printf("%.0f",s);
salondonog 0:4d8420272696 212 lcd.locate(11,1);
salondonog 0:4d8420272696 213 lcd.printf(" ");
salondonog 0:4d8420272696 214 lcd.locate(11,1);
salondonog 0:4d8420272696 215 lcd.printf("%.2f ",pid/1000);
salondonog 0:4d8420272696 216 t.reset();
salondonog 0:4d8420272696 217 flag=0;
salondonog 0:4d8420272696 218 wait(.3);
salondonog 0:4d8420272696 219 }
salondonog 0:4d8420272696 220 // se actualizan las variables *******************************************
salondonog 0:4d8420272696 221 err_v = err;
salondonog 0:4d8420272696 222 }
salondonog 0:4d8420272696 223 }