En este programa se presenta un PID con entrada y salida analogica

Dependencies:   TextLCD mbed

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

Committer:
amarincan
Date:
Wed Nov 13 02:55:38 2013 +0000
Revision:
0:4ba2d502801f
se cambio una funcion privada a publica

Who changed what in which revision?

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