isra ceron
/
control_PID_m01
código de control de un sistema mecatrónico
main.cpp
- Committer:
- icmembed
- Date:
- 2019-09-03
- Revision:
- 0:cf1a10a72034
File content as of revision 0:cf1a10a72034:
#include "mbed.h" #include "math.h" PwmOut mypwm(D5); PwmOut PWM(D3); PwmOut PWM1(D4); Serial pc(SERIAL_TX, SERIAL_RX); AnalogIn analog_value(A0); AnalogIn retro(A5); DigitalOut led(LED1); double KP=0.4027; double KI =0.01; double KD1 =0.2276; double KD2 =0.02283; double REF = 0.6; float Apid=0; float T = 0.3; // PID double IT_1=0; double DT_1=0; double UT_1=0; double YT_1=0; double YT; double UT; double KP1 =0.2; double PT; double IT = 0; double Ti =0.9; //0.017; double Td =0.9; //0.017; double N =30; double DT =0; double PID =0; int k=0; int analogPin = 0; volatile float valor=0; int ledPin = 10; int voo=0; //float error =0; double KPin; double KIin; double KDin; double ERROR1; double PT2; double E; double ET; double ET1; double ET2; double ET3; double VT; double VT1; float precio = 12.34; int pesos; float centavos; int Ient; int main() { PWM.period_ms(17); PWM1.period_ms(17); pc.printf("This program tiene la referencia %f .\n", REF); pc.printf("\r"); // printf("\nAnalogIn example\n"); while(1) { YT = retro.read(); UT = REF; E = (UT-YT); ET = E; VT = KP*(ET-ET1)+((KD1/T)*(ET-2*ET1+ET2))+((KD2/(T*T))*(ET-3*ET1+3*ET2-ET3))+KI*T*ET+VT1; VT1=VT; ET3= ET2; ET2=ET1; ET1 = ET; //PT= KP*(UT-YT); // IT = KI*T*(UT_1-YT_1)+IT_1; //DT= (KD/T)*(UT-YT+YT_1-UT_1); //PID= PT+IT+DT; //YT_1=YT; //UT_1=UT; //IT_1=IT; Apid = abs(VT); Ient =(int) Apid; pc.printf("\n\n"); pc.printf("retro %lf.\t", YT); pc.printf("Error %lf. \t", E); pc.printf("referencia %f.\t", REF); pc.printf("PID %f.\t", VT); pc.printf("Absoluto %f.\t", Apid); pc.printf("\r"); if( E > 0.02 && Apid < 1 ) { PWM.write(Apid); PWM1.write(0.0f); } else if ( E < -0.02 && Apid < 1 ) { PWM.write(0.0f); PWM1.write(Apid); } else if ( E > 0.0 && E < 0.02 ){ VT1 = VT; KP=0; KI=0; KD1=0; KD1=0; PWM.write(Apid); //PWM.write(0.21); PWM1.write(0.0f); } wait_ms(10); // 200 ms } }