逸倫零力矩

Dependencies:   MX28 PID mbed

Fork of Torque_Control_Current by YiLun Cheng

Files at this revision

API Documentation at this revision

Comitter:
JJting
Date:
Thu Aug 23 06:44:19 2018 +0000
Parent:
0:5ab373bcfe6d
Commit message:
for SEA

Changed in this revision

Torque_Control_Current.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Torque_Control_Current.cpp	Mon Jul 23 08:36:38 2018 +0000
+++ b/Torque_Control_Current.cpp	Thu Aug 23 06:44:19 2018 +0000
@@ -17,11 +17,12 @@
 float Ts = ITR_time/1000000;
 
 // PID
-PID motor_pid(7.2, 0, 0.13, Ts);// 6.4 0.13   7.2 0.13
+PID motor_pid(7.2, 0, 0, Ts);// 6.4 0.13   7.2 0.13
 float PIDout = 0.0f;
 // Pin
 Serial pc(USBTX, USBRX);
 SPI spi(D4, D5, D3); // mosi, miso, sclk
+//SPI spi(D11, D12, D13); // mosi, miso, sclk
 DigitalOut encoder_cs(D9);
 DigitalOut LED(A4);
 AnalogIn Value(A5);
@@ -30,11 +31,12 @@
 unsigned short encoder_value = 0;
 unsigned short angle = 0;
 unsigned short angle_old = 0;
-unsigned short angle_init ;
+unsigned short angle_init;
 
 // Dynamixel
 DynamixelClass dynamixelClass(SERVO_SET_Baudrate,SERVO_ControlPin,TxPin,RxPin);
 int servo_cmd;
+int row_cmd;
 int theta_l;
 bool servo_dir;
 int omega;
@@ -73,7 +75,7 @@
     char C[2];
     // C[0] is lowbyte of j, C[1] is highbyte of j
 };
-char T[10] = {255,255,0,0,0,0,0,0,0,0};
+char T[16] = {255,255,0,0,0,0,0,0,0,0,0,0,0,0};
 
 int i = 0;
 int j = 0;
@@ -106,8 +108,8 @@
     wait_ms(500);
     LED = 0;
     init_TIMER();
-    
-    
+
+
     while(1) {
     }
 }
@@ -119,7 +121,9 @@
 
 void init_TIMER()
 {
+    LED = 1;
     timer1.attach_us(&timer1_ITR, ITR_time); // the address of the function to be attached (timer1_ITR) and the interval (1000 micro-seconds)
+    LED = 0;
 }
 
 void init_SPI()
@@ -135,9 +139,14 @@
 void init_position()
 {
 
-    angle_init = 2038;
-    
-    wait_ms(1000);    
+//    angle_init = 2038;
+    encoder_cs = 0;  // Select the device by seting chip select low
+
+    encoder_value = spi.write(0x00);
+    angle_init = encoder_value >> 3;
+
+    encoder_cs = 1;  // Deselect the device
+    wait_ms(1000);
 }
 void init_DYNAMIXEL()
 {
@@ -146,7 +155,7 @@
 }
 
 void timer1_ITR()
-{   
+{
 
     angle_measured();
     find_torque();
@@ -167,29 +176,35 @@
         if (servo_cmd >= 2047)
             servo_cmd = 2047;
     }
-    dynamixelClass.torque(SERVO_ID, servo_cmd);
+
+    if (servo_cmd >= 1023) {
+        row_cmd = -(servo_cmd-1023);
+    } else {
+        row_cmd = servo_cmd;
+    }
+    dynamixelClass.torque(SERVO_ID, 0);
 //    wait_ms(1);
 //    speed = dynamixelClass.readSpeed(SERVO_ID);
     UART_TX();
 }
 
 void angle_measured()
-{   
+{
     Angle_old = Angle;
-    
+
     encoder_cs = 0;  // Select the device by seting chip select low
-    
+
     encoder_value = spi.write(0x00);
     angle = encoder_value >> 3;
-    
+
     encoder_cs = 1;  // Deselect the device
     D_angle = dynamixelClass.readPosition(SERVO_ID);
-    
+
     angle_dif = relative_angle(angle,angle_init);
-    D_angle_dif = relative_angle(D_angle,D_angle_init);;
-    
+    D_angle_dif = relative_angle(D_angle,D_angle_init);
+
     Angle = -(D_angle_dif)+angle_dif;
-    
+
 }
 
 int relative_angle(unsigned int pos,unsigned int init_pos)
@@ -202,12 +217,12 @@
         angle_dif = -(-4096-(angle_dif));
     else
         angle_dif = angle_dif;
-    
+
     return angle_dif;
 }
 
 void find_torque()
-{                
+{
     angle_difference = angle_dif/4096.0f*2*PI;
     torque_measured = angle_difference*ks;
 }
@@ -220,13 +235,19 @@
     splitter splitter2;
     splitter splitter3;
     splitter splitter4;
+    splitter splitter5;
+    splitter splitter6;
+    splitter splitter7;
 
     //數值範圍:-32768~32768
-    splitter1.j = torque_ref*1000;
+    splitter1.j = row_cmd*100;
     splitter2.j = torque_measured*1000;
-    splitter3.j = servo_cmd;
-    splitter4.j = 0;
-
+//    splitter2.j = D_angle;
+    splitter3.j = D_angle;
+    splitter4.j = angle;
+    splitter5.j = angle_init;
+    splitter6.j = angle_dif;
+    splitter7.j = 1;
 
     T[2] = splitter1.C[0];
     T[3] = splitter1.C[1];
@@ -236,13 +257,18 @@
     T[7] = splitter3.C[1];
     T[8] = splitter4.C[0];
     T[9] = splitter4.C[1];
-
+    T[10] = splitter5.C[0];
+    T[11] = splitter5.C[1];
+    T[12] = splitter6.C[0];
+    T[13] = splitter6.C[1];
+    T[14] = splitter7.C[0];
+    T[15] = splitter7.C[1];
     while (1) {
         if (pc.writeable() == 1) {
             pc.putc(T[i]);
             i++;
         }
-        if (i>9) {
+        if (i>15) {
             i = 0;
             break;
         }