hoi

Dependencies:   mbed QEI biquadFilter MODSERIAL

Revision:
0:4141aef83f4b
Child:
1:d7299175a12e
diff -r 000000000000 -r 4141aef83f4b main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 01 12:55:50 2017 +0000
@@ -0,0 +1,195 @@
+#include "QEI.h"
+#include "math.h"
+#include "mbed.h"
+//#include "HIDScope.h" //set mbed library version to 119 for HIDScope to work
+#include "MODSERIAL.h"
+#include "BiQuad.h"
+
+//left pot to set reference position.
+//right pot to set Kp, right pot sets Ki when (right)button is pressed down
+
+
+//--------------object creation------------------ 
+Serial pc(USBTX, USBRX);
+//Use X4 encoding.
+//QEI wheel(p29, p30, NC, 624, QEI::X4_ENCODING);
+//Use X2 encoding by default.
+QEI enc1(D13, D12, NC, 32); //enable the encoder
+QEI enc2(D15, D14, NC, 32); //enable the encoder
+PwmOut M1_speed(D6);
+PwmOut M2_speed(D5);
+DigitalOut M1_direction(D7);
+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;
+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;
+
+
+//-----------------variable decleration----------------
+int pwm_freq = 500;
+float set_speed;
+float reference_pos;
+
+
+float Arm1_home = 112.0/180.0*3.1416;//home position of large link attached to base in radians - 112 degrees
+float Arm2_home = 19.0/180.0*3.1416;//home position of small link attached to base
+
+double M1_home; 
+double M1_error_pos = 0;
+float M1_Kp = 0.1;
+float M1_Ki = 0.1;
+float M1_Kd = 0.1;
+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_Ki = 0.1;
+float M2_Kd = 0.1;
+double M2_e_int=0;
+double M2_e_prior=0;
+
+float Ts = 0.002; //500hz sample freq
+
+ 
+ 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);
+    
+    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
+            }
+            
+            if (LimSW1 == 1 && LimSW2 ==1) {
+                break;
+                }
+}
+}
+
+ 
+void kinemtaica(double q1, double q2, double vdx, double vdy, double &q1_new, double &q2_new){
+  double q1_dot = (2.5*cos(q1+q2))/(sin(q2)) *vdx + (2.5*sin(q1+q2))/(sin(q2))*vdy;
+  double q2_dot = -(0.3*cos(q1+q2)+0.4*cos(q1))/(0.12*sin(q2))*vdx -(0.3*sin(q1+q2)+0.4*sin(q2))/(0.12*sin(q2))*vdy;
+  q1_new = q1 +q1_dot*Ts;
+  q2_new = q2 +q2_dot*Ts;
+ return;
+}
+
+float PID(double e, const double Kp, const double Ki, const double Kd, double Ts, double &e_int, double &e_prior){ //PID calculator
+    e_int += Ts*e;
+    double e_diff = (e-e_prior)/Ts;
+    e_prior = e;
+    double e_diff_filter = bqlowpass.step(e_diff);
+    return(Kp*e+Ki*e_int+Kd*e_diff_filter);
+    }
+
+void M1_control(){
+    
+    //call PID func and set new motor speed
+    set_speed = PID(M1_error_pos,M1_Kp,M1_Ki,M1_Kd,Ts,M1_e_int,M1_e_prior);
+    if(set_speed > 0){
+     M1_speed.write(abs(set_speed));
+     M1_direction.write(0);
+     }
+    else if (set_speed < 0){
+     M1_speed.write(abs(set_speed));
+     M1_direction.write(1);
+     }
+    else{M1_speed.write(0);}
+ }
+ 
+ void M2_control(){
+    set_speed = PID(M2_error_pos,M2_Kp,M2_Ki,M2_Kd,Ts,M2_e_int,M2_e_prior);
+    if(set_speed > 0){
+     M2_speed.write(abs(set_speed));
+     M2_direction.write(0);
+     }
+    else if (set_speed < 0){
+     M2_speed.write(abs(set_speed));
+     M2_direction.write(1);
+     }
+    else{M2_speed.write(0);}       
+  }
+ 
+
+ 
+ void scopesend(){
+  
+     
+     
+     }
+ void StopMotors(){
+     while(1){
+         M1_speed.write(0);
+         M2_speed.write(0);
+         }
+    }
+ 
+void geterror(){ 
+    double M1_rel_pos = enc1.getPulses()/32.0/131.25*2.0*3.1416; //relative position in radians
+    double M2_rel_pos = enc2.getPulses()/32.0/131.25*2.0*3.1416; //relative position in radians
+    
+    double M1_actual_pos = Arm1_home + (M1_rel_pos - M1_home)/2; //!!!!!!!Gearing ratio of timing belt = 2!!!!!!!!!!
+    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 M1_reference_pos = potmeter.read();
+    double M2_reference_pos = potmeter2.read();
+        
+    M1_error_pos = M1_reference_pos - M1_actual_pos;
+    M2_error_pos = M2_reference_pos - M2_actual_pos;
+}
+ 
+int main() {
+    
+    //initialize serial comm and set motor PWM freq
+M1_speed.period(1.0/pwm_freq);
+M2_speed.period(1.0/pwm_freq);
+pc.baud(115200);
+//commence homing procedure
+homing_system();
+//attach all interrupt
+button1.fall(StopMotors);     //stop motor interrupt
+motor_update.attach(&M1_control, &M2_control,0.01);
+//motor_update.attach(&M2_control,0.01);
+
+
+
+
+
+
+pc.printf("initialization complete \n\r");
+    
+    while(1){   
+        
+     
+    }
+ 
+}
\ No newline at end of file