Juan Salvador Payares Ernesto Guevara

Dependencies:   DebouncedIn FPointer TextLCD keypad mbed

Committer:
payarito32
Date:
Sat Apr 05 02:31:01 2014 +0000
Revision:
0:3111ed8ce85b
Juan Salvador Payares;  Ernesto Guevara

Who changed what in which revision?

UserRevisionLine numberNew contents of line
payarito32 0:3111ed8ce85b 1 //Programa para hacer control PID simple, ingresa parámetros con teclado 4x4. Imprime resultados en LCD 16x2
payarito32 0:3111ed8ce85b 2
payarito32 0:3111ed8ce85b 3 #include "mbed.h"
payarito32 0:3111ed8ce85b 4 #include "TextLCD.h"
payarito32 0:3111ed8ce85b 5 #include"keypad.h" //Librería del teclado 4x4
payarito32 0:3111ed8ce85b 6 #include"FPointer.h" //Librería complementaria para libreria keypad
payarito32 0:3111ed8ce85b 7
payarito32 0:3111ed8ce85b 8 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
payarito32 0:3111ed8ce85b 9 Keypad keypad(PTA2,PTD4,PTD3,PTD7,PTA13,PTD5,PTD0,PTD2); //Entradas del teclado(4r,3r,2r,1r,8,7,6,5)
payarito32 0:3111ed8ce85b 10
payarito32 0:3111ed8ce85b 11 AnalogIn Vin(PTB0); //Voltaje de alimentación
payarito32 0:3111ed8ce85b 12 DigitalOut sound(PTC5); //Salida de Audio Digital
payarito32 0:3111ed8ce85b 13 AnalogOut Vout(PTE30); //Marcar la salida analógica
payarito32 0:3111ed8ce85b 14
payarito32 0:3111ed8ce85b 15 //ASIGNACION DE VARIABLES
payarito32 0:3111ed8ce85b 16 Timer t;
payarito32 0:3111ed8ce85b 17 int cero;
payarito32 0:3111ed8ce85b 18 int flag;
payarito32 0:3111ed8ce85b 19 int q;
payarito32 0:3111ed8ce85b 20 int k;
payarito32 0:3111ed8ce85b 21 int C1=0x0E; //configurar el lcd para mostrar el guin bajo
payarito32 0:3111ed8ce85b 22 int C2=0x0C; //configurar el lcd para QUITAR el guion bajo
payarito32 0:3111ed8ce85b 23 float sp=0; //set point
payarito32 0:3111ed8ce85b 24 float kp=0; //ganancia proporcional
payarito32 0:3111ed8ce85b 25 float ki=0; //ganancia integral
payarito32 0:3111ed8ce85b 26 float kd=0; //ganancia derivativa
payarito32 0:3111ed8ce85b 27 int ind=0; //vector de caracteres.
payarito32 0:3111ed8ce85b 28 float err, med, yr, ap, ai, ad, err_v, cycle; //Variable de control PID
payarito32 0:3111ed8ce85b 29 float pid;
payarito32 0:3111ed8ce85b 30 int i;
payarito32 0:3111ed8ce85b 31
payarito32 0:3111ed8ce85b 32 //MATRIZ DEL TECLADO
payarito32 0:3111ed8ce85b 33 float Keytable[] = {1,2,3,11,
payarito32 0:3111ed8ce85b 34 4,5,6,12,
payarito32 0:3111ed8ce85b 35 7,8,9,13,
payarito32 0:3111ed8ce85b 36 15,0,16,14};
payarito32 0:3111ed8ce85b 37
payarito32 0:3111ed8ce85b 38 //Se crea una función que incremente los valores
payarito32 0:3111ed8ce85b 39
payarito32 0:3111ed8ce85b 40 void increment(int j){
payarito32 0:3111ed8ce85b 41 if(j==0){
payarito32 0:3111ed8ce85b 42 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 43 sound = 0;
payarito32 0:3111ed8ce85b 44 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 45 sound=1;
payarito32 0:3111ed8ce85b 46 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 47
payarito32 0:3111ed8ce85b 48 }
payarito32 0:3111ed8ce85b 49 if (q!=1 && sp<10){
payarito32 0:3111ed8ce85b 50 sp=ind;
payarito32 0:3111ed8ce85b 51 q=1;
payarito32 0:3111ed8ce85b 52 }
payarito32 0:3111ed8ce85b 53 else{
payarito32 0:3111ed8ce85b 54 sp=10*sp+ind;
payarito32 0:3111ed8ce85b 55 }
payarito32 0:3111ed8ce85b 56 if(sp>999)sp=999;
payarito32 0:3111ed8ce85b 57 lcd.locate(3,0); lcd.printf(" ");
payarito32 0:3111ed8ce85b 58 lcd.locate(3,0); lcd.printf("%.0f",sp);
payarito32 0:3111ed8ce85b 59 }
payarito32 0:3111ed8ce85b 60 else if(j==1){
payarito32 0:3111ed8ce85b 61 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 62 sound = 0;
payarito32 0:3111ed8ce85b 63 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 64 sound=1;
payarito32 0:3111ed8ce85b 65 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 66 }
payarito32 0:3111ed8ce85b 67 if (q!=1 && kp<10){
payarito32 0:3111ed8ce85b 68 kp=ind;
payarito32 0:3111ed8ce85b 69 q=1;
payarito32 0:3111ed8ce85b 70 }
payarito32 0:3111ed8ce85b 71 else{
payarito32 0:3111ed8ce85b 72 kp=10*kp+ind;
payarito32 0:3111ed8ce85b 73 }
payarito32 0:3111ed8ce85b 74 if(kp>999)kp=999;
payarito32 0:3111ed8ce85b 75 lcd.locate(11,0); lcd.printf(" ");
payarito32 0:3111ed8ce85b 76 lcd.locate(11,0); lcd.printf("%.0f",kp);
payarito32 0:3111ed8ce85b 77 }
payarito32 0:3111ed8ce85b 78 else if(j==2){
payarito32 0:3111ed8ce85b 79 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 80 sound = 0;
payarito32 0:3111ed8ce85b 81 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 82 sound=1;
payarito32 0:3111ed8ce85b 83 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 84
payarito32 0:3111ed8ce85b 85 }
payarito32 0:3111ed8ce85b 86 if (q!=1 && ki<10){
payarito32 0:3111ed8ce85b 87 ki=ind;
payarito32 0:3111ed8ce85b 88 q=1;
payarito32 0:3111ed8ce85b 89 }
payarito32 0:3111ed8ce85b 90 else{
payarito32 0:3111ed8ce85b 91 ki=10*ki+ind;
payarito32 0:3111ed8ce85b 92 }
payarito32 0:3111ed8ce85b 93 if(ki>999)ki=999;
payarito32 0:3111ed8ce85b 94 lcd.locate(3,1); lcd.printf(" ");
payarito32 0:3111ed8ce85b 95 lcd.locate(3,1); lcd.printf("%.0f",ki);
payarito32 0:3111ed8ce85b 96 }
payarito32 0:3111ed8ce85b 97 else{
payarito32 0:3111ed8ce85b 98 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 99 sound = 0;
payarito32 0:3111ed8ce85b 100 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 101 sound=1;
payarito32 0:3111ed8ce85b 102 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 103
payarito32 0:3111ed8ce85b 104 }
payarito32 0:3111ed8ce85b 105 if (q!=1 && kd<10){
payarito32 0:3111ed8ce85b 106 kd=ind;
payarito32 0:3111ed8ce85b 107 q=1;
payarito32 0:3111ed8ce85b 108 }
payarito32 0:3111ed8ce85b 109 else{
payarito32 0:3111ed8ce85b 110 kd=10*kd+ind;
payarito32 0:3111ed8ce85b 111 }
payarito32 0:3111ed8ce85b 112 if(kd>999)kd=999;
payarito32 0:3111ed8ce85b 113 lcd.locate(11,1); lcd.printf(" ");
payarito32 0:3111ed8ce85b 114 lcd.locate(11,1); lcd.printf("%.0f",kd);
payarito32 0:3111ed8ce85b 115 }
payarito32 0:3111ed8ce85b 116 ind=0; cero=0;
payarito32 0:3111ed8ce85b 117 }
payarito32 0:3111ed8ce85b 118
payarito32 0:3111ed8ce85b 119 uint32_t cbAfterInput(uint32_t index) {
payarito32 0:3111ed8ce85b 120 ind=Keytable[index];
payarito32 0:3111ed8ce85b 121 cero=index;
payarito32 0:3111ed8ce85b 122 return 0;
payarito32 0:3111ed8ce85b 123 }
payarito32 0:3111ed8ce85b 124
payarito32 0:3111ed8ce85b 125 void def_posicion(int j){
payarito32 0:3111ed8ce85b 126 if (j==0){
payarito32 0:3111ed8ce85b 127 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 128 sound = 0;
payarito32 0:3111ed8ce85b 129 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 130 sound=1;
payarito32 0:3111ed8ce85b 131 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 132
payarito32 0:3111ed8ce85b 133 }
payarito32 0:3111ed8ce85b 134 lcd.locate(3,0); lcd.printf("%.0f",sp);
payarito32 0:3111ed8ce85b 135 lcd.locate(3,0);
payarito32 0:3111ed8ce85b 136 }
payarito32 0:3111ed8ce85b 137 else if(j==1){
payarito32 0:3111ed8ce85b 138 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 139 sound = 0;
payarito32 0:3111ed8ce85b 140 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 141 sound=1;
payarito32 0:3111ed8ce85b 142 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 143
payarito32 0:3111ed8ce85b 144 }
payarito32 0:3111ed8ce85b 145 lcd.locate(11,0); lcd.printf("%.0f",kp);
payarito32 0:3111ed8ce85b 146 lcd.locate(11,0);
payarito32 0:3111ed8ce85b 147 }
payarito32 0:3111ed8ce85b 148 else if (j==2){
payarito32 0:3111ed8ce85b 149 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 150 sound = 0;
payarito32 0:3111ed8ce85b 151 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 152 sound=1;
payarito32 0:3111ed8ce85b 153 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 154
payarito32 0:3111ed8ce85b 155 }
payarito32 0:3111ed8ce85b 156 lcd.locate(3,1); lcd.printf("%.0f",ki);
payarito32 0:3111ed8ce85b 157 lcd.locate(3,1);
payarito32 0:3111ed8ce85b 158 }
payarito32 0:3111ed8ce85b 159 else {
payarito32 0:3111ed8ce85b 160 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 161 sound = 0;
payarito32 0:3111ed8ce85b 162 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 163 sound=1;
payarito32 0:3111ed8ce85b 164 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 165
payarito32 0:3111ed8ce85b 166 }
payarito32 0:3111ed8ce85b 167 lcd.locate(11,1); lcd.printf("%.0f",kd);
payarito32 0:3111ed8ce85b 168 lcd.locate(11,1);
payarito32 0:3111ed8ce85b 169 }
payarito32 0:3111ed8ce85b 170 }
payarito32 0:3111ed8ce85b 171
payarito32 0:3111ed8ce85b 172 //Dado que hay parámetros que no varía en el display en esta parte del código, se crea una función que los mantenga.
payarito32 0:3111ed8ce85b 173 void star_patch1(void){
payarito32 0:3111ed8ce85b 174 lcd.cls();
payarito32 0:3111ed8ce85b 175 lcd.locate(8,0);
payarito32 0:3111ed8ce85b 176 lcd.printf("Kp=%.0f",kp);
payarito32 0:3111ed8ce85b 177 lcd.locate(0,1);
payarito32 0:3111ed8ce85b 178 lcd.printf("Ki=%.0f",ki);
payarito32 0:3111ed8ce85b 179 lcd.locate(8,1);
payarito32 0:3111ed8ce85b 180 lcd.printf("Kd=%.0f",kd);
payarito32 0:3111ed8ce85b 181 lcd.writeCommand(C1); //cursor se vea y sea intermitente
payarito32 0:3111ed8ce85b 182 lcd.locate(0,0);
payarito32 0:3111ed8ce85b 183 lcd.printf("Sp=%.0f",sp);
payarito32 0:3111ed8ce85b 184 }
payarito32 0:3111ed8ce85b 185
payarito32 0:3111ed8ce85b 186 void star_patch2(void){ // uso nuevamente función que imprime los caracteres que no van a variar en el display
payarito32 0:3111ed8ce85b 187 lcd.writeCommand(C2);
payarito32 0:3111ed8ce85b 188 lcd.cls();
payarito32 0:3111ed8ce85b 189 lcd.printf("Iniciamos el PID |m|");
payarito32 0:3111ed8ce85b 190 wait(2);
payarito32 0:3111ed8ce85b 191 lcd.cls();
payarito32 0:3111ed8ce85b 192 lcd.printf("Er%=f",err);
payarito32 0:3111ed8ce85b 193 lcd.locate(8,0); lcd.printf("Me=%.0f",med);
payarito32 0:3111ed8ce85b 194 lcd.locate(0,1); lcd.printf("Sp=%.0f",sp);
payarito32 0:3111ed8ce85b 195 lcd.locate(8,1); lcd.printf("Co=%.0f",pid);
payarito32 0:3111ed8ce85b 196 wait(3);
payarito32 0:3111ed8ce85b 197 }
payarito32 0:3111ed8ce85b 198
payarito32 0:3111ed8ce85b 199 int main(){
payarito32 0:3111ed8ce85b 200 //ini:
payarito32 0:3111ed8ce85b 201 ind=0;
payarito32 0:3111ed8ce85b 202 star_patch1();
payarito32 0:3111ed8ce85b 203 keypad.CallAfterInput(&cbAfterInput);
payarito32 0:3111ed8ce85b 204 keypad.Start();
payarito32 0:3111ed8ce85b 205 ini1:
payarito32 0:3111ed8ce85b 206 if(ind==12){
payarito32 0:3111ed8ce85b 207 if (k<3) k++;
payarito32 0:3111ed8ce85b 208 else k=0;
payarito32 0:3111ed8ce85b 209 def_posicion(k);
payarito32 0:3111ed8ce85b 210 ind=0;
payarito32 0:3111ed8ce85b 211 q=0;
payarito32 0:3111ed8ce85b 212 }
payarito32 0:3111ed8ce85b 213 if(ind==13){
payarito32 0:3111ed8ce85b 214 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 215 sound = 0;
payarito32 0:3111ed8ce85b 216 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 217 sound=1;
payarito32 0:3111ed8ce85b 218 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 219 }
payarito32 0:3111ed8ce85b 220 ind=0;
payarito32 0:3111ed8ce85b 221 //goto PID;
payarito32 0:3111ed8ce85b 222 }
payarito32 0:3111ed8ce85b 223 if(ind==14){
payarito32 0:3111ed8ce85b 224 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 225 sound = 0;
payarito32 0:3111ed8ce85b 226 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 227 sound=1;
payarito32 0:3111ed8ce85b 228 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 229 }
payarito32 0:3111ed8ce85b 230 ind=0;
payarito32 0:3111ed8ce85b 231 }
payarito32 0:3111ed8ce85b 232 if(ind==15){
payarito32 0:3111ed8ce85b 233 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 234 sound = 0;
payarito32 0:3111ed8ce85b 235 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 236 sound=1;
payarito32 0:3111ed8ce85b 237 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 238 }
payarito32 0:3111ed8ce85b 239 ind=0;
payarito32 0:3111ed8ce85b 240 }
payarito32 0:3111ed8ce85b 241 if(ind==16){
payarito32 0:3111ed8ce85b 242 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 243 sound = 0;
payarito32 0:3111ed8ce85b 244 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 245 sound=1;
payarito32 0:3111ed8ce85b 246 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 247 }
payarito32 0:3111ed8ce85b 248 ind=0;
payarito32 0:3111ed8ce85b 249 }
payarito32 0:3111ed8ce85b 250 if(ind==11){
payarito32 0:3111ed8ce85b 251 for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA
payarito32 0:3111ed8ce85b 252 sound = 0;
payarito32 0:3111ed8ce85b 253 wait(0.00015); // Medio ciclo de dureza Arriba
payarito32 0:3111ed8ce85b 254 sound=1;
payarito32 0:3111ed8ce85b 255 wait(0.0005); // Medio ciclo Abajo
payarito32 0:3111ed8ce85b 256
payarito32 0:3111ed8ce85b 257 }
payarito32 0:3111ed8ce85b 258 if (k==0){
payarito32 0:3111ed8ce85b 259 sp=0;
payarito32 0:3111ed8ce85b 260 lcd.locate(3,0); lcd.printf(" ");
payarito32 0:3111ed8ce85b 261 lcd.locate(3,0); lcd.printf("%.0f",sp);
payarito32 0:3111ed8ce85b 262 }
payarito32 0:3111ed8ce85b 263 else if(k==1){
payarito32 0:3111ed8ce85b 264 kp=0;
payarito32 0:3111ed8ce85b 265 lcd.locate(11,0); lcd.printf(" ");
payarito32 0:3111ed8ce85b 266 lcd.locate(11,0); lcd.printf("%.0f",kp);
payarito32 0:3111ed8ce85b 267 }
payarito32 0:3111ed8ce85b 268 else if (k==2){
payarito32 0:3111ed8ce85b 269 ki=0;
payarito32 0:3111ed8ce85b 270 lcd.locate(3,1); lcd.printf(" ");
payarito32 0:3111ed8ce85b 271 lcd.locate(3,1); lcd.printf("%.0f",ki);
payarito32 0:3111ed8ce85b 272 }
payarito32 0:3111ed8ce85b 273 else {
payarito32 0:3111ed8ce85b 274 kd=0;
payarito32 0:3111ed8ce85b 275 lcd.locate(11,1); lcd.printf(" ");
payarito32 0:3111ed8ce85b 276 lcd.locate(11,1); lcd.printf("%.0f",kd);
payarito32 0:3111ed8ce85b 277 }
payarito32 0:3111ed8ce85b 278 q=0; ind=0;
payarito32 0:3111ed8ce85b 279 }
payarito32 0:3111ed8ce85b 280 if (ind!=0 && ind!=12 && ind!=13 && ind!=11 || cero==13 ){
payarito32 0:3111ed8ce85b 281 increment(k);
payarito32 0:3111ed8ce85b 282 }
payarito32 0:3111ed8ce85b 283 goto ini1;
payarito32 0:3111ed8ce85b 284 }