Eki Liptiay
/
PseudoScript
ja
main.cpp
- Committer:
- ekiliptiay
- Date:
- 2018-10-30
- Revision:
- 0:8f027052f23a
File content as of revision 0:8f027052f23a:
#include "mbed.h" // Load all the necessary pins, buttons, etc. // Load all the EMGs AnalogIn EMG1; // Move X AnalogIn EMG2; // Move Y AnalogIn EMG3; // Change direction // Initiate motor 1 PwmOut pwmpin1(D6); DigitalOut directionpin1(D7); InterruptIn motor1A(D12); // Encoder 1a InterruptIn motor1B(D13); // Encoder 1b QEI Encoder1(D12,D13,NC,64); // Note that we use X2 encoding, so there are 4200 counts/rotation, as opposed to 8400 from the documentation. // Initiate motor 2 DigitalOut directionpin2(D4); PwmOut pwmpin2(D5); InterruptIn motor2A(D10); // Encoder 1a InterruptIn motor2B(D11); // Encoder 1b QEI Encoder2(D10,D11,NC,64); // Note that we use X2 encoding, so there are 4200 counts/rotation, as opposed to 8400 from the documentation. // -------------------------------------------------------------------------- \\ double FilterEMG1(EMG1){ filter emg1 return filteredemg1 } double FilterEMG2(EMG2){ filter emg2 return filteredemg2 } double FilterEMG3(EMG3){ filter emg3 return filteredemg3 } // ----------------------Read & relate the emgs --------------------------- \\ // We want to know whether we should move X or Y bool DirBool = 1; // initialise with moving X void ChangeDir(emg3 lezen){ // Read EMG 3 if(voldoet emg3 aan de voorwaarde? verander dan de x/y bool.){ DirBool = !DirBool; return DirBool; } // Start moving in the x-direction void MoveX(bool DirBool, EMG1){ // first, we check whether or not we should even move in the x-direction if(DirBool == 1){ // We can move in the x-direction if this is true // we make a list of 2 long, checking emg 1 and 2 *list* check whether emg 1 is active or not if(emg1 voldoet aan statement){ request a change in motor angle // could be done by saying motorangle = motorangle - something we want, check convention!!! } if(emg2 voldoet aan statement){ request a change in motor angle // could be done by saying motorangle = motorangle - something we want, check convention!!! } return de angle die we willen veranderen voor de motoren } // When we should move, we should relate this change in x-direction to a change // in the motor angles, this comes from the inverse kinematics. void MoveY(bool DirBool, EMG1){ // first, we check whether or not we should even move in the y-direction if(DirBool == 0){ // We can move in the y-direction if this is true // we make a list of 2 long, checking emg 1 and 2 *list* check whether emg 1 is active or not if(emg1 voldoet aan statement){ request a change in motor angle // could be done by saying motorangle = motorangle - something we want, check convention!!! } if(emg2 voldoet aan statement){ request a change in motor angle // could be done by saying motorangle = motorangle - something we want, check convention!!! } return de angle die we willen veranderen voor de motoren } // When we should move, we should relate this change in y-direction to a change // in the motor angles, this comes from the inverse kinematics. // ----------Set the desired motor positions & get the actual ones---------- \\ // Get position motor 1 should be in double GetReferencePosition1(){ return ReferencePosition1; } // Get position motor 1 actually is in double GetActualPosition1(){ double ActualPosition = Encoder1.getPulses(); // Gets the actual amount of counts from motor 1. Note the minus sign for convention (CCW = positive counts.) return ActualPosition1; } // Get position motor 2 should be in double GetReferencePosition2(){ return ReferencePosition2; } // Get position motor 2 actually is in double GetActualPosition2(){ double ActualPosition2 = Encoder2.getPulses(); // Gets the actual amount of counts from motor 1. Note the minus sign for convention (CCW = positive counts.) return ActualPosition2; } // PID controller for motor 1 double PID_controller1(double error){ static double error_integral = 0; static double error_prev = error; // initialization with this value only done once! static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); double Ts = 0.01; // Proportional part double Kp = 0.1; double u_k = Kp*error; // Integral part double Ki = 0.1; error_integral = error_integral + error * Ts; double u_i = Ki * error_integral; // Derivative part double Kd = 10.1; double error_derivative = (error - error_prev)/Ts; double filtered_error_derivative = LowPassFilter.step(error_derivative); double u_d = Kd * filtered_error_derivative; error_prev = error; // Sum all parts and return it return u_k + u_i + u_d; } // PID controller for motor 2 double PID_controller2(double error){ static double error_integral = 0; static double error_prev = error; // initialization with this value only done once! static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); double Ts = 0.01; // Proportional part double Kp = 0.1; double u_k = Kp*error; // Integral part double Ki = 0.1; error_integral = error_integral + error * Ts; double u_i = Ki * error_integral; // Derivative part double Kd = 10.1; double error_derivative = (error - error_prev)/Ts; double filtered_error_derivative = LowPassFilter.step(error_derivative); double u_d = Kd * filtered_error_derivative; error_prev = error; // Sum all parts and return it return u_k + u_i + u_d; } void SetMotor1(double motorValue){ // Given -1<=motorValue<=1, this sets the PWM and direction // bits for motor 1. Positive value makes motor rotating // ccw. motorValues outside range are truncated to // within range if (motorValue >=0) directionpin1=1; else directionpin1=0; if (fabs(motorValue)>1) pwmpin1 = 1; else pwmpin1 = fabs(motorValue); } void SetMotor2(double motorValue){ // Given -1<=motorValue<=1, this sets the PWM and direction // bits for motor 1. Positive value makes motor rotating // ccw. motorValues outside range are truncated to // within range if (motorValue >=0) directionpin2=1; else directionpin2=0; if (fabs(motorValue)>1) pwmpin2 = 1; else pwmpin2 = fabs(motorValue); } int main() { while (true) { } }