Cheetah开源电机驱动控制解析

著名的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操作时,各状态之间的关系如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章