Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

Committer:
HestervdVen
Date:
Wed Oct 23 14:47:48 2019 +0000
Revision:
4:f6862a157db9
Parent:
3:750afb8580dd
Child:
5:3eace29679bc
Motor is aanstuurbaar door error in te typen. Reageert op CW en CCW rotatie.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobertoO 0:67c50348f842 1 #include "mbed.h"
RobertoO 1:b862262a9d14 2 #include "MODSERIAL.h"
HestervdVen 2:29daa03e4f62 3 #include "BiQuad.h"
HestervdVen 2:29daa03e4f62 4 #include <iostream>
HestervdVen 2:29daa03e4f62 5 #include "FastPWM.h"
HestervdVen 2:29daa03e4f62 6 #include "QEI.h"
HestervdVen 2:29daa03e4f62 7 #include <math.h>
HestervdVen 2:29daa03e4f62 8 //#include "HIDScope.h"
HestervdVen 2:29daa03e4f62 9
HestervdVen 2:29daa03e4f62 10
HestervdVen 2:29daa03e4f62 11 Serial pc(USBTX, USBRX);
HestervdVen 4:f6862a157db9 12 DigitalIn but_1(D1); //D1 to BUT1
HestervdVen 4:f6862a157db9 13 DigitalOut msignal_1(D6); //Signal to motor controller
HestervdVen 4:f6862a157db9 14 DigitalOut direction_1(D7); //ouput pin for direction of rotation
HestervdVen 2:29daa03e4f62 15
HestervdVen 4:f6862a157db9 16 //These seemed the best values after trying them out and using wikipedia's info
HestervdVen 4:f6862a157db9 17 const float k_p_1 = 1;
HestervdVen 4:f6862a157db9 18 const float k_i_1 = 1;
HestervdVen 4:f6862a157db9 19 const float k_d_1 = 0.1;
HestervdVen 4:f6862a157db9 20 const float t_s = 0.0025; //sample time in sec; same for both motors
HestervdVen 2:29daa03e4f62 21
HestervdVen 2:29daa03e4f62 22 //inputs for LPF; still to fill in!
HestervdVen 2:29daa03e4f62 23 float b1;
HestervdVen 2:29daa03e4f62 24 float b2;
HestervdVen 2:29daa03e4f62 25 float b3;
HestervdVen 2:29daa03e4f62 26 float b4;
HestervdVen 2:29daa03e4f62 27 float b5;
HestervdVen 2:29daa03e4f62 28
HestervdVen 4:f6862a157db9 29 float outcome_1 = 0;
HestervdVen 4:f6862a157db9 30 float setpoint_1;
HestervdVen 4:f6862a157db9 31 bool dir_1;
HestervdVen 4:f6862a157db9 32 bool moving_1 = false;
RobertoO 0:67c50348f842 33
HestervdVen 4:f6862a157db9 34 float getSetpoint_1(){
HestervdVen 2:29daa03e4f62 35 float a; //error
HestervdVen 3:750afb8580dd 36 cin >> a; //input on keyboard
HestervdVen 2:29daa03e4f62 37 return a;
HestervdVen 2:29daa03e4f62 38 }
HestervdVen 2:29daa03e4f62 39
HestervdVen 4:f6862a157db9 40 float getError_1(){
HestervdVen 4:f6862a157db9 41 float errorSum_1 = setpoint_1 - outcome_1;
HestervdVen 4:f6862a157db9 42 return errorSum_1;
HestervdVen 4:f6862a157db9 43 }
HestervdVen 4:f6862a157db9 44
HestervdVen 4:f6862a157db9 45 float checkMovement_1(){
HestervdVen 4:f6862a157db9 46 if (outcome_1 >= 1){
HestervdVen 4:f6862a157db9 47 dir_1 = true; //CCW
HestervdVen 4:f6862a157db9 48 moving_1 = true;
HestervdVen 4:f6862a157db9 49 pc.printf("Positive movement\r\n");
HestervdVen 4:f6862a157db9 50 }
HestervdVen 4:f6862a157db9 51 else if (outcome_1 <= -1){
HestervdVen 4:f6862a157db9 52 dir_1 = false; //CW
HestervdVen 4:f6862a157db9 53 moving_1 = true;
HestervdVen 4:f6862a157db9 54 pc.printf("Negative movement\r\n");
HestervdVen 4:f6862a157db9 55 }
HestervdVen 4:f6862a157db9 56 else{
HestervdVen 4:f6862a157db9 57 direction_1 = 0;
HestervdVen 4:f6862a157db9 58 moving_1 = false;
HestervdVen 4:f6862a157db9 59 pc.printf("No movement\r\n");
HestervdVen 4:f6862a157db9 60 }
HestervdVen 4:f6862a157db9 61 }
HestervdVen 2:29daa03e4f62 62
HestervdVen 4:f6862a157db9 63 void motor_1 (){ //runs the motor
HestervdVen 4:f6862a157db9 64
HestervdVen 4:f6862a157db9 65 if(moving_1){
HestervdVen 4:f6862a157db9 66 msignal_1 = 1; // Turn motor on
HestervdVen 4:f6862a157db9 67 }
HestervdVen 4:f6862a157db9 68 else{
HestervdVen 4:f6862a157db9 69 msignal_1 = 0; // Turn motor off
HestervdVen 4:f6862a157db9 70 }
HestervdVen 4:f6862a157db9 71
HestervdVen 4:f6862a157db9 72 }
HestervdVen 4:f6862a157db9 73
HestervdVen 4:f6862a157db9 74
HestervdVen 2:29daa03e4f62 75 /*PID controller code
HestervdVen 2:29daa03e4f62 76 Proportional part general formula: u_k = k_p * e
HestervdVen 2:29daa03e4f62 77 Integral part general formula: u_i = k_i * integral e dt
HestervdVen 2:29daa03e4f62 78 Derivative part general formula: u_d = k_d * derivative e */
HestervdVen 2:29daa03e4f62 79
HestervdVen 4:f6862a157db9 80 float PIDControl_1(float error){
HestervdVen 2:29daa03e4f62 81 static float error_integral = 0;
HestervdVen 2:29daa03e4f62 82 static float error_prev = error;
HestervdVen 2:29daa03e4f62 83 static BiQuad LPF (b1, b2, b3, b4, b5);
HestervdVen 2:29daa03e4f62 84
HestervdVen 2:29daa03e4f62 85 //proportional
HestervdVen 4:f6862a157db9 86 float u_k_1 = k_p_1 * error;
HestervdVen 2:29daa03e4f62 87
HestervdVen 2:29daa03e4f62 88 //integral
HestervdVen 2:29daa03e4f62 89 error_integral = error_integral + error * t_s;
HestervdVen 4:f6862a157db9 90 float u_i_1 = k_i_1 * error_integral;
HestervdVen 2:29daa03e4f62 91
HestervdVen 2:29daa03e4f62 92 //differential
HestervdVen 2:29daa03e4f62 93 float error_derivative = (error - error_prev) / t_s;
HestervdVen 2:29daa03e4f62 94 // float filtered_error = LPF.step(error_derivative); //LPF with function of BiQuad library
HestervdVen 4:f6862a157db9 95 // float u_d_1 = k_d_1 * filtered_error;
HestervdVen 4:f6862a157db9 96 float u_d_1 = k_d_1 * error_derivative; //this is very sensitive to noise, hence the LPF above
HestervdVen 2:29daa03e4f62 97 error_prev = error;
HestervdVen 2:29daa03e4f62 98
HestervdVen 4:f6862a157db9 99 return u_k_1 + u_i_1 + u_d_1;
HestervdVen 2:29daa03e4f62 100 }
HestervdVen 2:29daa03e4f62 101
HestervdVen 4:f6862a157db9 102
HestervdVen 4:f6862a157db9 103 int main(){
RobertoO 0:67c50348f842 104 pc.baud(115200);
HestervdVen 4:f6862a157db9 105 startmain:
HestervdVen 2:29daa03e4f62 106 pc.printf("--------\r\nWelcome!\r\n--------\r\n\n");
HestervdVen 4:f6862a157db9 107
RobertoO 0:67c50348f842 108
HestervdVen 4:f6862a157db9 109 while(true){
HestervdVen 2:29daa03e4f62 110 pc.printf("Please input your error.\r\n");
HestervdVen 4:f6862a157db9 111 //setpoint_1 = getSetpoint_1();
HestervdVen 4:f6862a157db9 112 //float err_1 = getError_1();
HestervdVen 4:f6862a157db9 113 float err_1 = getSetpoint_1();
HestervdVen 4:f6862a157db9 114 pc.printf("Your error is: %f\r\n",err_1);
HestervdVen 2:29daa03e4f62 115 pc.printf("-------\r\n-------\r\n");
HestervdVen 2:29daa03e4f62 116 wait(0.5);
HestervdVen 4:f6862a157db9 117 outcome_1 = PIDControl_1(err_1);
HestervdVen 4:f6862a157db9 118 pc.printf("The outcome is %f\r\n",outcome_1);
HestervdVen 4:f6862a157db9 119 direction_1 = dir_1;
HestervdVen 4:f6862a157db9 120 checkMovement_1();
HestervdVen 4:f6862a157db9 121 motor_1();
HestervdVen 2:29daa03e4f62 122
HestervdVen 2:29daa03e4f62 123
HestervdVen 4:f6862a157db9 124 //only works if error is constantly put in:
HestervdVen 4:f6862a157db9 125 // if (but_1==0){
HestervdVen 4:f6862a157db9 126 // goto startmain; //allows to input multiple numbers after each other
HestervdVen 4:f6862a157db9 127 // }
HestervdVen 3:750afb8580dd 128
HestervdVen 3:750afb8580dd 129
HestervdVen 4:f6862a157db9 130 }
RobertoO 0:67c50348f842 131 }