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: MODSERIAL QEI biquadFilter mbed
Fork of BioRobotics_Main by
Revision 1:d7299175a12e, committed 2017-11-02
- Comitter:
- CasperBerkhout
- Date:
- Thu Nov 02 08:57:41 2017 +0000
- Parent:
- 0:4141aef83f4b
- Child:
- 2:c7369b41f7ae
- Commit message:
- Homing and PI control working. Kinematics not active
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Nov 01 12:55:50 2017 +0000
+++ b/main.cpp Thu Nov 02 08:57:41 2017 +0000
@@ -22,15 +22,18 @@
DigitalOut M2_direction(D4);
AnalogIn potmeter(A0); //left pot
AnalogIn potmeter2(A1); //right pot
-InterruptIn button1(D2); //hardware interrupt for stopping motors
-DigitalIn LimSW1(D1);
-DigitalIn LimSW2(D0);
-DigitalIn HomStart(D3);
-Ticker motor_update;
+InterruptIn button1(D2); //hardware interrupt for stopping motors - right button
+DigitalIn LimSW1(D9);
+DigitalIn LimSW2(D8);
+DigitalIn HomStart(D3); // - left button
+
BiQuad bqlowpass(0, 0.611, 0.611, 1, 0.222);
//create scope objects - note: script won't run when HID usb port is not connected
//HIDScope scope(5); //set # of channels
-Ticker scopeTimer;
+
+Ticker motor_update1;
+Ticker motor_update2;
+Ticker error_update;
//-----------------variable decleration----------------
@@ -44,51 +47,63 @@
double M1_home;
double M1_error_pos = 0;
-float M1_Kp = 0.1;
-float M1_Ki = 0.1;
-float M1_Kd = 0.1;
+float M1_Kp = 2;
+float M1_Ki = 4;
+float M1_Kd = 0;
double M1_e_int=0;
double M1_e_prior=0;
double M2_home;
double M2_error_pos = 0;
-float M2_Kp = 0.1;
+float M2_Kp = 0.3;
float M2_Ki = 0.1;
-float M2_Kd = 0.1;
+float M2_Kd = 0;
double M2_e_int=0;
double M2_e_prior=0;
float Ts = 0.002; //500hz sample freq
-
+bool M1homflag;
+bool M2homflag;
+bool Homstartflag;
+
void homing_system () {
LimSW1.mode(PullDown);
LimSW2.mode(PullDown);
M1_speed.write(0);
M2_speed.write(0);
M1_direction.write(0);
- M2_direction.write(0);
+ M2_direction.write(1);
- while (true){
-
- if (HomStart == 0){
- M1_speed.write(0.1);
- }
-
- if (LimSW1 == 1){
- M1_speed.write(0);
- M2_speed.write(0.1);
- M1_home = enc1.getPulses()/32.0/131.25*2.0*3.1416; //in radians
- }
- if (LimSW2 == 1) {
- M2_speed.write(0);
- M2_home = enc2.getPulses()/32.0/131.25*2.0*3.1416; //in radians
- }
+ while(1){
+ if (HomStart.read() == 0){
+ M1_speed.write(0.4);
+ wait(0.5);
+ M2_speed.write(0.3);
+ pc.printf("starting M1 \n\r");
+ }
+ if(LimSW1.read() == 1){
+
+ M1_speed.write(0);
+ M1_home = enc1.getPulses()/32.0/131.25*2.0*3.1416; //in radians
+ }
+ if (LimSW2.read() == 1) {
+ M2_speed.write(0);
+
+ M2_home = enc2.getPulses()/32.0/131.25*2.0*3.1416; //in radians
+ }
- if (LimSW1 == 1 && LimSW2 ==1) {
+ if (LimSW1.read() == 1 && LimSW2.read() ==1) {
+ pc.printf("Homing finished \n\r");
+ M1_speed.write(0);
+ M2_speed.write(0);
+ wait(0.5);
+ M1_home = enc1.getPulses()/32.0/131.25*2.0*3.1416; //in radians
+ M2_home = enc2.getPulses()/32.0/131.25*2.0*3.1416; //in radians
break;
- }
-}
+ }
+ }
+
}
@@ -121,6 +136,7 @@
M1_direction.write(1);
}
else{M1_speed.write(0);}
+ pc.printf("Motor1 set speed = %f \n\r",set_speed);
}
void M2_control(){
@@ -158,13 +174,15 @@
double M2_actual_pos = Arm2_home + (M2_rel_pos - M2_home)/2; //!!!!!!!Gearing ratio of timing belt = 2!!!!!!!!!!
double q1 = M1_actual_pos;
- double q2 = 3.1416-M1_acual_pos-M2_actual_pos //see drawing
+ double q2 = 3.1416-M1_actual_pos-M2_actual_pos; //see drawing
- double M1_reference_pos = potmeter.read();
- double M2_reference_pos = potmeter2.read();
+ //double M1_reference_pos = 1+potmeter.read()*0.5*3.1416; //should cover the right range - radians
+ double M1_reference_pos = 0.5*3.1416; //should cover the right range - radians
+ double M2_reference_pos = 0.5+potmeter2.read()*0.25*3.1416;
M1_error_pos = M1_reference_pos - M1_actual_pos;
- M2_error_pos = M2_reference_pos - M2_actual_pos;
+ //M2_error_pos = M2_reference_pos - M2_actual_pos;
+ M2_error_pos = 0;
}
int main() {
@@ -173,19 +191,18 @@
M1_speed.period(1.0/pwm_freq);
M2_speed.period(1.0/pwm_freq);
pc.baud(115200);
+pc.printf("starting homing function now. Push button to start procedure \n\r");
//commence homing procedure
homing_system();
+pc.printf("Setting home position complete\n\r");
//attach all interrupt
+pc.printf("attaching interrupt tickers now \n\r");
button1.fall(StopMotors); //stop motor interrupt
-motor_update.attach(&M1_control, &M2_control,0.01);
-//motor_update.attach(&M2_control,0.01);
-
+motor_update1.attach(&M1_control,0.01);
+motor_update2.attach(&M2_control,0.01);
+error_update.attach(&geterror,0.01);
-
-
-
-
-pc.printf("initialization complete \n\r");
+pc.printf("initialization complete - position control of motors now active\n\r");
while(1){
--- a/mbed.bld Wed Nov 01 12:55:50 2017 +0000 +++ b/mbed.bld Thu Nov 02 08:57:41 2017 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/mbed_official/code/mbed/builds/aae6fcc7d9bb \ No newline at end of file +https://os.mbed.com/users/mbed_official/code/mbed/builds/fb8e0ae1cceb \ No newline at end of file
