Desarrollo de habilidades en C para progtamar las entradas de un control PID sencillo con un display 16x2. Elaboración conjunta con el usuario jmcallef.

Dependencies:   TextLCD1 mbed

Committer:
cmorab
Date:
Fri Oct 25 16:29:00 2013 +0000
Revision:
0:1c380ef8d6fb
Habilidades en C para programar un control PID sencillo con un display 16x2. Programaci?n conjunta con el usuario: jmcallf.; ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cmorab 0:1c380ef8d6fb 1 /*TAREA DOS: Aumento con gradientes de los parámetros Sp, Kp, Ki y Kd de un Control PID simple.
cmorab 0:1c380ef8d6fb 2 Con tarjeta FREESCALE KL25Z*/
cmorab 0:1c380ef8d6fb 3
cmorab 0:1c380ef8d6fb 4 #include "mbed.h"
cmorab 0:1c380ef8d6fb 5 #include "DebouncedIn.h"
cmorab 0:1c380ef8d6fb 6 #include "TextLCD.h"
cmorab 0:1c380ef8d6fb 7
cmorab 0:1c380ef8d6fb 8 AnalogIn Vin(PTC2);
cmorab 0:1c380ef8d6fb 9 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
cmorab 0:1c380ef8d6fb 10
cmorab 0:1c380ef8d6fb 11 DigitalOut led1(LED1);
cmorab 0:1c380ef8d6fb 12 DigitalOut led2(LED2);
cmorab 0:1c380ef8d6fb 13 DigitalOut led3(LED3);
cmorab 0:1c380ef8d6fb 14 DigitalOut led4(LED4);
cmorab 0:1c380ef8d6fb 15 DebouncedIn button1(PTC12); // Aumento
cmorab 0:1c380ef8d6fb 16 DebouncedIn button2(PTC13); // Disminución
cmorab 0:1c380ef8d6fb 17 DebouncedIn button3(PTC16); // Cambio de variable
cmorab 0:1c380ef8d6fb 18 DebouncedIn button4(PTC17); // Reset
cmorab 0:1c380ef8d6fb 19
cmorab 0:1c380ef8d6fb 20 int C1=0x0E; // solo muestra el curzor.
cmorab 0:1c380ef8d6fb 21 int C2=0x18; // desplaza izquierda.
cmorab 0:1c380ef8d6fb 22 int C3=0x1A; // desplaza derecha.
cmorab 0:1c380ef8d6fb 23 int C4=0x0C; // quito cursor bajo.
cmorab 0:1c380ef8d6fb 24
cmorab 0:1c380ef8d6fb 25 int i; // Indice de la variable.
cmorab 0:1c380ef8d6fb 26 int j; // Controla cambio de posición.
cmorab 0:1c380ef8d6fb 27 int kp, ki, kd, sp, cont;
cmorab 0:1c380ef8d6fb 28
cmorab 0:1c380ef8d6fb 29 int main(){
cmorab 0:1c380ef8d6fb 30 lcd.writeCommand(C1); // Escribimos un comando segun el manual del modulo LCD
cmorab 0:1c380ef8d6fb 31 lcd.cls(); // Borro toda la pantalla
cmorab 0:1c380ef8d6fb 32 lcd.locate(0,0); // Localizo donde se escribirá el siguiente comando.
cmorab 0:1c380ef8d6fb 33 lcd.printf("Sp %d",sp); // Escribe Sp (aparecen desde el punto (0,0)
cmorab 0:1c380ef8d6fb 34 lcd.locate(8,0); // Localizo donde se escribirá el siguiente comando.
cmorab 0:1c380ef8d6fb 35 lcd.printf("Kp %d",kp); // Escribe Kp (aparecen desde el punto (8,0)
cmorab 0:1c380ef8d6fb 36 lcd.locate(0,1);
cmorab 0:1c380ef8d6fb 37 lcd.printf("Ki %d",ki);
cmorab 0:1c380ef8d6fb 38 lcd.locate(8,1);
cmorab 0:1c380ef8d6fb 39 lcd.printf("Kd %d",kd);
cmorab 0:1c380ef8d6fb 40
cmorab 0:1c380ef8d6fb 41
cmorab 0:1c380ef8d6fb 42 while(1){
cmorab 0:1c380ef8d6fb 43 led3 =1;
cmorab 0:1c380ef8d6fb 44 if (button3.falling()){
cmorab 0:1c380ef8d6fb 45 led3 =!led3; // Prendo el LED color rojo cada vez que pulso el boton 3 ya que pasa a valer 0 (encendido).
cmorab 0:1c380ef8d6fb 46 ++j;
cmorab 0:1c380ef8d6fb 47 } // INCREMENTA POSICION DEL MENU CON BOTON 3
cmorab 0:1c380ef8d6fb 48 if (j==0){
cmorab 0:1c380ef8d6fb 49 lcd.locate(3,0);
cmorab 0:1c380ef8d6fb 50 lcd.printf("%d",sp);
cmorab 0:1c380ef8d6fb 51
cmorab 0:1c380ef8d6fb 52 wait(0.2);
cmorab 0:1c380ef8d6fb 53
cmorab 0:1c380ef8d6fb 54 led1 = 1;
cmorab 0:1c380ef8d6fb 55
cmorab 0:1c380ef8d6fb 56 if(button1.falling()) {
cmorab 0:1c380ef8d6fb 57 led1 =!led1; // Prendo el LED color azul cada vez que pulso el boton 1 ya que pasa a valer 0 (encendido).
cmorab 0:1c380ef8d6fb 58 //++sp; // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
cmorab 0:1c380ef8d6fb 59
cmorab 0:1c380ef8d6fb 60
cmorab 0:1c380ef8d6fb 61 // Ahora comienza el incremental.
cmorab 0:1c380ef8d6fb 62
cmorab 0:1c380ef8d6fb 63 if (!button1) {
cmorab 0:1c380ef8d6fb 64 cont=0;
cmorab 0:1c380ef8d6fb 65 wait(0.2);
cmorab 0:1c380ef8d6fb 66
cmorab 0:1c380ef8d6fb 67 while(cont<20){
cmorab 0:1c380ef8d6fb 68 cont = cont + 1;
cmorab 0:1c380ef8d6fb 69 sp=sp+1;
cmorab 0:1c380ef8d6fb 70 if (sp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:1c380ef8d6fb 71 sp=1000;
cmorab 0:1c380ef8d6fb 72 }
cmorab 0:1c380ef8d6fb 73 lcd.locate(0,0);
cmorab 0:1c380ef8d6fb 74 lcd.printf("Sp %d",sp);
cmorab 0:1c380ef8d6fb 75
cmorab 0:1c380ef8d6fb 76 wait(0.3);
cmorab 0:1c380ef8d6fb 77 if(button1){
cmorab 0:1c380ef8d6fb 78 break;
cmorab 0:1c380ef8d6fb 79 }
cmorab 0:1c380ef8d6fb 80 while(cont>=20){
cmorab 0:1c380ef8d6fb 81 cont=cont+1;
cmorab 0:1c380ef8d6fb 82 sp=sp+10;
cmorab 0:1c380ef8d6fb 83 if (sp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:1c380ef8d6fb 84 sp=1000;
cmorab 0:1c380ef8d6fb 85 }
cmorab 0:1c380ef8d6fb 86 lcd.locate(0,0);
cmorab 0:1c380ef8d6fb 87 lcd.printf("Sp %d",sp);
cmorab 0:1c380ef8d6fb 88
cmorab 0:1c380ef8d6fb 89 wait(0.3);
cmorab 0:1c380ef8d6fb 90 if(button1){
cmorab 0:1c380ef8d6fb 91 break;
cmorab 0:1c380ef8d6fb 92 }
cmorab 0:1c380ef8d6fb 93
cmorab 0:1c380ef8d6fb 94 while(cont>40){
cmorab 0:1c380ef8d6fb 95 cont = cont + 1;
cmorab 0:1c380ef8d6fb 96 sp=sp+100;
cmorab 0:1c380ef8d6fb 97 if (sp>1000){ // Ponemos un tope incremental en 10.000
cmorab 0:1c380ef8d6fb 98 sp=1000;
cmorab 0:1c380ef8d6fb 99 }
cmorab 0:1c380ef8d6fb 100 lcd.locate(0,0);
cmorab 0:1c380ef8d6fb 101 lcd.printf("Sp %d",sp);
cmorab 0:1c380ef8d6fb 102
cmorab 0:1c380ef8d6fb 103 wait(0.3);
cmorab 0:1c380ef8d6fb 104 if(button1){
cmorab 0:1c380ef8d6fb 105 break;
cmorab 0:1c380ef8d6fb 106 }
cmorab 0:1c380ef8d6fb 107 }
cmorab 0:1c380ef8d6fb 108 }
cmorab 0:1c380ef8d6fb 109 }
cmorab 0:1c380ef8d6fb 110 }
cmorab 0:1c380ef8d6fb 111
cmorab 0:1c380ef8d6fb 112 // Aqui termina el incremental.
cmorab 0:1c380ef8d6fb 113 }
cmorab 0:1c380ef8d6fb 114
cmorab 0:1c380ef8d6fb 115
cmorab 0:1c380ef8d6fb 116 led2 =1;
cmorab 0:1c380ef8d6fb 117 if (button2.falling()) {
cmorab 0:1c380ef8d6fb 118 led2 =!led2; // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).
cmorab 0:1c380ef8d6fb 119
cmorab 0:1c380ef8d6fb 120 //--sp; // Reduce el valor al pulsar el botón.
cmorab 0:1c380ef8d6fb 121 }
cmorab 0:1c380ef8d6fb 122
cmorab 0:1c380ef8d6fb 123
cmorab 0:1c380ef8d6fb 124 // Ahora comienza el decremental.
cmorab 0:1c380ef8d6fb 125
cmorab 0:1c380ef8d6fb 126 if (!button2) {
cmorab 0:1c380ef8d6fb 127 cont=0;
cmorab 0:1c380ef8d6fb 128 wait(0.2);
cmorab 0:1c380ef8d6fb 129
cmorab 0:1c380ef8d6fb 130 while(cont<20){
cmorab 0:1c380ef8d6fb 131 cont = cont + 1;
cmorab 0:1c380ef8d6fb 132 sp=sp-1;
cmorab 0:1c380ef8d6fb 133
cmorab 0:1c380ef8d6fb 134 lcd.locate(3,0);
cmorab 0:1c380ef8d6fb 135 lcd.printf(" ");
cmorab 0:1c380ef8d6fb 136 lcd.locate(0,0);
cmorab 0:1c380ef8d6fb 137 lcd.printf("Sp %d",sp);
cmorab 0:1c380ef8d6fb 138
cmorab 0:1c380ef8d6fb 139 if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:1c380ef8d6fb 140 sp=0;
cmorab 0:1c380ef8d6fb 141 }
cmorab 0:1c380ef8d6fb 142
cmorab 0:1c380ef8d6fb 143
cmorab 0:1c380ef8d6fb 144 wait(0.3);
cmorab 0:1c380ef8d6fb 145 if(button2){
cmorab 0:1c380ef8d6fb 146 break;
cmorab 0:1c380ef8d6fb 147 }
cmorab 0:1c380ef8d6fb 148
cmorab 0:1c380ef8d6fb 149 while(cont>=20){
cmorab 0:1c380ef8d6fb 150 cont=cont+1;
cmorab 0:1c380ef8d6fb 151 sp=sp-10;
cmorab 0:1c380ef8d6fb 152 if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:1c380ef8d6fb 153 sp=0;
cmorab 0:1c380ef8d6fb 154 }
cmorab 0:1c380ef8d6fb 155
cmorab 0:1c380ef8d6fb 156 lcd.locate(0,0);
cmorab 0:1c380ef8d6fb 157 lcd.printf("Sp %d ",sp);
cmorab 0:1c380ef8d6fb 158
cmorab 0:1c380ef8d6fb 159
cmorab 0:1c380ef8d6fb 160 wait(0.3);
cmorab 0:1c380ef8d6fb 161 if(button2){
cmorab 0:1c380ef8d6fb 162 break;
cmorab 0:1c380ef8d6fb 163 }
cmorab 0:1c380ef8d6fb 164
cmorab 0:1c380ef8d6fb 165 while(cont>40){
cmorab 0:1c380ef8d6fb 166 cont = cont + 1;
cmorab 0:1c380ef8d6fb 167 sp=sp-100;
cmorab 0:1c380ef8d6fb 168
cmorab 0:1c380ef8d6fb 169 if (sp<0){ // No permitimos valores negativos, definimos valor mínimo en 0.
cmorab 0:1c380ef8d6fb 170 sp=0;
cmorab 0:1c380ef8d6fb 171 }
cmorab 0:1c380ef8d6fb 172
cmorab 0:1c380ef8d6fb 173 lcd.locate(0,0);
cmorab 0:1c380ef8d6fb 174 lcd.printf("Sp %d ",sp);
cmorab 0:1c380ef8d6fb 175
cmorab 0:1c380ef8d6fb 176
cmorab 0:1c380ef8d6fb 177 wait(0.3);
cmorab 0:1c380ef8d6fb 178 if(button2){
cmorab 0:1c380ef8d6fb 179 break;
cmorab 0:1c380ef8d6fb 180 }
cmorab 0:1c380ef8d6fb 181 }
cmorab 0:1c380ef8d6fb 182 }
cmorab 0:1c380ef8d6fb 183 }
cmorab 0:1c380ef8d6fb 184 }
cmorab 0:1c380ef8d6fb 185
cmorab 0:1c380ef8d6fb 186 // Aqui termina el decremental.
cmorab 0:1c380ef8d6fb 187
cmorab 0:1c380ef8d6fb 188
cmorab 0:1c380ef8d6fb 189
cmorab 0:1c380ef8d6fb 190
cmorab 0:1c380ef8d6fb 191
cmorab 0:1c380ef8d6fb 192
cmorab 0:1c380ef8d6fb 193
cmorab 0:1c380ef8d6fb 194 }
cmorab 0:1c380ef8d6fb 195 if (j==1){
cmorab 0:1c380ef8d6fb 196 lcd.locate(11,0);
cmorab 0:1c380ef8d6fb 197 lcd.printf("%d",kp);
cmorab 0:1c380ef8d6fb 198 wait(0.3);
cmorab 0:1c380ef8d6fb 199 led1 =1;
cmorab 0:1c380ef8d6fb 200 if (button1.falling()) {
cmorab 0:1c380ef8d6fb 201 led1 =!led1;
cmorab 0:1c380ef8d6fb 202 ++kp;
cmorab 0:1c380ef8d6fb 203 }
cmorab 0:1c380ef8d6fb 204 led2 =1;
cmorab 0:1c380ef8d6fb 205 if (button2.falling()) {
cmorab 0:1c380ef8d6fb 206 lcd.locate(11,0);
cmorab 0:1c380ef8d6fb 207 lcd.printf("%d ");
cmorab 0:1c380ef8d6fb 208 led2 =!led2;
cmorab 0:1c380ef8d6fb 209 --kp;
cmorab 0:1c380ef8d6fb 210 }
cmorab 0:1c380ef8d6fb 211 if (kp>10000){
cmorab 0:1c380ef8d6fb 212 kp=10000;
cmorab 0:1c380ef8d6fb 213 lcd.locate(11,0);
cmorab 0:1c380ef8d6fb 214 lcd.printf("%d",kp);
cmorab 0:1c380ef8d6fb 215 }
cmorab 0:1c380ef8d6fb 216
cmorab 0:1c380ef8d6fb 217 if (kp<0){
cmorab 0:1c380ef8d6fb 218 kp=0;
cmorab 0:1c380ef8d6fb 219 lcd.locate(11,0);
cmorab 0:1c380ef8d6fb 220 lcd.printf("%d",kp);
cmorab 0:1c380ef8d6fb 221 }
cmorab 0:1c380ef8d6fb 222 }
cmorab 0:1c380ef8d6fb 223 if (j==2){
cmorab 0:1c380ef8d6fb 224 lcd.locate(3,1);
cmorab 0:1c380ef8d6fb 225 lcd.printf("%d",ki);
cmorab 0:1c380ef8d6fb 226 wait(0.3);
cmorab 0:1c380ef8d6fb 227 led1 =1;
cmorab 0:1c380ef8d6fb 228 if (button1.falling()){
cmorab 0:1c380ef8d6fb 229 led1 =!led1;
cmorab 0:1c380ef8d6fb 230 ++ki;
cmorab 0:1c380ef8d6fb 231 }
cmorab 0:1c380ef8d6fb 232 led2 =1;
cmorab 0:1c380ef8d6fb 233 if (button2.falling()){
cmorab 0:1c380ef8d6fb 234 lcd.locate(3,1);
cmorab 0:1c380ef8d6fb 235 lcd.printf("%d ");
cmorab 0:1c380ef8d6fb 236 led2 =!led2;
cmorab 0:1c380ef8d6fb 237 --ki;
cmorab 0:1c380ef8d6fb 238 }
cmorab 0:1c380ef8d6fb 239 if (ki>10000){
cmorab 0:1c380ef8d6fb 240 ki=10000;
cmorab 0:1c380ef8d6fb 241 lcd.locate(3,1);
cmorab 0:1c380ef8d6fb 242 lcd.printf("%d",ki);
cmorab 0:1c380ef8d6fb 243 }
cmorab 0:1c380ef8d6fb 244
cmorab 0:1c380ef8d6fb 245 if (ki<0){
cmorab 0:1c380ef8d6fb 246 ki=0;
cmorab 0:1c380ef8d6fb 247 lcd.locate(3,1);
cmorab 0:1c380ef8d6fb 248 lcd.printf("%d",ki);
cmorab 0:1c380ef8d6fb 249 }
cmorab 0:1c380ef8d6fb 250 }
cmorab 0:1c380ef8d6fb 251
cmorab 0:1c380ef8d6fb 252 if (j==3){
cmorab 0:1c380ef8d6fb 253 lcd.locate(11,1);
cmorab 0:1c380ef8d6fb 254 lcd.printf("%d",kd);
cmorab 0:1c380ef8d6fb 255 wait(0.3);
cmorab 0:1c380ef8d6fb 256 led1 =1;
cmorab 0:1c380ef8d6fb 257 if (button1.falling()){
cmorab 0:1c380ef8d6fb 258 led1 =!led1;
cmorab 0:1c380ef8d6fb 259 ++kd;
cmorab 0:1c380ef8d6fb 260 }
cmorab 0:1c380ef8d6fb 261 led2 =1;
cmorab 0:1c380ef8d6fb 262 if (button2.falling()){
cmorab 0:1c380ef8d6fb 263 lcd.locate(11,1);
cmorab 0:1c380ef8d6fb 264 lcd.printf("%d ");
cmorab 0:1c380ef8d6fb 265 led2 =!led2;
cmorab 0:1c380ef8d6fb 266 --kd;
cmorab 0:1c380ef8d6fb 267
cmorab 0:1c380ef8d6fb 268
cmorab 0:1c380ef8d6fb 269 }
cmorab 0:1c380ef8d6fb 270 if (kd>10000){
cmorab 0:1c380ef8d6fb 271 kd=10000;
cmorab 0:1c380ef8d6fb 272 lcd.locate(11,1);
cmorab 0:1c380ef8d6fb 273 lcd.printf("%d",kd);
cmorab 0:1c380ef8d6fb 274 }
cmorab 0:1c380ef8d6fb 275
cmorab 0:1c380ef8d6fb 276 if (kd<0){
cmorab 0:1c380ef8d6fb 277 kd=0;
cmorab 0:1c380ef8d6fb 278 lcd.locate(11,1);
cmorab 0:1c380ef8d6fb 279 lcd.printf("%d",kd);
cmorab 0:1c380ef8d6fb 280 }
cmorab 0:1c380ef8d6fb 281 }
cmorab 0:1c380ef8d6fb 282
cmorab 0:1c380ef8d6fb 283 if (j==4){
cmorab 0:1c380ef8d6fb 284 j=0;
cmorab 0:1c380ef8d6fb 285 }
cmorab 0:1c380ef8d6fb 286
cmorab 0:1c380ef8d6fb 287 if (button4.falling()){
cmorab 0:1c380ef8d6fb 288 sp=0;
cmorab 0:1c380ef8d6fb 289 kp=0;
cmorab 0:1c380ef8d6fb 290 ki=0;
cmorab 0:1c380ef8d6fb 291 kd=0;
cmorab 0:1c380ef8d6fb 292 lcd.locate(11,1);
cmorab 0:1c380ef8d6fb 293 lcd.printf("%d ",kd);
cmorab 0:1c380ef8d6fb 294 lcd.locate(3,1);
cmorab 0:1c380ef8d6fb 295 lcd.printf("%d ",ki);
cmorab 0:1c380ef8d6fb 296 lcd.locate(11,0);
cmorab 0:1c380ef8d6fb 297 lcd.printf("%d ",kp);
cmorab 0:1c380ef8d6fb 298 lcd.locate(3,0);
cmorab 0:1c380ef8d6fb 299 lcd.printf("%d ",sp);
cmorab 0:1c380ef8d6fb 300 }
cmorab 0:1c380ef8d6fb 301 }
cmorab 0:1c380ef8d6fb 302 }
cmorab 0:1c380ef8d6fb 303