Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp
- Committer:
- HestervdVen
- Date:
- 2019-10-23
- Revision:
- 4:f6862a157db9
- Parent:
- 3:750afb8580dd
- Child:
- 5:3eace29679bc
File content as of revision 4:f6862a157db9:
#include "mbed.h" #include "MODSERIAL.h" #include "BiQuad.h" #include <iostream> #include "FastPWM.h" #include "QEI.h" #include <math.h> //#include "HIDScope.h" Serial pc(USBTX, USBRX); DigitalIn but_1(D1); //D1 to BUT1 DigitalOut msignal_1(D6); //Signal to motor controller DigitalOut direction_1(D7); //ouput pin for direction of rotation //These seemed the best values after trying them out and using wikipedia's info const float k_p_1 = 1; const float k_i_1 = 1; const float k_d_1 = 0.1; const float t_s = 0.0025; //sample time in sec; same for both motors //inputs for LPF; still to fill in! float b1; float b2; float b3; float b4; float b5; float outcome_1 = 0; float setpoint_1; bool dir_1; bool moving_1 = false; float getSetpoint_1(){ float a; //error cin >> a; //input on keyboard return a; } float getError_1(){ float errorSum_1 = setpoint_1 - outcome_1; return errorSum_1; } float checkMovement_1(){ if (outcome_1 >= 1){ dir_1 = true; //CCW moving_1 = true; pc.printf("Positive movement\r\n"); } else if (outcome_1 <= -1){ dir_1 = false; //CW moving_1 = true; pc.printf("Negative movement\r\n"); } else{ direction_1 = 0; moving_1 = false; pc.printf("No movement\r\n"); } } void motor_1 (){ //runs the motor if(moving_1){ msignal_1 = 1; // Turn motor on } else{ msignal_1 = 0; // Turn motor off } } /*PID controller code Proportional part general formula: u_k = k_p * e Integral part general formula: u_i = k_i * integral e dt Derivative part general formula: u_d = k_d * derivative e */ float PIDControl_1(float error){ static float error_integral = 0; static float error_prev = error; static BiQuad LPF (b1, b2, b3, b4, b5); //proportional float u_k_1 = k_p_1 * error; //integral error_integral = error_integral + error * t_s; float u_i_1 = k_i_1 * error_integral; //differential float error_derivative = (error - error_prev) / t_s; // float filtered_error = LPF.step(error_derivative); //LPF with function of BiQuad library // float u_d_1 = k_d_1 * filtered_error; float u_d_1 = k_d_1 * error_derivative; //this is very sensitive to noise, hence the LPF above error_prev = error; return u_k_1 + u_i_1 + u_d_1; } int main(){ pc.baud(115200); startmain: pc.printf("--------\r\nWelcome!\r\n--------\r\n\n"); while(true){ pc.printf("Please input your error.\r\n"); //setpoint_1 = getSetpoint_1(); //float err_1 = getError_1(); float err_1 = getSetpoint_1(); pc.printf("Your error is: %f\r\n",err_1); pc.printf("-------\r\n-------\r\n"); wait(0.5); outcome_1 = PIDControl_1(err_1); pc.printf("The outcome is %f\r\n",outcome_1); direction_1 = dir_1; checkMovement_1(); motor_1(); //only works if error is constantly put in: // if (but_1==0){ // goto startmain; //allows to input multiple numbers after each other // } } }