Santiago Ramírez / Mbed 2 deprecated CodigoTermite

Dependencies:   mbed

Committer:
General_Jeff
Date:
Fri Jun 14 20:49:18 2019 +0000
Revision:
0:86d8b8db5c66
Control pid por medio de Termite

Who changed what in which revision?

UserRevisionLine numberNew contents of line
General_Jeff 0:86d8b8db5c66 1 #include "mbed.h"
General_Jeff 0:86d8b8db5c66 2
General_Jeff 0:86d8b8db5c66 3
General_Jeff 0:86d8b8db5c66 4 AnalogIn y(PTB3);//entrada analoga
General_Jeff 0:86d8b8db5c66 5 AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer
General_Jeff 0:86d8b8db5c66 6 //si se ignora esto se arruina la FRDMKL25Z
General_Jeff 0:86d8b8db5c66 7 PwmOut up(PTE20);//Salida pwm
General_Jeff 0:86d8b8db5c66 8
General_Jeff 0:86d8b8db5c66 9 Serial pc(USBTX, USBRX, "pc");
General_Jeff 0:86d8b8db5c66 10
General_Jeff 0:86d8b8db5c66 11 char buffer[128];
General_Jeff 0:86d8b8db5c66 12 int readptr = 0;
General_Jeff 0:86d8b8db5c66 13 float pid,o,ai,ad,ap,med,err;
General_Jeff 0:86d8b8db5c66 14 float err_v;
General_Jeff 0:86d8b8db5c66 15 int sp=0,ki=0,kp=0,kd=0,ns,ni,np,nd;
General_Jeff 0:86d8b8db5c66 16 int count;
General_Jeff 0:86d8b8db5c66 17 int i = 0;
General_Jeff 0:86d8b8db5c66 18
General_Jeff 0:86d8b8db5c66 19 void cleanBuffer(char *buffer, int count) //esta funcion limpia el bufer
General_Jeff 0:86d8b8db5c66 20 {
General_Jeff 0:86d8b8db5c66 21 for(int i=0; i < count; i++) {
General_Jeff 0:86d8b8db5c66 22 buffer[i] = '\0';
General_Jeff 0:86d8b8db5c66 23 }
General_Jeff 0:86d8b8db5c66 24 }
General_Jeff 0:86d8b8db5c66 25
General_Jeff 0:86d8b8db5c66 26
General_Jeff 0:86d8b8db5c66 27 int main()
General_Jeff 0:86d8b8db5c66 28 {
General_Jeff 0:86d8b8db5c66 29 lop0:
General_Jeff 0:86d8b8db5c66 30 char c;
General_Jeff 0:86d8b8db5c66 31 pc.printf("****************************************************************\n");
General_Jeff 0:86d8b8db5c66 32 pc.printf("* Menu: *\n");
General_Jeff 0:86d8b8db5c66 33 pc.printf("* Para ingresar constantes del PID, escribir 'write' *\n");
General_Jeff 0:86d8b8db5c66 34 pc.printf("* y seguir las instrucciones. *\n");
General_Jeff 0:86d8b8db5c66 35 pc.printf("* Para finalizar la toma de datos, escribir 's'. *\n");
General_Jeff 0:86d8b8db5c66 36 pc.printf("****************************************************************\n");
General_Jeff 0:86d8b8db5c66 37 readptr=0;
General_Jeff 0:86d8b8db5c66 38
General_Jeff 0:86d8b8db5c66 39
General_Jeff 0:86d8b8db5c66 40
General_Jeff 0:86d8b8db5c66 41 while( (c = pc.getc()) != '\n') //Mientras que lo que lea (que se almacena en c) sea diferente de 'nada, vacio', me meta las variables en el buffer(?)
General_Jeff 0:86d8b8db5c66 42 {
General_Jeff 0:86d8b8db5c66 43 buffer[readptr++] = c;
General_Jeff 0:86d8b8db5c66 44 }
General_Jeff 0:86d8b8db5c66 45 buffer[readptr++] = 0; //Me separa los caracteres ingresados (como une espacio), para saber cuando meto dos frases diferentes.
General_Jeff 0:86d8b8db5c66 46
General_Jeff 0:86d8b8db5c66 47 if (strncmp(buffer, "write", 5) == 0){
General_Jeff 0:86d8b8db5c66 48 // perform write
General_Jeff 0:86d8b8db5c66 49 pc.printf("Ingresar el Set Point\t");
General_Jeff 0:86d8b8db5c66 50 cleanBuffer(buffer,4);
General_Jeff 0:86d8b8db5c66 51 pc.scanf("%d", &sp);
General_Jeff 0:86d8b8db5c66 52 ns=sp/sp;
General_Jeff 0:86d8b8db5c66 53 if(ns!=1){
General_Jeff 0:86d8b8db5c66 54 pc.printf("Hay un error en los parametros\n");
General_Jeff 0:86d8b8db5c66 55 goto lop0;
General_Jeff 0:86d8b8db5c66 56 }
General_Jeff 0:86d8b8db5c66 57 pc.printf("Ingresar la constante proporcional\t");
General_Jeff 0:86d8b8db5c66 58 cleanBuffer(buffer,4);
General_Jeff 0:86d8b8db5c66 59 pc.scanf("%d", &kp);
General_Jeff 0:86d8b8db5c66 60 np=kp/kp;
General_Jeff 0:86d8b8db5c66 61 if(np!=1){
General_Jeff 0:86d8b8db5c66 62 pc.printf("Hay un error en los parametros\n");
General_Jeff 0:86d8b8db5c66 63 goto lop0;
General_Jeff 0:86d8b8db5c66 64 }
General_Jeff 0:86d8b8db5c66 65 pc.printf("Ingresar la constante derivativa\t");
General_Jeff 0:86d8b8db5c66 66 cleanBuffer(buffer,4);
General_Jeff 0:86d8b8db5c66 67 pc.scanf("%d", &kd);
General_Jeff 0:86d8b8db5c66 68 nd=kd/kd;
General_Jeff 0:86d8b8db5c66 69 if(nd!=1){
General_Jeff 0:86d8b8db5c66 70 pc.printf("Hay un error en los parametros\n");
General_Jeff 0:86d8b8db5c66 71 goto lop0;
General_Jeff 0:86d8b8db5c66 72 }
General_Jeff 0:86d8b8db5c66 73 pc.printf("Ingresar la constante integral\t");
General_Jeff 0:86d8b8db5c66 74 cleanBuffer(buffer,4);
General_Jeff 0:86d8b8db5c66 75 pc.scanf("%d", &ki);
General_Jeff 0:86d8b8db5c66 76 ni=ki/ki;
General_Jeff 0:86d8b8db5c66 77 if(ni!=1){
General_Jeff 0:86d8b8db5c66 78 pc.printf("Hay un error en los parametros\n");
General_Jeff 0:86d8b8db5c66 79 goto lop0;
General_Jeff 0:86d8b8db5c66 80 }
General_Jeff 0:86d8b8db5c66 81 pc.printf("Parametros completos\n");
General_Jeff 0:86d8b8db5c66 82 pc.printf("Iniciando...\n");
General_Jeff 0:86d8b8db5c66 83 wait(2);
General_Jeff 0:86d8b8db5c66 84 }
General_Jeff 0:86d8b8db5c66 85 readptr=0;
General_Jeff 0:86d8b8db5c66 86
General_Jeff 0:86d8b8db5c66 87
General_Jeff 0:86d8b8db5c66 88 // CICLO PRINCIPAL CONTROLADOR PID
General_Jeff 0:86d8b8db5c66 89 lop1:
General_Jeff 0:86d8b8db5c66 90 med = y.read()*999;
General_Jeff 0:86d8b8db5c66 91 err = (sp-med); //se calcula el error
General_Jeff 0:86d8b8db5c66 92 ap = kp*err*0.01f; //se calcula la accion proporcinal
General_Jeff 0:86d8b8db5c66 93 ai =(ki*err*0.01f)+ai; //calculo de la integral del error
General_Jeff 0:86d8b8db5c66 94 ad = kd*(err-err_v)*0.01f; //calculo de la accion derivativa
General_Jeff 0:86d8b8db5c66 95 pid = (ap+ai+ad);
General_Jeff 0:86d8b8db5c66 96 readptr=0;
General_Jeff 0:86d8b8db5c66 97 //se implementa la letra 's' para parar toma de datos
General_Jeff 0:86d8b8db5c66 98 if(pc.readable()){
General_Jeff 0:86d8b8db5c66 99 if((c=pc.getc())=='s'){
General_Jeff 0:86d8b8db5c66 100 buffer[readptr++]=c;
General_Jeff 0:86d8b8db5c66 101 }
General_Jeff 0:86d8b8db5c66 102 buffer[readptr++]=0;
General_Jeff 0:86d8b8db5c66 103 }
General_Jeff 0:86d8b8db5c66 104 if (strncmp(buffer, "s", 1) == 0){
General_Jeff 0:86d8b8db5c66 105 buffer[0]='\0';
General_Jeff 0:86d8b8db5c66 106 pc.printf("Finalizando...\n");
General_Jeff 0:86d8b8db5c66 107 wait_ms(100);
General_Jeff 0:86d8b8db5c66 108 goto lop0;
General_Jeff 0:86d8b8db5c66 109 }
General_Jeff 0:86d8b8db5c66 110 // se verifica que pid sea positivo **************************************
General_Jeff 0:86d8b8db5c66 111 if(pid<=0){
General_Jeff 0:86d8b8db5c66 112 pid=0;
General_Jeff 0:86d8b8db5c66 113 }
General_Jeff 0:86d8b8db5c66 114 // se verifica que pid sea menor o igual la valor maximo *****************
General_Jeff 0:86d8b8db5c66 115 if (pid > 999){
General_Jeff 0:86d8b8db5c66 116 pid=999;
General_Jeff 0:86d8b8db5c66 117 }
General_Jeff 0:86d8b8db5c66 118 //Normalizacion de la salida
General_Jeff 0:86d8b8db5c66 119 // se actualizan las variables *******************************************
General_Jeff 0:86d8b8db5c66 120 err_v = err;
General_Jeff 0:86d8b8db5c66 121 o = pid/999;
General_Jeff 0:86d8b8db5c66 122 u.write(o);
General_Jeff 0:86d8b8db5c66 123 up.write(o);
General_Jeff 0:86d8b8db5c66 124 // se envia el valor pid a puerto analogico de salida (D/A) **************
General_Jeff 0:86d8b8db5c66 125 pc.printf("Error=%3.0f\tSetPoint=%d\tSalida=%3.0f\tMed=%3.0f\n",err,sp,pid,med);
General_Jeff 0:86d8b8db5c66 126 // se repite el ciclo
General_Jeff 0:86d8b8db5c66 127 wait_ms(600);
General_Jeff 0:86d8b8db5c66 128 goto lop1;
General_Jeff 0:86d8b8db5c66 129
General_Jeff 0:86d8b8db5c66 130 }
General_Jeff 0:86d8b8db5c66 131