PID para un circuito RC

Dependencies:   Debounced QEI TextLCD mbed

Committer:
Meli
Date:
Mon Oct 19 21:39:40 2015 +0000
Revision:
0:6725cd84b3ad
Se realiza un PID para un circuito RC;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Meli 0:6725cd84b3ad 1 #include "mbed.h"
Meli 0:6725cd84b3ad 2 #include "DebouncedIn.h"
Meli 0:6725cd84b3ad 3 #include "TextLCD.h"
Meli 0:6725cd84b3ad 4 #include "QEI.h"
Meli 0:6725cd84b3ad 5
Meli 0:6725cd84b3ad 6 AnalogIn Vin(PTC2); // entrada analoga
Meli 0:6725cd84b3ad 7 AnalogOut Vout(PTE30); // salida analoga
Meli 0:6725cd84b3ad 8 //voltaje de salida maximo= 3.3 V
Meli 0:6725cd84b3ad 9
Meli 0:6725cd84b3ad 10 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
Meli 0:6725cd84b3ad 11
Meli 0:6725cd84b3ad 12 QEI wheel (PTD5, PTD0, NC, 150);
Meli 0:6725cd84b3ad 13 DigitalOut led1(LED1);
Meli 0:6725cd84b3ad 14 DigitalOut led2(LED2);
Meli 0:6725cd84b3ad 15 DigitalOut led3(LED3);
Meli 0:6725cd84b3ad 16 DebouncedIn botonEncoder(PTC5);
Meli 0:6725cd84b3ad 17 DebouncedIn button4(PTC17);
Meli 0:6725cd84b3ad 18
Meli 0:6725cd84b3ad 19
Meli 0:6725cd84b3ad 20 //int C1=0x0E; // solo muestra el curzor
Meli 0:6725cd84b3ad 21 int C2=0x18; // desplaza izquierda
Meli 0:6725cd84b3ad 22 int C3=0x1A; // desplaza derecha
Meli 0:6725cd84b3ad 23 int C4=0x0C; // quito cursor bajo
Meli 0:6725cd84b3ad 24 int C1=0x0F;
Meli 0:6725cd84b3ad 25 int sp=0,kp=0,kd=0,ki=0,p=1,bandera = 0;
Meli 0:6725cd84b3ad 26 int i; // indice de la variable
Meli 0:6725cd84b3ad 27 int j; //variable controla cambio 4 posiciones
Meli 0:6725cd84b3ad 28 float err;
Meli 0:6725cd84b3ad 29 float pwmset;
Meli 0:6725cd84b3ad 30 float eInteg;
Meli 0:6725cd84b3ad 31 float pGain;
Meli 0:6725cd84b3ad 32 float ePrev ;
Meli 0:6725cd84b3ad 33 float iGain;
Meli 0:6725cd84b3ad 34 float dGain;
Meli 0:6725cd84b3ad 35 float x;
Meli 0:6725cd84b3ad 36 int main()
Meli 0:6725cd84b3ad 37 {
Meli 0:6725cd84b3ad 38 lcd.cls();
Meli 0:6725cd84b3ad 39 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
Meli 0:6725cd84b3ad 40 lcd.locate(8,0);
Meli 0:6725cd84b3ad 41 lcd.printf("kp=%d",kp);
Meli 0:6725cd84b3ad 42 lcd.locate(0,1);
Meli 0:6725cd84b3ad 43 lcd.printf("Ki=%d", ki);
Meli 0:6725cd84b3ad 44 lcd.locate(8,1);
Meli 0:6725cd84b3ad 45 lcd.printf("Kd=%d", kd);
Meli 0:6725cd84b3ad 46 lcd.locate(0,0);
Meli 0:6725cd84b3ad 47 lcd.printf("Sp=%d", sp);
Meli 0:6725cd84b3ad 48
Meli 0:6725cd84b3ad 49 while(1) {
Meli 0:6725cd84b3ad 50
Meli 0:6725cd84b3ad 51 led3 =1;
Meli 0:6725cd84b3ad 52 if (botonEncoder.falling()) { //INCREMENTA POSICION DEL MENU CON BOTON 3 (Switche encoder)
Meli 0:6725cd84b3ad 53 led3 =!led3;
Meli 0:6725cd84b3ad 54 ++j;
Meli 0:6725cd84b3ad 55 }
Meli 0:6725cd84b3ad 56
Meli 0:6725cd84b3ad 57 if (j==0){
Meli 0:6725cd84b3ad 58 sp=sp+wheel.getPulses();
Meli 0:6725cd84b3ad 59 wheel.reset();
Meli 0:6725cd84b3ad 60 if (sp>5){
Meli 0:6725cd84b3ad 61 sp=5;
Meli 0:6725cd84b3ad 62 }
Meli 0:6725cd84b3ad 63 if (sp<0){
Meli 0:6725cd84b3ad 64 sp=0;
Meli 0:6725cd84b3ad 65 }
Meli 0:6725cd84b3ad 66 lcd.locate(3,0);
Meli 0:6725cd84b3ad 67 lcd.printf(" ",sp);
Meli 0:6725cd84b3ad 68 lcd.locate(3,0);
Meli 0:6725cd84b3ad 69 lcd.printf("%d",sp);
Meli 0:6725cd84b3ad 70 wait(0.2);
Meli 0:6725cd84b3ad 71
Meli 0:6725cd84b3ad 72 if(botonEncoder.falling()){
Meli 0:6725cd84b3ad 73 j=1;
Meli 0:6725cd84b3ad 74 led3=0;
Meli 0:6725cd84b3ad 75 wait(0.3);
Meli 0:6725cd84b3ad 76 wheel.reset();
Meli 0:6725cd84b3ad 77 }
Meli 0:6725cd84b3ad 78
Meli 0:6725cd84b3ad 79 }
Meli 0:6725cd84b3ad 80
Meli 0:6725cd84b3ad 81 if (j==1) {
Meli 0:6725cd84b3ad 82 kp=kp+wheel.getPulses();
Meli 0:6725cd84b3ad 83 wheel.reset();
Meli 0:6725cd84b3ad 84 if (kp>999){
Meli 0:6725cd84b3ad 85 kp=999;
Meli 0:6725cd84b3ad 86 }
Meli 0:6725cd84b3ad 87 if (kp<0){
Meli 0:6725cd84b3ad 88 kp=0;
Meli 0:6725cd84b3ad 89 }
Meli 0:6725cd84b3ad 90 lcd.locate(11,0);
Meli 0:6725cd84b3ad 91 lcd.printf(" ");
Meli 0:6725cd84b3ad 92 lcd.locate(11,0);
Meli 0:6725cd84b3ad 93 lcd.printf("%d",kp);
Meli 0:6725cd84b3ad 94 wait(0.2);
Meli 0:6725cd84b3ad 95
Meli 0:6725cd84b3ad 96 if(botonEncoder.falling()){
Meli 0:6725cd84b3ad 97 j=2;
Meli 0:6725cd84b3ad 98 led3=0;
Meli 0:6725cd84b3ad 99 wait(0.3);
Meli 0:6725cd84b3ad 100 wheel.reset();
Meli 0:6725cd84b3ad 101 }
Meli 0:6725cd84b3ad 102
Meli 0:6725cd84b3ad 103 }
Meli 0:6725cd84b3ad 104
Meli 0:6725cd84b3ad 105 if (j==2) {
Meli 0:6725cd84b3ad 106 ki=ki+wheel.getPulses();
Meli 0:6725cd84b3ad 107 wheel.reset();
Meli 0:6725cd84b3ad 108 if (ki>999){
Meli 0:6725cd84b3ad 109 ki=999;
Meli 0:6725cd84b3ad 110 }
Meli 0:6725cd84b3ad 111 if (ki<0){
Meli 0:6725cd84b3ad 112 ki=0;
Meli 0:6725cd84b3ad 113 }
Meli 0:6725cd84b3ad 114 lcd.locate(3,1);
Meli 0:6725cd84b3ad 115 lcd.printf(" ");
Meli 0:6725cd84b3ad 116 lcd.locate(3,1);
Meli 0:6725cd84b3ad 117 lcd.printf("%d",ki);
Meli 0:6725cd84b3ad 118 wait(0.2);
Meli 0:6725cd84b3ad 119
Meli 0:6725cd84b3ad 120 if(botonEncoder.falling()){
Meli 0:6725cd84b3ad 121 j=3;
Meli 0:6725cd84b3ad 122 led3=0;
Meli 0:6725cd84b3ad 123 wait(0.3);
Meli 0:6725cd84b3ad 124 wheel.reset();
Meli 0:6725cd84b3ad 125 }
Meli 0:6725cd84b3ad 126
Meli 0:6725cd84b3ad 127 }
Meli 0:6725cd84b3ad 128
Meli 0:6725cd84b3ad 129 if (j==3) {
Meli 0:6725cd84b3ad 130 kd=kd+wheel.getPulses();
Meli 0:6725cd84b3ad 131 wheel.reset();
Meli 0:6725cd84b3ad 132 if (kd>999){
Meli 0:6725cd84b3ad 133 kd=999;
Meli 0:6725cd84b3ad 134 }
Meli 0:6725cd84b3ad 135 if (kd<0){
Meli 0:6725cd84b3ad 136 kd=0;
Meli 0:6725cd84b3ad 137 }
Meli 0:6725cd84b3ad 138 lcd.locate(11,1);
Meli 0:6725cd84b3ad 139 lcd.printf(" ");
Meli 0:6725cd84b3ad 140 lcd.locate(11,1);
Meli 0:6725cd84b3ad 141 lcd.printf("%d",kd);
Meli 0:6725cd84b3ad 142 wait(0.2);
Meli 0:6725cd84b3ad 143
Meli 0:6725cd84b3ad 144 if(botonEncoder.falling()){
Meli 0:6725cd84b3ad 145 j=0;
Meli 0:6725cd84b3ad 146 led3=0;
Meli 0:6725cd84b3ad 147 wait(0.3);
Meli 0:6725cd84b3ad 148 wheel.reset();
Meli 0:6725cd84b3ad 149 }
Meli 0:6725cd84b3ad 150
Meli 0:6725cd84b3ad 151 }
Meli 0:6725cd84b3ad 152
Meli 0:6725cd84b3ad 153 if (j==4) {
Meli 0:6725cd84b3ad 154 j=0;
Meli 0:6725cd84b3ad 155 }
Meli 0:6725cd84b3ad 156
Meli 0:6725cd84b3ad 157 if (!button4){
Meli 0:6725cd84b3ad 158 break; //sale del bucle si pisan suiche4
Meli 0:6725cd84b3ad 159 }
Meli 0:6725cd84b3ad 160 } //cierro while(1)
Meli 0:6725cd84b3ad 161
Meli 0:6725cd84b3ad 162 //enter
Meli 0:6725cd84b3ad 163 if(button4.falling())
Meli 0:6725cd84b3ad 164 {
Meli 0:6725cd84b3ad 165 lcd.cls(); // al undir el boton 4 se borra la pantalla
Meli 0:6725cd84b3ad 166 //for (int h=0;h<100;h++)
Meli 0:6725cd84b3ad 167 //Vout= Vout+0.01;
Meli 0:6725cd84b3ad 168 while(bandera==0)
Meli 0:6725cd84b3ad 169 {
Meli 0:6725cd84b3ad 170 wait(0.2);
Meli 0:6725cd84b3ad 171 x=Vout.read(); // lee el voltaje de salida que nuestra analoga pero en porcentaje
Meli 0:6725cd84b3ad 172
Meli 0:6725cd84b3ad 173 //}
Meli 0:6725cd84b3ad 174 //pid
Meli 0:6725cd84b3ad 175
Meli 0:6725cd84b3ad 176 err = sp-x; // Calcula el error
Meli 0:6725cd84b3ad 177 pwmset = kp* err+ki * eInteg +kd* (err - ePrev); // ecuacion para el PID
Meli 0:6725cd84b3ad 178 pwmset=(0.976801/5)*pwmset; // como el voltaje calculado fue un porcentaje se realiza una conversion respectiva al valor de salida
Meli 0:6725cd84b3ad 179 Vout=pwmset;
Meli 0:6725cd84b3ad 180 eInteg =eInteg+ err; // integral
Meli 0:6725cd84b3ad 181 ePrev = err;
Meli 0:6725cd84b3ad 182 lcd.locate(0,1);
Meli 0:6725cd84b3ad 183 lcd.printf("error=%f",err);
Meli 0:6725cd84b3ad 184 lcd.locate(1,0);
Meli 0:6725cd84b3ad 185 lcd.printf("salida=%f",x);
Meli 0:6725cd84b3ad 186 if (button4.falling())
Meli 0:6725cd84b3ad 187 { bandera=1;
Meli 0:6725cd84b3ad 188 lcd.cls();
Meli 0:6725cd84b3ad 189 p=1;
Meli 0:6725cd84b3ad 190 lcd.locate(8,0);
Meli 0:6725cd84b3ad 191 lcd.printf("kp=%d",kp);
Meli 0:6725cd84b3ad 192 lcd.locate(0,1);
Meli 0:6725cd84b3ad 193 lcd.printf("Ki=%d", ki);
Meli 0:6725cd84b3ad 194 lcd.locate(8,1);
Meli 0:6725cd84b3ad 195 lcd.printf("Kd=%d", kd);
Meli 0:6725cd84b3ad 196 lcd.locate(0,0);
Meli 0:6725cd84b3ad 197 lcd.printf("Sp=%d", sp);
Meli 0:6725cd84b3ad 198
Meli 0:6725cd84b3ad 199 }
Meli 0:6725cd84b3ad 200
Meli 0:6725cd84b3ad 201
Meli 0:6725cd84b3ad 202 }
Meli 0:6725cd84b3ad 203 bandera = 0;
Meli 0:6725cd84b3ad 204 }
Meli 0:6725cd84b3ad 205
Meli 0:6725cd84b3ad 206
Meli 0:6725cd84b3ad 207
Meli 0:6725cd84b3ad 208 }
Meli 0:6725cd84b3ad 209
Meli 0:6725cd84b3ad 210