跳转至

达妙电机

一、控制模式简介

1. MIT 模式

​ 位置环、速度环和前置扭矩并联输出扭矩作为输出值,使⽤MIT模式可以衍生多种控制模式。

2. 位置速度模式

​ 位置速度模式采用三环串联控制。位置环位于最外层,其输出作为速度环的给定值;速度环的输出作为电流环的给定值,最终控制实际的电流输出 。

3. 速度模式

​ 速度模式主要依赖速度环。仅使用速度环的输出作为电流环的给定值,从而实现电机的稳定匀速转动 。

二、上位机的使用

在运行代码前,必须确保硬件连接正确并完成上位机的参数初始化。

1. 接线规范

​ 图中不需要电源转接板,可以提供24V电压即可,重要的是USB转CAN模块和电机的CAN线,上电后观

察电机指示灯是否为红色(确保电机是失能状态),否则重新上电。

​ 达妙的CAN线与大疆的CAN线不同,两种电机的CAN接⼝高低是反的,所以需要特定的CAN线。

2. 上位机串口界面和参数配置界面

3. CAN ID 和 Master ID

4. 上位机调试界面

可以看到电机的三个参数(位置、速度和⼒矩)都被直观的呈现在坐标图中。

5. 在上位机中分别使用三种模式

​ 电机模式的切换必须在上位机中进行,只在代码中无法更改!!比如在上位机中修改为MIT模式,代码中只能使用MIT模式。

  • MIT模式:MIT衍⽣的速度控制,给定速度和KD,可以实现匀速转动;MIT衍生的位置控制,给定位置、KP和KD,可以实现精准位置控制(KP和KD需要自己配)。
  • 位置速度模式:该模式的位置环和速度环的KP和KI不在调试界面,在参数设置界面,该模式实现以给定速度匀速转到目标位置。
  • 速度模式:该模式的速度环KP和KI也是在参数设置界面,该模式实现匀速转动。

三、USB转CAN助手

1. 入口界面

2. 电机使能

所用报文如下:

3. 发送MIT控制报文

4. 电机失能

以上是用USB转CAN助手实现MIT控制示例,其他俩种模式实现方法相同,唯一需要注意的是CAN ID的 偏移,比如位置速度模式的CAN ID

四、驱动程序解析

1. 数据结构定义

/**

 /* @brief 电机控制结构体

 */

typedef struct {

  uint32_t master_id;     /*!< 反馈主机 ID */

  uint32_t device_id;     /*!< 控制设备 ID */

  can_selected_t can_select; /*!< 选择 CAN 通信 */

  dm_model_t model;      /*!< 型号 */

  dm_mode_t mode;       /*!< 当前模式 */

  float position;      /*!< 位置 */

  float speed;       /*!< 速度 */

  float torque;       /*!< 扭矩 */

  float mos_temperature;  /*!< MOS 温度 */

  float motor_temperature; /*!< 电机线圈温度 */

  dm_error_t error;     /*!< 错误信息 */

  /* 以下参数需要与上位机设定值一致, 否则会导致回传与控制的值发送错误 */

  float pos_limit;  /*!< 位置绝对值范围 */

  float spd_limit;  /*!< 速度绝对值范围 */

  float torq_limit; /*!< 扭矩绝对值范围 */

} dm_handle_t;

​ 驱动的核心在于 dm_handle_t 结构体,它封装了电机的物理属性与控制参数。通过该结构体,开发者可以统一管理多个不同配置的电机对象。

2. 函数用法说明

// 初始化电机对象,设置 ID、模式及物理限制,并注册 CAN 接收回调 
dm_motor_init

// 注销电机对象,释放 CAN 接收表资源
dm_motor_deinit

// 发送使能帧,电机进入工作状态(绿灯)
dm_motor_enable

// 发送失能帧,电机停止输出(红灯) 
dm_motor_disable

// 将电机当前位置保存为零点
dm_save_zero

// 清除电机内部的错误状态
dm_clear_error

// MIT 模式控制:发送压缩后的位置、速度、KP、KD 及前馈扭矩
dm_mit_ctrl

// 位置速度模式控制:发送目标位置和最大速度限制
dm_pos_speed_ctrl

// 速度模式控制:发送目标速度实现稳速转动
dm_speed_ctrl

3. 核心设计思想

驱动程序的设计遵循模块化与分层原则。

  • 协议解耦:驱动层不直接操作硬件寄存器,而是通过 can_select 参数调用底层的 CAN 发送接口。这种设计使得驱动代码可以轻松移植到不同的硬件平台 。
  • 模式抽象:针对三种控制模式,驱动内部实现了 ID 偏移计算与数据打包逻辑。例如,MIT 模式使用基础 ID,而位置速度模式会自动增加 0x100 的偏移量 。
  • 数据压缩:在 MIT 模式下,驱动采用了线性映射算法。通过 float_to_uint 函数,将浮点型的物理数据压缩为 12 位或 16 位的整数传输,极大地提高了 CAN 总线的带宽利用率

五、驱动代码使用

  1. 添加驱动文件:将相应文件夹复制到 /Drivers/bsp/ 下,在BSP层加入相应文件。
  2. 对象初始化: 调用 dm_motor_init 函数,传入电机的 ID、模式以及物理限制参数。此步骤会将电机对象注册到 CAN 接收哈希表中,以便接收反馈数据 。
  3. 电机使能: 调用 dm_motor_enable 函数。驱动会自动根据当前的模式参数计算正确的 CAN ID,并发送使能帧。电机接收成功后,指示灯将转为绿色 。

  4. 循环控制: 在控制任务中周期性调用对应的控制函数。若配置为 MIT 模式,需调用 dm_mit_ctrl 并传入目标位置、速度及增益参数,其他模式就调用相应函数 。

/* demo 如下所示*/

void task2(void *pvParameters) {
    UNUSED(pvParameters);
    dm_handle_t motor;
    dm_motor_init(&motor, 0x11, 0x01, DM_MODE_MIT, DM_J8006, 12, 120, 8, can1_selected);
    dm_clear_error(&motor);
    while (1) {
        dm_motor_enable(&motor);
        dm_mit_ctrl(&motor, 0, 5, 0, 1, 0);
        vTaskDelay(2000);
        dm_motor_disable(&motor);
        vTaskDelay(2000);
    }
}