Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FastPWM mbed QEI biquadFilter HIDScope MODSERIAL
main.cpp
- Committer:
- efvanmarrewijk
- Date:
- 2018-10-29
- Revision:
- 25:76e9e5597416
- Parent:
- 24:d255752065d1
- Child:
- 26:b48708ed51ff
File content as of revision 25:76e9e5597416:
// Inclusion of libraries #include "mbed.h" #include "FastPWM.h" #include "QEI.h" // Includes library for encoder #include "MODSERIAL.h" #include "HIDScope.h" #include "BiQuad.h" // Input AnalogIn pot1(A1); AnalogIn pot2(A2); InterruptIn button1(D0); InterruptIn button2(D1); InterruptIn emergencybutton(SW2); /* This is not yet implemented! The button SW2 on the K64F is the emergency button: if you press this, everything will abort as soon as possible */ DigitalIn pin8(D8); // Encoder 1 B DigitalIn pin9(D9); // Encoder 1 A DigitalIn pin10(D10); // Encoder 2 B DigitalIn pin11(D11); // Encoder 2 A DigitalIn pin12(D12); // Encoder 3 B DigitalIn pin13(D13); // Encoder 3 A // Output DigitalOut pin2(D2); // Motor 3 direction FastPWM pin3(D3); // Motor 3 pwm DigitalOut pin4(D4); // Motor 2 direction FastPWM pin5(D5); // Motor 2 pwm FastPWM pin6(D6); // Motor 1 pwm DigitalOut pin7(D7); // Motor 1 direction //float u1 = pot1; // Utilisation of libraries MODSERIAL pc(USBTX, USBRX); QEI Encoder1(D11,D10,NC,4200); // Counterclockwise motor rotation is the positive direction QEI Encoder2(D9,D8,NC,4200); // Counterclockwise motor rotation is the positive direction QEI Encoder3(D13,D12,NC,4200); // Counterclockwise motor rotation is the positive direction Ticker motor; Ticker encoders; // Global variables const float pi = 3.14159265358979; float u3 = 0.0; // Normalised variable for the movement of motor 3 const float fCountsRad = 4200.0; const double dt = 0.01; double Kp = 17.5; // Functions float CurrentAngle(float counts) { float angle = ((float)counts*2.0*pi)/fCountsRad; while (angle > 2.0*pi) { angle = angle - 2.0*pi; } while (angle < -2.0*pi) { angle = angle + 2.0*pi; } return angle; } int Counts1input() { int counts1; counts1 = Encoder1.getPulses(); return counts1; } int Counts2input() { int counts2; counts2 = Encoder2.getPulses(); return counts2; } int Counts3input() { int counts3; counts3 = Encoder3.getPulses(); return counts3; } double Pcontroller(double yref,double CurAngle) { double error = yref - CurAngle; // Proportional part: double u_k = Kp * error; // Sum all parts and return it return u_k; } void turn1() { float u1 = 2.0*(pot2 - 0.5); // Normalised variable for the movement of motor 2 if (u1<0) { pin7 = true; } else if(u1>0) { pin7 = false; } double refvalue1 = fabs(u1); int counts1 = Counts1input(); float angle1 = CurrentAngle(counts1); pin6 = Pcontroller(refvalue1,angle1); //pc.printf("Counts1,2,3: %i Angle1,2,3: %f \r\n",counts1,angle1); } void turn2() /* Function for the movement of all motors, using the potmeters for the moving direction and speed of motor 1 and 2, and using button 1 and 2 on the biorobotics shield for the moving direction and speed of motor 3. */ { float u2 = 2.0*(pot1 - 0.5); // Normalised variable for the movement of motor 2 if (u2<0) { pin4 = true; } else if(u2>0) { pin4 = false; } double refvalue2 = fabs(u2); int counts2 = Counts2input(); float angle2 = CurrentAngle(counts2); pin5 = Pcontroller(refvalue2,angle2); //pc.printf("Counts1,2,3: %i Angle1,2,3: %f \r\n",counts1,angle1); } /*double RefVelocity(float pot) { // Returns reference velocity in rad/s. // Positive value means clockwise rotation. const float maxVelocity=8.4; // in rad/s of course! double RefVel; // in rad/s if (button1 == 1) { // Clockwise rotation RefVel = pot*maxVelocity; } else { // Counterclockwise rotation RefVel = -1*pot*maxVelocity; } return RefVel; } */ /* double ActualPosition(int counts, int offsetcounts) { // After calibration, the counts are returned to 0; double MotorPos = - (counts - offsetcounts) / dCountsRad; // minus sign to correct for direction convention return MotorPos; } */ // Main program int main() { pc.baud(115200); pin3.period(0.1); pin5.period(0.1); pin6.period(0.1); motor.attach(turn1,dt); //motor.attach(turn2,dt); while (true) { } }