著名的MIT Cheetah Mini四足機器人開源了所有軟硬件,包括機載電腦和關節驅動器的軟硬件全部開源。這一篇就根據開源的驅動控制軟件及相關論文,探索其核心控制算法框架。這篇文章需要結合源代碼來看。
主要參考了lab 成員 Benjamin Katz 的論文《A low cost modular actuator for dynamic robots.》,以及公開的源代碼https://os.mbed.com/users/benkatz/code/Hobbyking_Cheetah_Compact_DRV8323/。
1. 驅動器狀態機
1.1 五種狀態
總共有這五種狀態:
-
#define REST_MODE 0
這個狀態下,調用一次enter_menu_state()函數,這個函數做的操作是:禁用驅動IC DRV832x、串口打印menu、led=0; -
#define CALIBRATION_MODE 1
這個狀態下運行一次calibrate()函數,這個函數做的操作是:使能驅動IC DRV832x、led=1、調用確定相序函數order_phase()、調用標定函數calibrate()、led=0、串口打印提示、禁用驅動IC DRV832x;
其中確定相序函數order_phase()和標定函數calibrate()具體實現後面再講; -
#define MOTOR_MODE 2
運行enter_torque_mode()函數一次,然後不斷循環torque_control()和commutate()函數,控制頻率爲40khz;
enter_torque_mode()函數主要是foc控制器的復位處理,具體操作是:使能驅動IC DRV832x、復位超壓標誌、調用reset_foc()函數復位foc控制器、led=1;
其中torque_control()和commutate()兩個函數是具體的FOC控制過程後面再講; -
#define SETUP_MODE 4
調用enter_setup_state()函數,該函數中通過串口打印Configuration Options; -
#define ENCODER_MODE 5
串口不斷打印機械位置、電氣位置和原始位置;
1.2 通過串口操作
在串口中斷中接收上位機發送過來的指令,根據不同的指令進行不同的操作。有如下幾種情況:
-
無論當前處於什麼狀態,如果串口接收到Esc鍵,則返回REST_MODE;
-
如果當前狀態爲REST_MODE
串口打印manu,可以通過如下指令進入相應的模式;
m - Motor Mode
c - Calibrate Encoder
s - Setup
e - Display Encoder
z - Set Zero Position:重新設置機械零位,並寫入flash -
如果當前狀態爲SETUP_MODE
串口打印Configuration Options,可以通過指令對參數進行設置,並寫入flash
b - Current Bandwidth (Hz)
i - CAN ID
m - CAN Master ID
l - Current Limit (A)
f - FW Current Limit (A)
t = CAN Timeout (cycles)(0 = none) -
如果當前狀態爲ENCODER_MODE
串口會不斷打印機械位置、電氣位置和原始位置值,可以通過Esc鍵停止打印並返回REST_MODE -
如果當前狀態爲MOTOR_MODE
通過鍵入‘d’可以讓foc的參考輸入電流爲0,或者Esc鍵返回REST_MODE -
如果當前狀態爲CALIBRATION_MODE
串口打印Calibration complete,可以通過Esc鍵返回REST_MODE
1.3 通過CAN操作
1.3.1 CAN接收
CAN接收也有兩種情況:
-
如果當前狀態是MOTOR_MODE
就是正常的控制指令,期望位置、期望速度、期望力矩、kp、kd等,參見後面CAN通信協議; -
如果當前狀態不是MOTOR_MODE
接收到的CAN指令分三種情況:
data[0]~data[6]=0xFF, data[7]=0xFC時,進入MOTOR_MODE
data[0]~data[6]=0xFF, data[7]=0xFD時,進入REST_MODE
data[0]~data[6]=0xFF, data[7]=0xFE時,進入設置Zero_Position,與串口設置不一樣,這裏設置的zero position不會保存到flash;
1.3.2 CAN發送
每接收到一包數據後,會立刻返回數據,返回的數據是機械角度、機械轉速、輸出力矩;
1.4 狀態之間的轉換
狀態之間的轉換,可以通過CAN進行,也可以通過串口。
通過CAN操作時,各狀態之間的關係如下: