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: Encoder HIDScope MODSERIAL QEI TextLCD biquadFilter mbed
Fork of 2MotorPID by
Revision 0:46cf63cba59a, committed 2017-11-01
- Comitter:
- bako
- Date:
- Wed Nov 01 09:47:36 2017 +0000
- Child:
- 1:864a5f8bb886
- Commit message:
- it works for 2 motors, angle increments go in different directions for the arms
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Encoder.lib Wed Nov 01 09:47:36 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/vsluiter/code/Encoder/#18b000b443af
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QEI.lib Wed Nov 01 09:47:36 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/aberk/code/QEI/#5c2ad81551aa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Nov 01 09:47:36 2017 +0000
@@ -0,0 +1,102 @@
+/*
+* Parts of the code copied from PES lecture slides
+*/
+
+// include all necessary libraries
+#include "mbed.h"
+#include "QEI.h"
+
+//intialize all pins
+PwmOut motor1(D5);
+PwmOut motor2(D6);
+DigitalOut motor1Dir(D4); // direction of motor 1 (1 is ccw 0 is cw (looking at the shaft from the front))
+DigitalOut motor2Dir(D7); // direction of motor 2 (1 is ccw 0 is cw (looking at the shaft from the front))
+QEI motor1Encoder (D10,D11, NC, 624,QEI::X4_ENCODING);
+QEI motor2Encoder (D12,D13, NC, 624,QEI::X4_ENCODING);
+DigitalIn button1(D8); //button to move cw
+DigitalIn button2(D9); //button to move ccw
+
+//initialize variables
+double angleIncrement = 0.036; // increment of angle when button pressed (1 is a whole rotation (360 degrees))
+
+const double motor1KP=1.3; //Proportional gain of motor1 PI control
+const double motor1KI=0.5; //Integral gain of motor1 PI control
+const double motor1KD=0.5; // Differential gain of motor1 PID control
+
+const double motor2KP=1.3; //Proportional gain of motor1 PI control
+const double motor2KI=0.5; //Integral gain of motor1 PI control
+const double motor2KD=0.5; // Differential gain of motor1 PID control
+
+const double N=100; //LP filter coefficient
+const double encoderToMotor= 0.000119047619047619; //proportion of the rotation of the motor to the rotation of the encoder
+const double controllerTickerTime=0.01; //ticker frequency
+
+double motor1ErrorInt=0; //error of motor1 for the integrating part of PI controller
+double motor1ErrorDif=0; //error of motor1 for the integrating part of PI controller
+double desiredPos1 =0; //desired position of motor1
+
+double motor2ErrorInt=0; //error of motor1 for the integrating part of PI controller
+double motor2ErrorDif=0; //error of motor1 for the integrating part of PI controller
+double desiredPos2 =0; //desired position of motor1
+//initialize ticker for checking and correcting the angle
+Ticker myControllerTicker;
+
+
+double PIDController(double error, const double Kp, const double Ki, const double Kd, double Ts, const double N,double &intError, double &DifError){
+ const double a1 = -4/(N*Ts+2);
+ const double a2 = -(N*Ts-2)/(N*Ts+2);
+ const double b0 = (4*Kp + 4*Kd*N + 2*Ki*Ts + 2*Kp*N*Ts + Ki*N*pow(Ts,2))/(2*N*Ts + 4);
+ const double b1 = (Ki*N*pow(Ts,2) - 4*Kp - 4*Kd*N)/(N*Ts + 2);
+ const double b2 = (4*Kp + 4*Kd*N - 2*Ki*Ts - 2*Kp*N*Ts + Ki*N*pow(Ts,2))/(2*N*Ts + 4);
+
+ double v = error - a1*intError - a2*DifError;
+ double u = b0*v + b1*intError + b2*DifError;
+ DifError = intError; intError = v;
+ return u;
+}
+
+
+void motorButtonController(){
+ double position1= encoderToMotor*motor1Encoder.getPulses();
+ double posError1 = desiredPos1 - position1;
+
+ //change direction based on error sign
+ if(PIDController( posError1, motor1KP, motor1KI,motor1KD, controllerTickerTime, N, motor1ErrorInt ,motor1ErrorDif)>0) {
+ motor1Dir=0;
+ } else {
+ motor1Dir =1;
+ }
+ //set motor speed based on PI controller error
+ motor1 = fabs(PIDController( posError1, motor1KP, motor1KI,motor1KD, controllerTickerTime, N, motor1ErrorInt ,motor1ErrorDif));
+
+ double position2= encoderToMotor*motor2Encoder.getPulses();
+ double posError2 = desiredPos2 - position2;
+
+ //change direction based on error sign
+ if(PIDController( posError2, motor2KP, motor2KI,motor2KD, controllerTickerTime, N, motor2ErrorInt ,motor2ErrorDif)>0) {
+ motor2Dir=0;
+ } else {
+ motor2Dir =1;
+ }
+ //set motor speed based on PI controller error
+ motor2 = fabs(PIDController( posError2, motor2KP, motor2KI,motor2KD, controllerTickerTime, N, motor2ErrorInt ,motor2ErrorDif));
+
+}
+
+int main(){
+ wait(2);
+ myControllerTicker.attach(&motorButtonController, controllerTickerTime);
+ while(1) {
+ if(!button1) {
+ desiredPos1+=angleIncrement;
+ desiredPos2-=angleIncrement;
+ wait(0.5f);
+ }
+
+ if(!button2) {
+ desiredPos1-=angleIncrement;
+ desiredPos2+=angleIncrement;
+ wait(0.5f);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Nov 01 09:47:36 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/fb8e0ae1cceb \ No newline at end of file
