Controlador PWM de temperatura Por Medio de accion por PWM... Lectura y filtro digiral de lectura de temperatura de Sensor LM35 a entradas análogas. Accionamiento de potencia por medio de Relés. Link De La Implementación: https://www.youtube.com/watch?v=gcQtUNqF5M0&list=UULR7eSOJgpTUlpzbloXAgIQ

Dependencies:   DebouncedIn QEI TextLCD_encoder mbed

Fork of PID_Encoder by Gustavo Ramirez

Committer:
tony63
Date:
Sat May 24 15:05:40 2014 +0000
Revision:
4:d42fe3777735
Parent:
3:9347b362d33c
Child:
5:e3a1ff046504
programa para implementar un controlador PID donde los datos ingresan por encoder

Who changed what in which revision?

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