pid y telado matricial en una plante de primer orden

Dependencies:   FPointer TextLCD keypad mbed

/media/uploads/amarincan/pid-teclado.jpg

Committer:
amarincan
Date:
Wed Dec 04 03:27:20 2013 +0000
Revision:
0:2003274a0cbb
pid ingresando valores desde teclado matricial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amarincan 0:2003274a0cbb 1 #include "mbed.h"
amarincan 0:2003274a0cbb 2 #include "keypad.h"
amarincan 0:2003274a0cbb 3 #include "TextLCD.h"
amarincan 0:2003274a0cbb 4
amarincan 0:2003274a0cbb 5 DigitalOut Led(LED2);
amarincan 0:2003274a0cbb 6 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
amarincan 0:2003274a0cbb 7 AnalogIn Vin(PTB3);
amarincan 0:2003274a0cbb 8 AnalogOut Vout(PTE30);
amarincan 0:2003274a0cbb 9 //Serial pc(USBTX, USBRX);
amarincan 0:2003274a0cbb 10 int C1=0x0E; // solo muestra el curzor
amarincan 0:2003274a0cbb 11 int C3=0x1A; // desplaza derecha
amarincan 0:2003274a0cbb 12 int a,num=0, i=0 , bt,f=0;
amarincan 0:2003274a0cbb 13 int j;
amarincan 0:2003274a0cbb 14 int Kp, Ki, Kd, Sp, yr, cycle, med2 , c;
amarincan 0:2003274a0cbb 15 float med,pid,ap, err, ai, ad,err_v;
amarincan 0:2003274a0cbb 16 // Define your own keypad values
amarincan 0:2003274a0cbb 17 char Keytable[] = { '1', '2', '3', 'A',
amarincan 0:2003274a0cbb 18 '4', '5', '6', 'B',
amarincan 0:2003274a0cbb 19 '7', '8', '9', 'C',
amarincan 0:2003274a0cbb 20 '*', '0', '#', 'D'
amarincan 0:2003274a0cbb 21 };
amarincan 0:2003274a0cbb 22
amarincan 0:2003274a0cbb 23 int Keytablei[] = { 1, 2, 3, 10,
amarincan 0:2003274a0cbb 24 4, 5, 6, 11,
amarincan 0:2003274a0cbb 25 7, 8, 9, 12,
amarincan 0:2003274a0cbb 26 13,0,14, 15
amarincan 0:2003274a0cbb 27 };
amarincan 0:2003274a0cbb 28
amarincan 0:2003274a0cbb 29 uint32_t cbAfterInput(uint32_t key)
amarincan 0:2003274a0cbb 30 {
amarincan 0:2003274a0cbb 31 if(bt==0) {
amarincan 0:2003274a0cbb 32 if(a<2) {
amarincan 0:2003274a0cbb 33 if(Keytable[key]=='A') {
amarincan 0:2003274a0cbb 34 bt=3;
amarincan 0:2003274a0cbb 35 a=3;
amarincan 0:2003274a0cbb 36 f=1;
amarincan 0:2003274a0cbb 37 }
amarincan 0:2003274a0cbb 38
amarincan 0:2003274a0cbb 39
amarincan 0:2003274a0cbb 40 switch(a) {
amarincan 0:2003274a0cbb 41 case 0:
amarincan 0:2003274a0cbb 42 num=num+Keytablei[key]*10;
amarincan 0:2003274a0cbb 43 break;
amarincan 0:2003274a0cbb 44 case 1:
amarincan 0:2003274a0cbb 45 num=num+Keytablei[key]*1;
amarincan 0:2003274a0cbb 46 break;
amarincan 0:2003274a0cbb 47 }
amarincan 0:2003274a0cbb 48
amarincan 0:2003274a0cbb 49
amarincan 0:2003274a0cbb 50
amarincan 0:2003274a0cbb 51 a++;
amarincan 0:2003274a0cbb 52 }
amarincan 0:2003274a0cbb 53
amarincan 0:2003274a0cbb 54 }
amarincan 0:2003274a0cbb 55
amarincan 0:2003274a0cbb 56 switch(i) {
amarincan 0:2003274a0cbb 57 case 0:
amarincan 0:2003274a0cbb 58 //a=0;
amarincan 0:2003274a0cbb 59 lcd.locate(2,0);
amarincan 0:2003274a0cbb 60 lcd.printf("= ");
amarincan 0:2003274a0cbb 61 lcd.locate(3,0);
amarincan 0:2003274a0cbb 62 lcd.printf("%d",num);
amarincan 0:2003274a0cbb 63 Sp=num;
amarincan 0:2003274a0cbb 64 //num=0;
amarincan 0:2003274a0cbb 65 //lcd.printf("%d",num);
amarincan 0:2003274a0cbb 66
amarincan 0:2003274a0cbb 67 break;
amarincan 0:2003274a0cbb 68 case 1:
amarincan 0:2003274a0cbb 69 lcd.locate(10,0);
amarincan 0:2003274a0cbb 70 lcd.printf("= ");
amarincan 0:2003274a0cbb 71 lcd.locate(11,0);
amarincan 0:2003274a0cbb 72 lcd.printf("%d",num);
amarincan 0:2003274a0cbb 73 Kp=num;
amarincan 0:2003274a0cbb 74 //num=0;
amarincan 0:2003274a0cbb 75 //lcd.printf("%d",num);
amarincan 0:2003274a0cbb 76 break;
amarincan 0:2003274a0cbb 77 case 2:
amarincan 0:2003274a0cbb 78
amarincan 0:2003274a0cbb 79 lcd.locate(2,1);
amarincan 0:2003274a0cbb 80 lcd.printf("= ");
amarincan 0:2003274a0cbb 81 lcd.locate(3,1);
amarincan 0:2003274a0cbb 82 lcd.printf("%d",num);
amarincan 0:2003274a0cbb 83 Kd=num;
amarincan 0:2003274a0cbb 84 //num=0;
amarincan 0:2003274a0cbb 85 //lcd.printf("%d",num);
amarincan 0:2003274a0cbb 86 break;
amarincan 0:2003274a0cbb 87 case 3:
amarincan 0:2003274a0cbb 88 lcd.locate(10,1);
amarincan 0:2003274a0cbb 89 lcd.printf("= ");
amarincan 0:2003274a0cbb 90 lcd.locate(11,1);
amarincan 0:2003274a0cbb 91 lcd.printf("%d",num);
amarincan 0:2003274a0cbb 92 Ki=num;
amarincan 0:2003274a0cbb 93 // num=0;
amarincan 0:2003274a0cbb 94 //lcd.printf("%d",++Kd);
amarincan 0:2003274a0cbb 95 break;
amarincan 0:2003274a0cbb 96 }
amarincan 0:2003274a0cbb 97
amarincan 0:2003274a0cbb 98 if(f==1) {
amarincan 0:2003274a0cbb 99 a=0;
amarincan 0:2003274a0cbb 100 f=0;
amarincan 0:2003274a0cbb 101 }
amarincan 0:2003274a0cbb 102 if(Keytable[key]=='A') {
amarincan 0:2003274a0cbb 103 bt=3;
amarincan 0:2003274a0cbb 104 a=0;
amarincan 0:2003274a0cbb 105 num=0;
amarincan 0:2003274a0cbb 106 }
amarincan 0:2003274a0cbb 107 if(Keytable[key]=='D')
amarincan 0:2003274a0cbb 108 bt=4;
amarincan 0:2003274a0cbb 109 return 0;
amarincan 0:2003274a0cbb 110 }
amarincan 0:2003274a0cbb 111
amarincan 0:2003274a0cbb 112 int main() {
amarincan 0:2003274a0cbb 113 Keypad keypad(PTA2,PTD4,PTD3,PTD1,PTD2,PTD0,PTD5,PTA13);
amarincan 0:2003274a0cbb 114 keypad.CallAfterInput(&cbAfterInput);
amarincan 0:2003274a0cbb 115 keypad.Start();
amarincan 0:2003274a0cbb 116
amarincan 0:2003274a0cbb 117 lcd.writeCommand(C1);
amarincan 0:2003274a0cbb 118 lcd.printf("Sp= Kp=");
amarincan 0:2003274a0cbb 119 lcd.locate(0,1);
amarincan 0:2003274a0cbb 120 lcd.printf("Ki= Kd=");
amarincan 0:2003274a0cbb 121 lcd.locate(2,0);
amarincan 0:2003274a0cbb 122 lcd.printf("=");
amarincan 0:2003274a0cbb 123
amarincan 0:2003274a0cbb 124
amarincan 0:2003274a0cbb 125 while (1) {
amarincan 0:2003274a0cbb 126
amarincan 0:2003274a0cbb 127
amarincan 0:2003274a0cbb 128 if(bt==3) {
amarincan 0:2003274a0cbb 129 i++;
amarincan 0:2003274a0cbb 130 if(i>3) {
amarincan 0:2003274a0cbb 131 i=0;
amarincan 0:2003274a0cbb 132 }
amarincan 0:2003274a0cbb 133
amarincan 0:2003274a0cbb 134 switch (i) {
amarincan 0:2003274a0cbb 135 case 0:
amarincan 0:2003274a0cbb 136 lcd.locate(2,0);
amarincan 0:2003274a0cbb 137 lcd.printf("=");
amarincan 0:2003274a0cbb 138 break;
amarincan 0:2003274a0cbb 139 case 1:
amarincan 0:2003274a0cbb 140 lcd.locate(10,0);
amarincan 0:2003274a0cbb 141 lcd.printf("=");
amarincan 0:2003274a0cbb 142 break;
amarincan 0:2003274a0cbb 143 case 2:
amarincan 0:2003274a0cbb 144 lcd.locate(2,1);
amarincan 0:2003274a0cbb 145 lcd.printf("=");
amarincan 0:2003274a0cbb 146 break;
amarincan 0:2003274a0cbb 147 case 3:
amarincan 0:2003274a0cbb 148 lcd.locate(10,1);
amarincan 0:2003274a0cbb 149 lcd.printf("=");
amarincan 0:2003274a0cbb 150 break;
amarincan 0:2003274a0cbb 151 }
amarincan 0:2003274a0cbb 152 //wait(.1);
amarincan 0:2003274a0cbb 153
amarincan 0:2003274a0cbb 154 bt=0;
amarincan 0:2003274a0cbb 155 }
amarincan 0:2003274a0cbb 156
amarincan 0:2003274a0cbb 157
amarincan 0:2003274a0cbb 158 if (bt==4){
amarincan 0:2003274a0cbb 159 bt=0;
amarincan 0:2003274a0cbb 160 break; //sale del bucle si pisan suiche4
amarincan 0:2003274a0cbb 161 }
amarincan 0:2003274a0cbb 162
amarincan 0:2003274a0cbb 163 }
amarincan 0:2003274a0cbb 164 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
amarincan 0:2003274a0cbb 165 lcd.cls(); //borra la pantalla
amarincan 0:2003274a0cbb 166 lcd.printf(" GUARDADOS!");
amarincan 0:2003274a0cbb 167 wait(2);
amarincan 0:2003274a0cbb 168 lcd.cls();
amarincan 0:2003274a0cbb 169 lcd.printf(" INICIA EL PID");
amarincan 0:2003274a0cbb 170 wait(2);
amarincan 0:2003274a0cbb 171 // se imprimen los parches del control *****************************************
amarincan 0:2003274a0cbb 172 lcd.cls();
amarincan 0:2003274a0cbb 173
amarincan 0:2003274a0cbb 174
amarincan 0:2003274a0cbb 175 lcd.printf("Er%d",err);
amarincan 0:2003274a0cbb 176 lcd.locate(8,0);
amarincan 0:2003274a0cbb 177 lcd.printf("Me%d",med2);
amarincan 0:2003274a0cbb 178 lcd.locate(0,1);
amarincan 0:2003274a0cbb 179 lcd.printf("Sp%d",Sp);
amarincan 0:2003274a0cbb 180 lcd.locate(8,1);
amarincan 0:2003274a0cbb 181 lcd.printf("Pid%d",pid);
amarincan 0:2003274a0cbb 182 //wait(5);
amarincan 0:2003274a0cbb 183
amarincan 0:2003274a0cbb 184 // CICLO PRINCIPAL CONTROLADOR PID
amarincan 0:2003274a0cbb 185
amarincan 0:2003274a0cbb 186 while(1) {
amarincan 0:2003274a0cbb 187 //wait(0.01); //leer puerto analogo y asignar a med
amarincan 0:2003274a0cbb 188 med=Vin.read();
amarincan 0:2003274a0cbb 189 med2=med*100;
amarincan 0:2003274a0cbb 190 err = (Sp-med2);
amarincan 0:2003274a0cbb 191 float kp2;
amarincan 0:2003274a0cbb 192 kp2=Kp*0.001;
amarincan 0:2003274a0cbb 193 ap = kp2*err;
amarincan 0:2003274a0cbb 194 float ki2;
amarincan 0:2003274a0cbb 195 ki2=Ki*0.01;
amarincan 0:2003274a0cbb 196 ai =(ki2*err)+ai; //calculo de la integral del error
amarincan 0:2003274a0cbb 197 float kd2;
amarincan 0:2003274a0cbb 198 kd2=Kd*0.0001;
amarincan 0:2003274a0cbb 199 ad = kd2*(err-err_v); //calculo de la accion derivativa
amarincan 0:2003274a0cbb 200 err_v=err; //guarda el error
amarincan 0:2003274a0cbb 201 pid = (ap+ai+ad);
amarincan 0:2003274a0cbb 202
amarincan 0:2003274a0cbb 203 // se verifica que pid sea menor o igual la valor maximo *****************
amarincan 0:2003274a0cbb 204 if (pid > .99999){
amarincan 0:2003274a0cbb 205 pid=1;
amarincan 0:2003274a0cbb 206 }
amarincan 0:2003274a0cbb 207
amarincan 0:2003274a0cbb 208 // se verifica que pid sea positivo **************************************
amarincan 0:2003274a0cbb 209 if (pid <0){
amarincan 0:2003274a0cbb 210 pid=0;
amarincan 0:2003274a0cbb 211 }
amarincan 0:2003274a0cbb 212
amarincan 0:2003274a0cbb 213 //wait(.5);
amarincan 0:2003274a0cbb 214
amarincan 0:2003274a0cbb 215
amarincan 0:2003274a0cbb 216
amarincan 0:2003274a0cbb 217 // se verifica que la accion integral no sea muy grande
amarincan 0:2003274a0cbb 218 if (ai > 999){
amarincan 0:2003274a0cbb 219 ai=1000;
amarincan 0:2003274a0cbb 220 }
amarincan 0:2003274a0cbb 221
amarincan 0:2003274a0cbb 222
amarincan 0:2003274a0cbb 223 Vout=pid;
amarincan 0:2003274a0cbb 224
amarincan 0:2003274a0cbb 225
amarincan 0:2003274a0cbb 226 //****se muestran las variables******************************************
amarincan 0:2003274a0cbb 227 if(c>600){
amarincan 0:2003274a0cbb 228 lcd.locate(2,0);
amarincan 0:2003274a0cbb 229 lcd.printf(" ");
amarincan 0:2003274a0cbb 230 lcd.locate(0,0);
amarincan 0:2003274a0cbb 231 lcd.printf("Er%2.2f",err);
amarincan 0:2003274a0cbb 232 lcd.locate(10,0);
amarincan 0:2003274a0cbb 233 lcd.printf(" ");
amarincan 0:2003274a0cbb 234 lcd.locate(8,0);
amarincan 0:2003274a0cbb 235 lcd.printf("Me%d",med2);
amarincan 0:2003274a0cbb 236 lcd.locate(2,1);
amarincan 0:2003274a0cbb 237 lcd.printf(" ");
amarincan 0:2003274a0cbb 238 lcd.locate(0,1);
amarincan 0:2003274a0cbb 239 lcd.printf("Sp%d",Sp);
amarincan 0:2003274a0cbb 240 lcd.locate(10,1);
amarincan 0:2003274a0cbb 241 lcd.printf(" ");
amarincan 0:2003274a0cbb 242 lcd.locate(8,1);
amarincan 0:2003274a0cbb 243 lcd.printf("Pid%4.3f",pid);
amarincan 0:2003274a0cbb 244 c=0;
amarincan 0:2003274a0cbb 245 }
amarincan 0:2003274a0cbb 246 else
amarincan 0:2003274a0cbb 247 c++;
amarincan 0:2003274a0cbb 248
amarincan 0:2003274a0cbb 249
amarincan 0:2003274a0cbb 250 }
amarincan 0:2003274a0cbb 251 }