pid y telado matricial en una plante de primer orden
Dependencies: FPointer TextLCD keypad mbed
main.cpp@0:2003274a0cbb, 2013-12-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |