达妙电机
一、控制模式简介
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 总线的带宽利用率
五、驱动代码使用
- 添加驱动文件:将相应文件夹复制到
/Drivers/bsp/下,在BSP层加入相应文件。 - 对象初始化: 调用
dm_motor_init函数,传入电机的 ID、模式以及物理限制参数。此步骤会将电机对象注册到 CAN 接收哈希表中,以便接收反馈数据 。 -
电机使能: 调用
dm_motor_enable函数。驱动会自动根据当前的模式参数计算正确的 CAN ID,并发送使能帧。电机接收成功后,指示灯将转为绿色 。 -
循环控制: 在控制任务中周期性调用对应的控制函数。若配置为 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);
}
}