[release] 发布8DOF串联足中期检查版本

This commit is contained in:
2026-07-21 12:18:00 +08:00
commit 0b91dfffe6
265 changed files with 170023 additions and 0 deletions
+236
View File
@@ -0,0 +1,236 @@
#include "main.h"
#include "can.h"
#include "app_can.h"
motor_measure_t m3508[8];
motor_measure_t m2006[8];
static CAN_TxHeaderTypeDef can1_tx_message;
static uint8_t can1_send_data[8];
static CAN_TxHeaderTypeDef can2_tx_message;
static uint8_t can2_send_data[8];
extern CAN_HandleTypeDef hcan1;
extern CAN_HandleTypeDef hcan2;
void can_filter_init(void)
{
CAN_FilterTypeDef can_filter_st;
can_filter_st.FilterActivation = ENABLE;
can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK;
can_filter_st.FilterScale = CAN_FILTERSCALE_32BIT;
can_filter_st.FilterIdHigh = 0x0000;
can_filter_st.FilterIdLow = 0x0000;
can_filter_st.FilterMaskIdHigh = 0x0000;
can_filter_st.FilterMaskIdLow = 0x0000;
can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
can_filter_st.FilterBank = 0;
HAL_CAN_ConfigFilter(&hcan1, &can_filter_st);
HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
can_filter_st.SlaveStartFilterBank = 14;
can_filter_st.FilterBank = 14;
HAL_CAN_ConfigFilter(&hcan2, &can_filter_st);
HAL_CAN_Start(&hcan2);
HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
}
/*******************************************************************************************
* @Func void get_moto_measure(moto_measure_t *ptr, CAN_HandleTypeDef* hcan)
* @Brief 接收3508电机通过CAN发过来的信息
* @Param
* @Retval None
* @Date 2015/11/24
*******************************************************************************************/
void get_moto_measure(motor_measure_t *ptr, uint8_t Data[])
{
ptr->last_angle = ptr->angle;
ptr->angle = (uint16_t)(Data[0] << 8 | Data[1]) ;
ptr->speed = (int16_t)(Data[2] << 8 | Data[3]);
ptr->troque = (Data[4] << 8 | Data[5]);
ptr->temperate = Data[6];
if(ptr->angle - ptr->last_angle > 4096)
ptr->round_cnt --;
else if (ptr->angle - ptr->last_angle < -4096)
ptr->round_cnt ++;
ptr->total_angle = ptr->round_cnt * 8192 + ptr->angle - ptr->offset_angle;
ptr->real_angle = ptr->total_angle / 22.75555556f;
}
/**
* @brief hal CAN fifo call back, receive motor data
* @param[in] hcan, the point to CAN handle
* @retval none
*/
/**
* @brief hal库CAN回调函数,接收电机数据
* @param[in] hcan:CAN句柄指针
* @retval none
*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef rx1_header;
CAN_RxHeaderTypeDef rx2_header;
uint8_t rx1_data[8];
uint8_t rx2_data[8];
/* if(hcan==(&hcan1))另一种方式*/
if(hcan->Instance == CAN1)
{
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &rx1_header, rx1_data);
switch (rx1_header.StdId)//3508接收
{
case 0x201:
case 0x202:
case 0x203:
case 0x204:
case 0x205:
case 0x206:
case 0x207:
case 0x208:
{
static u8 i = 0;
static u8 offset_sign[8] = {0}; //八个电机上电角度标志位
//get motor id
i = rx1_header.StdId - 0x201;
get_moto_measure(&m3508[i], rx1_data);//获取电机信息
if(offset_sign[i] == 0) //只记一次上电角度
{
get_moto_offset(&m3508[i]);//获取上电角度
offset_sign[i]++;
}
}
default:
{
break;
}
}
}
if(hcan->Instance == CAN2)
{
HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &rx2_header, rx2_data);
switch (rx2_header.StdId)
{
case 0x201:
case 0x202:
case 0x203:
case 0x204:
case 0x205:
case 0x206:
case 0x207:
case 0x208:
{
static u8 i = 0;
static u8 offset_sign[8] = {0}; //八个电机上电角度标志位
//get motor id
i = rx2_header.StdId - 0x201;
get_moto_measure(&m2006[i],rx2_data);//获取电机信息
if(offset_sign[i] == 0) //只记一次上电角度
{
get_moto_offset(&m2006[i]);//获取上电角度
offset_sign[i]++;
}
break;
}
default:
{
break;
}
}
}
}
/**
* @brief 发送电机控制电流(0x201,0x202,0x203,0x204)
* @param[in] motor1: (0x201) 3508电机控制电流, 范围 [-16384,16384]
* @param[in] motor2: (0x202) 3508电机控制电流, 范围 [-16384,16384]
* @param[in] motor3: (0x203) 3508电机控制电流, 范围 [-16384,16384]
* @param[in] motor4: (0x204) 3508电机控制电流, 范围 [-16384,16384]
* @retval none
*/
void can1_cmd1(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
{
uint32_t send_mail_box;
can1_tx_message.StdId = 0x200;
can1_tx_message.IDE = CAN_ID_STD;
can1_tx_message.RTR = CAN_RTR_DATA;
can1_tx_message.DLC = 0x08;
can1_send_data[0] = motor1 >> 8;
can1_send_data[1] = motor1;
can1_send_data[2] = motor2 >> 8;
can1_send_data[3] = motor2;
can1_send_data[4] = motor3 >> 8;
can1_send_data[5] = motor3;
can1_send_data[6] = motor4 >> 8;
can1_send_data[7] = motor4;
HAL_CAN_AddTxMessage(&hcan1, &can1_tx_message, can1_send_data, &send_mail_box);
}
void can1_cmd2(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
{
uint32_t send_mail_box;
can1_tx_message.StdId = 0x1FF;
can1_tx_message.IDE = CAN_ID_STD;
can1_tx_message.RTR = CAN_RTR_DATA;
can1_tx_message.DLC = 0x08;
can1_send_data[0] = motor1 >> 8;
can1_send_data[1] = motor1;
can1_send_data[2] = motor2 >> 8;
can1_send_data[3] = motor2;
can1_send_data[4] = motor3 >> 8;
can1_send_data[5] = motor3;
can1_send_data[6] = motor4 >> 8;
can1_send_data[7] = motor4;
HAL_CAN_AddTxMessage(&hcan1, &can1_tx_message, can1_send_data, &send_mail_box);
}
/**
* @brief 发送电机控制电流(0x201,0x202,0x203,0x204)
* @param[in] motor1: (0x201) 2006电机控制电流, 范围 [-16384,16384]
* @param[in] motor2: (0x202) 2006电机控制电流, 范围 [-16384,16384]
* @param[in] motor3: (0x203) 2006电机控制电流, 范围 [-16384,16384]
* @param[in] motor4: (0x204) 2006电机控制电流, 范围 [-16384,16384]
* @retval none
*/
void can2_cmd1(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
{
uint32_t send_mail_box;
can2_tx_message.StdId = 0x200;
can2_tx_message.IDE = CAN_ID_STD;
can2_tx_message.RTR = CAN_RTR_DATA;
can2_tx_message.DLC = 0x08;
can2_send_data[0] = (motor1 >> 8);
can2_send_data[1] = motor1;
can2_send_data[2] = (motor2 >> 8);
can2_send_data[3] = motor2;
can2_send_data[4] = (motor3 >> 8);
can2_send_data[5] = motor3;
can2_send_data[6] = (motor4 >> 8);
can2_send_data[7] = motor4;
HAL_CAN_AddTxMessage(&hcan2, &can2_tx_message, can2_send_data, &send_mail_box);
}
void can2_cmd2(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
{
uint32_t send_mail_box;
can2_tx_message.StdId = 0x1FF;
can2_tx_message.IDE = CAN_ID_STD;
can2_tx_message.RTR = CAN_RTR_DATA;
can2_tx_message.DLC = 0x08;
can2_send_data[0] = (motor1 >> 8);
can2_send_data[1] = motor1;
can2_send_data[2] = (motor2 >> 8);
can2_send_data[3] = motor2;
can2_send_data[4] = (motor3 >> 8);
can2_send_data[5] = motor3;
can2_send_data[6] = (motor4 >> 8);
can2_send_data[7] = motor4;
HAL_CAN_AddTxMessage(&hcan2, &can2_tx_message, can2_send_data, &send_mail_box);
}
/*this function should be called after system+can init */
void get_moto_offset(motor_measure_t *ptr)
{
ptr->offset_angle = ptr->angle;
ptr->round_cnt = 0;//防止角度差8192即一圈
}
+27
View File
@@ -0,0 +1,27 @@
/**
电机编号
前 小腿 大腿 大腿 小腿
left 2 1------------3 4 right -- can 1
| |
| |
| |
| |
后 2 1------------3 4 --can 2
*/
摆动 支撑
|
*** *** *** *** *** *** *** ***
+1
View File
@@ -0,0 +1 @@
\# 2.2.1.4.2 DBUS 接口 ## 1.2 DBUS* 接口概述 开发板 A 型配备 **1 路 DBUS 接口**,该接口是 DJI 遥控器的通用通信接口,核心特性如下: - 信号本质:DBUS 是 UART 信号的**反相形式**,需经硬件反相后才能被单片机 UART 外设识别。 - 波特率:默认配置为 **100kbps**,与 DJI 遥控器通信协议完全匹配。 - 核心用途:主要用于连接 DJI 遥控器,接收遥控指令,是无人机开发场景中常用的遥控信号输入接口。 --- ## 电路原理分析 ### 1. 接口硬件组成 - **接插件(J43**:采用 `2.54mm 3PIN 单排弯插针(90°)`,引脚定义如下: | 引脚 | 功能 | |------|------| | 1 | 电源地(PGND | | 2 | 5V 供电(VCC_5V_S | | 3 | DBUS 信号输入 | - **核心器件** - **Q14**:型号为 `PMBT3904-215` 的 NPN 三极管,作为**反相器**,将 DBUS 反相信号转换为标准 UART 信号。 - **电阻 R1744.7KΩ)**:基极限流电阻,限制流入三极管基极的电流,保护器件。 - **电阻 R894.7KΩ)**:集电极上拉电阻,确保三极管截止时输出稳定的 3.3V 高电平。 ### 2. 信号流程 1. DBUS 信号从接插件第 3 脚输入,经 R174 限流后送入 Q14 的基极。 2. 三极管对输入信号进行反相放大: - 当输入为高电平时,三极管导通,集电极输出低电平; - 当输入为低电平时,三极管截止,集电极通过 R89 上拉到 VCC_3V3_S,输出高电平。 3. 反相后的信号直接送入单片机的 `USART1_RXPB7` 引脚,供 UART 外设解析。 ### 3. 电平域转换 接口同时实现了 **5V 输入域**VCC_5V_S 供电)到 **3.3V 输出域**(VCC_3V3_S 上拉)的电平转换,无需额外电平转换芯片即可匹配单片机的 3.3V 逻辑电平。 --- ## 关键设计注意事项 1. **信号反相必要性**:DBUS 协议的 UART 信号是反相的,必须通过 Q14 反相后,才能被标准 UART 外设正确识别,直接连接会导致通信失败。 2. **波特率固定**:通信波特率需严格设置为 `100kbps`,否则无法与 DJI 遥控器建立稳定通信。 3. **供电兼容性**:接口由 VCC_5V_S 供电,需确保该电源输出稳定,避免因电压波动导致通信异常。 --- 我可以帮你整理一份**DBUS与标准UART信号的时序对比表**,让你更直观地理解反相逻辑的作用,需要吗?
@@ -0,0 +1,22 @@
电机驱动架构
8个灵足rs02电机编号1-8,定义8个电机底层驱动函数,每个函数负责控制一个电机的运动,包括设置目标角度,获取当前角度,计算角度差等。
8个电机canid结构体:
定义2个结构体,对应can1和can2,每个结构体包含4个电机的相关信息,包括canid,目标角度,当前角度,角度差等。
下面的指令均指的是遥控器指令
大腿驱动函数:
定义4个函数,分别负责控制左前大腿,左后大腿,右前大腿,右后大腿的运动,每个函数内部会调用对应的8个电机驱动函数,并根据指令设置目标角度。
小腿驱动函数:
定义4个函数,分别负责控制左前小腿,左后小腿,右前小腿,右后小腿的运动,每个函数内部会调用对应的8个电机驱动函数,并根据指令设置目标角度。
四条腿的驱动函数:(左前,左后,右前,右后)
定义4个函数,分别负责控制机器狗的四条腿的运动,每个函数内部会调用对应的大腿驱动函数和小腿驱动函数,并根据指令设置目标角度。
站立函数:
定义一个函数,负责将机器狗的四条腿调整到站立状态,每个函数内部会调用对应的四条腿的驱动函数,并设置目标角度为0。
趴下函数:
定义一个函数,负责将机器狗的四条腿调整到趴下状态,每个函数内部会调用对应的四条腿的驱动函数,并设置目标角度为一个固定值
步态函数:
定义一个函数,负责根据指令控制机器狗的步态,包括前进,后退,左转,右转等。每个函数内部会调用对应的四条腿的驱动函数,并根据指令设置目标角度。
前进函数:
定义一个函数,负责将机器狗的四条腿调整到前进状态,每个函数内部会调用对应的四条腿的驱动函数,并设置目标角度为一个固定值
后退函数:
定义一个函数,负责将机器狗的四条腿调整到后退状态,每个函数内部会调用对应的四条腿的驱动函数,并设置目标角度为一个固定值
+880
View File
@@ -0,0 +1,880 @@
# 灵足时代电机通信协议汇总
本文档汇总了灵足时代(Robstride)各型号电机的通信协议信息。
## 支持的电机型号
- **EL05**: 准直驱6N.M一体化电机模组
- **RS00**: 准直驱14N.M一体化电机模组
- **RS01**: 准直驱一体化电机模组
- **RS02**: 准直驱一体化电机模组
- **RS03**: 准直驱一体化电机模组
- **RS04**: 准直驱一体化电机模组
- **EL05**: 准直驱一体化电机模组
- **RS06**: 准直驱一体化电机模组
## 通信接口规范
### 基本参数
- **通信方式**: CAN 2.0
- **波特率**: 1Mbps(默认,可通过协议修改)
- **帧格式**:
- 私有协议:扩展帧(29位ID
- CANopen协议:扩展帧(29位ID
- MIT协议:标准帧(11位ID
### CAN ID结构(私有协议扩展帧)
```
29位ID结构:
Bit28~bit24: 通信类型
bit23~8: 数据区2(主机CAN_ID等)
bit7~0: 目标地址(电机CAN_ID
```
## 一、私有协议(默认协议)
所有电机型号均支持私有协议,这是默认的通信协议。
### 1.1 通信类型列表
#### 通信类型0:获取设备ID
- **功能**: 获取设备的ID和64位MCU唯一标识符
- **发送帧**:
- ID: `0x0` (Bit28~24=0)
- 数据: `00 FD 7F 00 00 00 00 00 00 00`
- 说明: bit15~8为主机CAN_IDbit7~0为目标电机CAN_ID
- **应答帧**:
- ID: `0x0`
- 数据: `00 7F FE [64位MCU唯一标识符]`
- 说明: 返回64位MCU唯一标识符
#### 通信类型1:运控模式电机控制指令
- **功能**: 运控模式下的电机控制
- **发送帧**:
- ID: `0x1` (Bit28~24=1)
- 数据: `[Byte0~1: 目标角度] [Byte2~3: 目标角速度] [Byte4~5: Kp] [Byte6~7: Kd]`
- 数据范围:
- 角度: 0~65535 对应 (-12.57f~12.57f) rad
- 角速度: 0~65535 对应 (-50rad/s~50rad/s)
- Kp: 0~65535 对应 (0.0~500.0)
- Kd: 0~65535 对应 (0.0~5.0)
- 注意: 数据高字节在前,低字节在后
- **应答帧**: 通信类型2(电机反馈数据)
#### 通信类型2:电机反馈数据
- **功能**: 电机状态反馈
- **发送帧**: 电机主动发送
- **数据格式**:
- Byte0~1: 当前角度 [0~65535] 对应 (-12.57f~12.57f) rad
- Byte2~3: 当前角速度 [0~65535] 对应 (-50rad/s~50rad/s)
- Byte4~5: 当前力矩 [0~65535] 对应 (-6Nm~6Nm)
- Byte6~7: 当前温度 Temp(摄氏度)*10
- Bit8~Bit15: 当前电机CAN ID
- Bit16~21: 故障信息(0无 1有)
- bit21: 未标定
- bit20: 堵转过载故障
- bit19: 磁编码故障
- bit18: 过温
- bit17: 三相电流故障
- bit16: 欠压故障
- Bit22~23: 模式状态
- 0: Reset模式[复位]
- 1: Cali模式[标定]
- 2: Motor模式[运行]
- **注意**: 数据高字节在前,低字节在后
#### 通信类型3:电机使能运行
- **功能**: 使能电机运行
- **发送帧**:
- ID: `0x3` (Bit28~24=3)
- 数据: `00 FD 7F 00 00 00 00 00 00 00`
- 说明: bit15~8为主机CAN_IDbit7~0为目标电机CAN_ID
- **应答帧**: 通信类型2(电机反馈数据)
#### 通信类型4:电机停止运行
- **功能**: 停止电机运行
- **发送帧**:
- ID: `0x4` (Bit28~24=4)
- 数据: `00 FD 7F 00 00 00 00 00 00 00`
- 说明: 正常运行时data区需清0;Byte[0]=1时:清故障
- **应答帧**: 通信类型2(电机反馈数据)
#### 通信类型6:设置电机机械零位
- **功能**: 设置当前位置为零位
- **发送帧**:
- ID: `0x6` (Bit28~24=6)
- 数据: `00 FD 7F 01 00 00 00 00 00 00`
- 说明: Byte[0]=1
- **应答帧**: 通信类型2(电机反馈数据)
- **注意**: CSP和运控模式下可以标零,PP模式标零会屏蔽掉
#### 通信类型7:设置电机CAN_ID
- **功能**: 更改当前电机CAN_ID,立即生效
- **发送帧**:
- ID: `0x7` (Bit28~24=7)
- 数据: `01 FD 7F [新CAN_ID] 00 00 00 00 00`
- 说明: Bit16~23为预设置CAN_ID
- **应答帧**: 通信类型0(获取设备ID)
#### 通信类型17:单个参数读取
- **功能**: 读取电机单个参数
- **发送帧**:
- ID: `0x11` (Bit28~24=17)
- 数据: `00 FD 7F [Byte0~1: index] 00 00 00 00 00`
- 说明: index为参数索引,详见可读写参数表,数据低字节在前,高字节在后
- **应答帧**:
- ID: `0x11`
- 数据: `00 7F FD [Byte0~1: index] 00 [Byte4~7: 参数数据]`
- 说明: Bit23~16: 00为读取成功,01为读取失败
#### 通信类型18:单个参数写入(掉电丢失)
- **功能**: 写入电机单个参数(需配合类型22保存)
- **发送帧**:
- ID: `0x12` (Bit28~24=18)
- 数据: `00 FD 7F [Byte0~1: index] 00 [Byte4~7: 参数数据]`
- 说明: 数据低字节在前,高字节在后
- **应答帧**: 通信类型2(电机反馈数据)
#### 通信类型21:故障反馈帧
- **功能**: 故障信息反馈
- **发送帧**: 电机主动发送
- **数据格式**:
- Byte0~3: fault值(非0:有故障,0:正常)
- Bit16: A相电流采样过流
- Bit14: 堵转过载算法保护
- Bit9: 位置初始化故障
- Bit8: 硬件识别故障
- Bit7: 编码器未标定
- Bit5: C相电流采样过流
- Bit4: B相电流采样过流
- Bit3: 过压故障(超过60V
- Bit2: 欠压故障(低于12V
- Bit1: 驱动芯片故障
- Bit0: 电机过温故障(超过145度)
- Byte4~7: warning值
- Bit0: 电机过温预警
#### 通信类型22:电机数据保存帧
- **功能**: 保存当前所有可存储变量
- **发送帧**:
- ID: `0x16` (Bit28~24=22)
- 数据: `00 FD 7F 01 02 03 04 05 06 07 08`
- 说明: 保存通过类型18写入的参数
- **应答帧**: 通信类型2(电机反馈数据)
#### 通信类型23:电机波特率修改帧
- **功能**: 修改CAN总线波特率(重新上电生效)
- **发送帧**:
- ID: `0x17` (Bit28~24=23)
- 数据: `00 FD 7F 01 02 03 04 05 06 [F_CMD] 00`
- F_CMD说明:
- 01: 1Mbps
- 02: 500Kbps
- 03: 250Kbps
- 04: 125Kbps
- **应答帧**: 通信类型0(获取设备ID)
#### 通信类型24:电机主动上报帧
- **功能**: 开启/关闭电机主动上报(部分型号支持)
- **发送帧**:
- ID: `0x18` (Bit28~24=24)
- 数据: `00 FD 7F 01 02 03 04 05 06 [F_CMD] 00`
- F_CMD说明:
- 00: 关闭主动上报(默认)
- 01: 开启主动上报(默认上报间隔10ms)
- **应答帧**: 通信类型2(电机反馈数据)
- **注意**: 上报间隔可通过类型18修改EPScan_time参数来更改
#### 通信类型25:电机协议修改帧
- **功能**: 切换电机通信协议(重新上电生效)
- **发送帧**:
- ID: `0x19` (Bit28~24=25)
- 数据: `00 FD 7F 01 02 03 04 05 06 [F_CMD] 00`
- F_CMD说明:
- 0: 私有协议(默认)
- 1: CANopen协议
- 2: MIT协议
- **应答帧**: 通信类型0(获取设备ID)
#### 通信类型26:版本号读取帧
- **功能**: 读取电机版本号
- **发送帧**:
- ID: `0x1A` (Bit28~24=26)
- 数据: `00 FD 7F 00 C4 00 00 00 00 00`
- 说明: Byte[0]=0x00, Byte[1]=0xC4
- **应答帧**:
- ID: `0x2`
- 数据: `00 7F FD 00 C4 [Byte2~6: 电机版本号]`
- 说明: 版本号顺序由高到低
### 1.2 可读写参数列表
| 参数index | 参数名称 | 描述 | 类型 | 字节数 | 单位/说明 | R/W |
|-----------|----------|------|------|--------|----------|-----|
| 0X7005 | run_mode | 运行模式 | uint8 | 1 | 0:运控 1:PP 2:速度 3:电流 5:CSP | W/R |
| 0X7006 | iq_ref | 电流模式Iq指令 | float | 4 | 见下表(各型号不同) | W/R |
| 0X700A | spd_ref | 转速模式转速指令 | float | 4 | 见下表(各型号不同) | W/R |
| 0X700B | limit_torque | 转矩限制 | float | 4 | 见下表(各型号不同) | W/R |
| 0X7010 | cur_kp | 电流的Kp | float | 4 | 默认值0.17 | W/R |
| 0X7011 | cur_ki | 电流的Ki | float | 4 | 默认值0.012 | W/R |
| 0X7014 | cur_filt_gain | 电流滤波系数 | float | 4 | 0~1.0,默认值0.1 | W/R |
| 0X7016 | loc_ref | 位置模式角度指令 | float | 4 | rad | W/R |
| 0X7017 | limit_spd | 位置模式(CSP)速度限制 | float | 4 | 见下表(各型号不同) | W/R |
| 0X7018 | limit_cur | 速度位置模式电流限制 | float | 4 | 见下表(各型号不同) | W/R |
| 0x7019 | mechPos | 负载端计圈机械角度 | float | 4 | rad | R |
| 0x701A | iqf | iq滤波值 | float | 4 | 见下表(各型号不同) | R |
| 0x701B | mechVel | 负载端转速 | float | 4 | 见下表(各型号不同) | R |
| 0x701C | VBUS | 母线电压 | float | 4 | V | R |
| 0x701E | loc_kp | 位置的kp | float | 4 | 默认值40 | W/R |
| 0x701F | spd_kp | 速度的kp | float | 4 | 默认值6 | W/R |
| 0x7020 | spd_ki | 速度的ki | float | 4 | 默认值0.02 | W/R |
| 0x7021 | spd_filt_gain | 速度滤波值 | float | 4 | 默认值0.1 | W/R |
| 0x7022 | acc_rad | 速度模式加速度 | float | 4 | 默认值20rad/s^2 | W/R |
| 0x7024 | vel_max | 位置模式(PP)速度 | float | 4 | 默认值10rad/s | W/R |
| 0x7025 | acc_set | 位置模式(PP)加速度 | float | 4 | 默认值10rad/s^2 | W/R |
| 0x7026 | EPScan_time | 上报时间设置 | uint16 | 2 | 1代表10ms,加1递增5ms | W/R |
| 0x7028 | canTimeout | can超时阀值 | uint32 | 4 | 20000代表1s,默认0 | W/R |
| 0x7029 | zero_sta | 零点标志位 | uint8 | 1 | 0代表0-2π,1代表-π-π | W/R |
| 0x702B | add_offset | 零位偏置 | float | 4 | 默认0 | W/R |
#### 各型号参数范围差异表
**⚠️ 重要提示**: 不同型号电机的参数范围存在显著差异,使用时务必参考对应型号的参数范围!
##### 电机规格参数对照表
| 电机型号 | 额定负载 | 峰值负载 | 减速比 | 额定相电流 | 最大相电流 |
|----------|----------|----------|--------|------------|------------|
| EL05 | 1.8 N.m | 6 N.m | 9:1 | 2.6Apk | 11Apk |
| RS00 | 5 N.m | 14 N.m | 10:1 | 4.7Apk | 15.5Apk |
| RS01 | 6 N.m | 17 N.m | 7.75:1 | 7Apk | 23Apk |
| RS02 | 6 N.m | 17 N.m | 7.75:1 | 7Apk | 23Apk |
| RS03 | 20 N.m | 60 N.m | 9:1 | 13Apk | 27Apk |
| RS04 | 40 N.m | 120 N.m | 9:1 | 27Apk | 45Apk |
| EL05 | 1.6 N.m | 6 N.m | 7.75:1 | 2.4Apk | 10Apk |
| RS06 | 11 N.m | 36 N.m | 9:1 | 14.3Apk | 27Apk |
##### 通信数据映射范围对照表(私有协议)
| 电机型号 | 力矩范围 (T_MIN~T_MAX) | 速度范围 (V_MIN~V_MAX) | 角度范围 (P_MIN~P_MAX) |
|----------|------------------------|------------------------|------------------------|
| EL05 | -6Nm ~ 6Nm | -50rad/s ~ 50rad/s | -12.57rad ~ 12.57rad |
| RS00 | -14Nm ~ 14Nm | -33rad/s ~ 33rad/s | -12.57rad ~ 12.57rad |
| RS01 | -17Nm ~ 17Nm | -44rad/s ~ 44rad/s | -12.57rad ~ 12.57rad |
| RS02 | -17Nm ~ 17Nm | -44rad/s ~ 44rad/s | -12.57rad ~ 12.57rad |
| RS03 | -60Nm ~ 60Nm | -20rad/s ~ 20rad/s | -12.57rad ~ 12.57rad |
| RS04 | -120Nm ~ 120Nm | -15rad/s ~ 15rad/s | -12.57rad ~ 12.57rad |
| EL05 | -6Nm ~ 6Nm | -50rad/s ~ 50rad/s | -12.57rad ~ 12.57rad |
| RS06 | -36Nm ~ 36Nm | -50rad/s ~ 50rad/s | -12.57rad ~ 12.57rad |
##### 运控模式Kp/Kd范围对照表
| 电机型号 | Kp范围 (KP_MIN~KP_MAX) | Kd范围 (KD_MIN~KD_MAX) |
|----------|------------------------|------------------------|
| EL05 | 0 ~ 500 | 0 ~ 5 |
| RS00 | 0 ~ 500 | 0 ~ 5 |
| RS01 | 0 ~ 500 | 0 ~ 5 |
| RS02 | 0 ~ 500 | 0 ~ 5 |
| RS03 | 0 ~ 5000 | 0 ~ 100 |
| RS04 | 0 ~ 5000 | 0 ~ 100 |
| EL05 | 0 ~ 500 | 0 ~ 5 |
| RS06 | 0 ~ 5000 | 0 ~ 100 |
##### 参数limit_torque范围对照表
| 电机型号 | limit_torque 范围 |
|----------|-------------------|
| EL05 | 0 ~ 6 Nm |
| RS00 | 0 ~ 14 Nm |
| RS01 | 0 ~ 17 Nm |
| RS02 | 0 ~ 17 Nm |
| RS03 | 0 ~ 60 Nm |
| RS04 | 0 ~ 120 Nm |
| EL05 | 0 ~ 6 Nm |
| RS06 | 0 ~ 36 Nm |
##### 参数limit_spd/spd_ref范围对照表
| 电机型号 | limit_spd / spd_ref 范围 |
|----------|--------------------------|
| EL05 | 0 ~ 50 rad/s |
| RS00 | 0 ~ 33 rad/s |
| RS01 | 0 ~ 44 rad/s |
| RS02 | 0 ~ 44 rad/s |
| RS03 | 0 ~ 20 rad/s |
| RS04 | 0 ~ 15 rad/s |
| EL05 | 0 ~ 50 rad/s |
| RS06 | 0 ~ 50 rad/s |
##### 参数limit_cur/iq_ref/iqf范围对照表
| 电机型号 | limit_cur / iq_ref / iqf 范围 |
|----------|-------------------------------|
| EL05 | 0 ~ 11 A |
| RS00 | 0 ~ 15.5 A |
| RS01 | 0 ~ 23 A |
| RS02 | 0 ~ 23 A |
| RS03 | 0 ~ 27 A |
| RS04 | 0 ~ 45 A |
| EL05 | 0 ~ 10 A |
| RS06 | 0 ~ 27 A |
##### 数据映射转换宏定义示例(C语言)
```c
// EL05 / EL05
#define P_MIN -12.57f
#define P_MAX 12.57f
#define V_MIN -50.0f
#define V_MAX 50.0f
#define KP_MIN 0.0f
#define KP_MAX 500.0f
#define KD_MIN 0.0f
#define KD_MAX 5.0f
#define T_MIN -6.0f // EL05: -6
#define T_MAX 6.0f // EL05: 6
// RS00
#define V_MIN -33.0f
#define V_MAX 33.0f
#define T_MIN -14.0f
#define T_MAX 14.0f
// RS01 / RS02
#define V_MIN -44.0f
#define V_MAX 44.0f
#define T_MIN -17.0f
#define T_MAX 17.0f
// RS03
#define V_MIN -20.0f
#define V_MAX 20.0f
#define KP_MAX 5000.0f
#define KD_MAX 100.0f
#define T_MIN -60.0f
#define T_MAX 60.0f
// RS04
#define V_MIN -15.0f
#define V_MAX 15.0f
#define KP_MAX 5000.0f
#define KD_MAX 100.0f
#define T_MIN -120.0f
#define T_MAX 120.0f
// RS06
#define V_MIN -50.0f
#define V_MAX 50.0f
#define KP_MAX 5000.0f
#define KD_MAX 100.0f
#define T_MIN -36.0f
#define T_MAX 36.0f
```
**版本兼容性说明**:
- RS00: 固件版本0.0.2.6及之前P_MIN/P_MAX为±12.5,之后为±12.57
- RS01: 固件版本0.1.2.1及之前P_MIN/P_MAX为±12.5,之后为±12.57
- RS02: 固件版本0.2.2.11及之前P_MIN/P_MAX为±12.5,之后为±12.57
- RS03: 固件版本0.3.0.5及之前P_MIN/P_MAX为±12.5,之后为±12.57
- RS04: 固件版本0.4.0.5及之前P_MIN/P_MAX为±12.5,之后为±12.57
### 1.3 控制模式使用说明
#### 运控模式
1. 电机上电后默认处于运控模式
2. 发送电机使能运行帧(通信类型3
3. 发送运控模式电机控制指令(通信类型1)
4. 收到电机反馈帧(通信类型2
#### 电流模式
1. 发送电机模式参数写入命令(通信类型18)设置runmode参数为3
2. 发送电机使能运行帧(通信类型3
3. 发送电机模式参数写入命令(通信类型18)设置iq_ref参数为预设电流指令
#### 速度模式
1. 发送电机模式参数写入命令(通信类型18)设置runmode参数为2
2. 发送电机使能运行帧(通信类型3
3. 发送电机模式参数写入命令(通信类型18)设置limit_cur参数为预设最大电流指令
4. 发送电机模式参数写入命令(通信类型18)设置acc_rad参数为预设加速度指令
5. 发送电机模式参数写入命令(通信类型18)设置spd_ref参数为预设速度指令
#### 位置模式(CSP
1. 发送电机模式参数写入命令(通信类型18)设置runmode参数为5
2. 发送电机使能运行帧(通信类型3
3. 发送电机模式参数写入命令(通信类型18)设置limit_spd参数为预设最大速度指令
4. 发送电机模式参数写入命令(通信类型18)设置loc_ref参数为预设位置指令
#### 位置模式(PP
1. 发送电机模式参数写入命令(通信类型18)设置runmode参数为1
2. 发送电机使能运行帧(通信类型3
3. 发送电机模式参数写入命令(通信类型18)设置vel_max参数为预设最大速度指令
4. 发送电机模式参数写入命令(通信类型18)设置acc_set参数为预设加速度指令
5. 发送电机模式参数写入命令(通信类型18)设置loc_ref参数为预设位置指令
6. **注意**: 该模式不支持运行过程中改速度和加速度,如想急停可以在过程中将vel_max修改为0
#### 停止运行
发送电机停止运行帧(通信类型4
## 二、CANopen通信协议
CANopen是一个基于CAN总线的"高层协议",实现了OSI模型的第七层。
### 2.1 CANOpen协议报文分类
| 分类 | 作用 |
|------|------|
| NMT 网络管理报文 | 管理网络,切换节点的状态 |
| SDO 服务数据对象报文 | 设置设备参数,关键数据传输 |
| PDO 过程数据对象报文 | 传输设备的过程数据(温度、速度等) |
| EMCY 紧急报文 | 传输设备的故障信息 |
| SYNC 同步报文 | 同步数据,同步从站的TPDO数据 |
| NODE GUARDING 节点保护报文 | 主站请求从站的状态 |
| HeartBeat 心跳报文 | 设备主动发送心跳,表示在线 |
### 2.2 状态机说明
- **SWITCH_ON_DISABLED**: 电机初始上电状态
- **OPERATION_ENABLE**: 运行状态
- 通过修改controlword6040)为6、7、15过渡到OPERATION_ENABLE状态
- 也可直接修改为15进入OPERATION_ENABLE状态
- **停止电机**: 修改controlword6040)为1,进入SWITCH_ON_DISABLED状态
- **急停**: 修改controlword6040)为11(慎用,易造成浪涌电压)
- **清除错误**: 修改controlword6040)可以清除常规错误
**注意**: 切换模式需要在失能状态下,请在进入OPERATION_ENABLE之前设置相应模式
### 2.3 状态反馈参数
| 索引 | 名称 | 属性 | 类型 | 单位 |
|------|------|------|------|------|
| 603F | Error_code | 可读 | UINTEGER16 | / |
| 6041 | Statusword | 可读 | UINTEGER16 | / |
| 6061 | Modes_of_operation_display | 可读 | INTEGER8 | / |
| 6062 | Position_demannd_value | 可读 | INTEGER32 | 脉冲,一圈对应16384脉冲 |
| 6064 | Position_actual_value | 可读 | INTEGER32 | 脉冲,一圈对应16384脉冲 |
| 606B | Velocity_demand_value | 可读 | INTEGER32 | 0.1rpm |
| 606C | Velocity_actual_value | 可读 | INTEGER32 | 0.1rpm |
| 6077 | Torque_actual_value | 可读 | INTEGER16 | 0.1%负载率,1000代表2N.m |
| 6078 | Current_actual_value | 可读 | INTEGER16 | mA |
| 6079 | DC_link_circuit_voltage | 可读 | INTEGER32 | mV |
### 2.4 归零模式(设置零位)
| 索引 | 名称 | 属性 | 类型 | 单位 |
|------|------|------|------|------|
| 6040 | controlword | 可读写 | UINTEGER16 | / |
| 6060 | Modes of operation | 可读写 | INTEGER8 | / |
**标零方式**: 电机在失能状态下设置Modes of operation为6,电机即会设置当前位置为零位
**零点保持**: 修改controlword为15,电机会在零位位置保持
### 2.5 位置模式(PP
| 索引 | 名称 | 属性 | 类型 | 单位 |
|------|------|------|------|------|
| 6040 | controlword | 可读写 | UINTEGER16 | / |
| 6060 | Modes of operation | 可读写 | INTEGER8 | / |
| 6067 | Position_window | 可读写 | UINTEGER32 | 脉冲,一圈对应16384脉冲 |
| 6068 | Position_window_time | 可读写 | UINTEGER16 | ms |
| 6071 | Target_torque | 可读写 | INTEGER16 | 0.1%负载率,1000代表2N.m |
| 607A | Target_position | 可读写 | INTEGER32 | 脉冲,一圈对应16384脉冲 |
| 6081 | Profile_velocity | 可读写 | UINTEGER32 | 0.1rpm |
| 6083 | Profile_acceleration | 可读写 | UINTEGER32 | 0.1rpm/s |
**步骤**:
1. 电机在失能状态下设置Modes of operation为1
2. 设置Target_torque(位置模式下最大力矩绝对值,必设)
3. 设置Profile_velocity(位置模式速度绝对值,必设)
4. 设置Profile_acceleration(位置模式加速度绝对值,必设)
5. 设置Position_window和Position_window_time(可选)
6. 设置controlword为15
7. 设置Target_position(绝对位置)即可到达指定位置
### 2.6 位置模式(CSP
| 索引 | 名称 | 属性 | 类型 | 单位 |
|------|------|------|------|------|
| 6040 | controlword | 可读写 | UINTEGER16 | / |
| 6060 | Modes of operation | 可读写 | INTEGER8 | / |
| 6067 | Position_window | 可读写 | UINTEGER32 | 脉冲,一圈对应16384脉冲 |
| 6068 | Position_window_time | 可读写 | UINTEGER16 | ms |
| 6071 | Target_torque | 可读写 | INTEGER16 | 0.1%负载率,1000代表2N.m |
| 607A | Target_position | 可读写 | INTEGER32 | 脉冲,一圈对应16384脉冲 |
| 6081 | Profile_velocity | 可读写 | UINTEGER32 | 0.1rpm |
**步骤**:
1. 电机在失能状态下设置Modes of operation为5
2. 设置Target_torque(位置模式下最大力矩绝对值,必设)
3. 设置Profile_velocity(位置模式速度绝对值,必设)
4. 设置Position_window和Position_window_time(可选,0即不启用)
5. 设置controlword为15
6. 设置Target_position(绝对位置)即可到达指定位置
### 2.7 速度模式
| 索引 | 名称 | 属性 | 类型 | 单位 |
|------|------|------|------|------|
| 6040 | controlword | 可读写 | UINTEGER16 | / |
| 6060 | Modes of operation | 可读写 | INTEGER8 | / |
| 6071 | Target_torque | 可读写 | INTEGER16 | 0.1%负载率,1000代表2N.m |
| 60FF | Target_velocity | 可读写 | INTEGER32 | 0.1rpm |
**步骤**:
1. 电机在失能状态下设置Modes of operation为3
2. 设置Target_torque(位置模式下最大力矩绝对值,必设)
3. 设置controlword为15
4. 设置Target_velocity即可到达指定速度
### 2.8 力矩模式
| 索引 | 名称 | 属性 | 类型 | 单位 |
|------|------|------|------|------|
| 6040 | controlword | 可读写 | UINTEGER16 | / |
| 6060 | Modes of operation | 可读写 | INTEGER8 | / |
| 6071 | Target_torque | 可读写 | INTEGER16 | 0.1%负载率,1000代表2N.m |
**步骤**:
1. 电机在失能状态下设置Modes of operation为4
2. 设置controlword为15
3. 设置Target_torque即可输出指定力矩
### 2.9 协议切换帧(扩展帧)
切换电机协议,重新上电生效
- **ID**: `0xFFF`
- **数据**: `01 02 03 04 05 06 [F_CMD]`
- **F_CMD说明**:
- 0: 私有协议(默认)
- 1: CANopen协议
- 2: MIT协议
**应答帧**:
- **ID**: 电机id11位标准帧)
- **数据**: 64位MCU唯一标识符
## 三、MIT通信协议
MIT协议采用标准帧格式(11位ID),波特率默认1Mbps。
### 3.1 CAN ID结构(MIT协议标准帧)
```
11位ID结构:
Bit10~bit8: 模式类型
bit7~0: id(电机CAN_ID或主机CAN_ID
```
### 3.2 支持的控制模式
- **MIT模式**: 给定电机运控5个参数
- **速度模式**: 给定电机指定的运行速度
- **位置模式**: 给定电机指定的位置和速度,电机将以过程速度运行到该指定的位置
### 3.3 指令列表
#### 应答指令1
- **ID**: `0xFD`(主机id
- **数据格式**:
- Byte0: 电机canid
- Byte1~2: 当前角度 [0~65535] 对应 (-12.57rad~12.57rad)
- Byte3为高8位,Byte4[7-4](高4位)为低4位: 当前速度 [0~4096] 对应 (-50rad/s~50rad/s)
- Byte4[3-0](低4位)为高4位,Byte5为低8位: 当前力矩 [0~4096] 对应 (-6N.m~6N.m)
- Byte6~7: 绕组温度 Temp(摄氏度)*10,单位度
#### 应答指令2
- **ID**: 电机id
- **数据**: 64位MCU唯一标识符
#### 指令1:电机使能运行
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF FF FC`
- **应答帧**: 应答指令1
#### 指令2:电机停止运行
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF FF FD`
- **应答帧**: 应答指令1
#### 指令3:电机MIT动态参数
- **ID**: `0x7F`(目标电机canid
- **数据格式**:
- Byte0~1: 目标角度 [0~65535] 对应 (-12.57rad~12.57rad)
- Byte2为高8位,Byte3[7-4](高4位)为低4位: 目标速度 [0~4096] 对应 (-50rad/s~50rad/s)
- Byte3[3-0](低4位)为高4位,Byte4为低8位: kp [0~4096] 对应 (0-500)
- Byte5为其高8位,Byte6[7-4](高4位)为其低4位: kd [0~4096] 对应 (0-5)
- Byte6[3-0](低4位)为高4位,Byte7为低8位: 目标力矩 [0~4096] 对应 (-6N.m~6N.m)
- **应答帧**: 应答指令1
#### 指令4:设置零点(非位置模式)
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF FF FE`
- **应答帧**: 应答指令1
#### 指令5:清除错误及读取异常状态
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF [F_CMD] FB`
- F_CMD = 0xFF: 消除当前的异常
- F_CMD = 其他值: 在回复中的BYTE1中回传错误值
- **清错应答帧**: 应答指令1
- **异常状态应答帧**:
- ID: `0xFD`(主机id
- Byte0: 电机canid
- Byte1~4: fault值(非0:有故障,0:正常)
- Bit16: A相电流采样过流
- Bit14: 堵转过载算法保护
- Bit9: 位置初始化故障
- Bit8: 硬件识别故障
- Bit7: 编码器未标定
- Bit5: C相电流采样过流
- Bit4: B相电流采样过流
- Bit3: 过压故障(超过60V
- Bit2: 欠压故障(低于12V
- Bit1: 驱动芯片故障
- Bit0: 电机过温故障(超过145度)
#### 指令6:设置运行模式
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF [F_CMD] FC`
- F_CMD说明:
- 0: MIT模式(默认)
- 1: 位置模式
- 2: 速度模式
- **应答帧**: 应答指令1
#### 指令7:修改电机CANID
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF [F_CMD] FA`
- F_CMD: 目标修改的电机id
- **应答帧**: 应答指令2
#### 指令8:修改电机协议
切换电机协议,重新上电生效
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF [F_CMD] FD`
- F_CMD说明:
- 0: 私有协议(默认)
- 1: CANopen协议
- 2: MIT协议
- **应答帧**: 应答指令2
#### 指令9:修改主机canid
- **ID**: `0x7F`(目标电机canid
- **数据**: `FF FF FF FF FF FF [F_CMD] 01`
- F_CMD: 为主机canid
- **应答帧**: 应答指令2
#### 指令10:位置模式控制指令
- **ID**: `0x17F`Bit10~8=1bit7~0=目标电机canid
- **数据格式**:
- Byte0~3: 目标位置,单位rad32位单精度float
- Byte4~7: 目标速度,单位rad/s32位单精度float
- **应答帧**: 应答指令1
#### 指令11:速度模式控制指令
- **ID**: `0x27F`Bit10~8=2bit7~0=目标电机canid
- **数据格式**:
- Byte0~3: 目标速度,单位rad/s32位单精度float
- Byte4~7: 速度位置模式电流限制,单位A,32位单精度float
- **应答帧**: 应答指令1
### 3.4 控制模式使用说明
#### 运控模式
1. 电机上电后默认处于运控模式
2. 发送电机使能运行帧(指令1
3. 发送运控模式电机控制指令(指令3
4. 发送电机停止帧(指令2
#### 速度模式
1. 发送电机模式参数写入命令(指令6)设置模式为2
2. 发送电机使能运行帧(指令1
3. 发送电机模式参数写入命令(指令11)设置最大电流(绝对值)和预设速度
4. 发送电机停止帧(指令2
#### 位置模式(CSP
1. 发送电机模式参数写入命令(指令6)设置模式为1
2. 发送电机使能运行帧(指令1
3. 发送电机模式参数写入命令(指令10)设置最大速度(绝对值)和预设位置
4. 发送电机停止帧(指令2
## 四、协议切换说明
### 4.1 切换方法
1. **通过上位机修改**: 修改protocol_1标志位或发送通信类型25(私有协议)即可切换协议
2. **通过CAN盒操作**: 切换协议后,需要通过can盒发送相应通信协议的切换协议指令进行切换
- CANopen协议: 发送扩展帧的协议切换帧
- MIT协议: 发送标准帧的指令8
### 4.2 生效方式
**重新上电生效**: 协议切换后需要重新上电才能生效
### 4.3 CAN ID一致性
- **CANopen协议**: canopen的id与私有协议下的canid保持一致
- **MIT协议**: 使用标准帧,id为电机CAN_ID
## 五、故障说明
### 5.1 故障位定义
故障信息通过通信类型2的Bit16~21或通信类型21的Byte0~3反馈:
| 位 | 故障名称 | 说明 |
|----|----------|------|
| Bit0 | 电机过温故障 | 电机热敏电阻温度超过145度 |
| Bit1 | 驱动芯片故障 | 电机驱动芯片报故障 |
| Bit2 | 欠压故障 | 电机电压低于保护电压12V |
| Bit3 | 过压故障 | 电机电压超过保护电压60V |
| Bit4 | B相电流故障 | B相电流采样过流 |
| Bit5 | C相电流故障 | C相电流采样过流 |
| Bit7 | 编码器未标定 | 电机未标定编码器 |
| Bit8 | 硬件识别故障 | 硬件识别故障 |
| Bit9 | 位置初始化故障 | 位置初始化故障 |
| Bit14 | 堵转过载算法保护 | 电机堵转过载算法保护 |
| Bit16 | A相电流故障 | A相电流采样过流 |
### 5.2 警告位定义
| 位 | 警告名称 | 说明 |
|----|----------|------|
| Bit0 | 电机过温预警 | 默认145度 |
## 六、特殊功能说明
### 6.1 主动上报
- **默认状态**: 关闭
- **开启方式**: 通过通信类型24开启上报
- **上报类型**: 通信类型2(电机反馈数据)
- **上报间隔**: 默认10ms,可通过通信类型18修改EPScan_time参数来更改
- **最小间隔**: 10ms
### 6.2 零点标志位
- **参数**: zero_sta0x7029
- **说明**:
- 0: 上电后默认位置为0-2π(默认)
- 1: 上电后默认位置为-π-π
- **修改方式**: 通过上位机或通信类型18修改,通过通信类型18修改需要用通信类型22保存
### 6.3 类型2变更说明
类型2变更为周期性循环-4π-4π,可通过该方式记圈数。
**位置接口变更**:
- P_MIN: -12.57f
- P_MAX: 12.57f
### 6.4 CAN超时保护
- **参数**: CAN_TIMEOUTcanTimeout0x7028
- **说明**:
- 值为0时: 该功能不启用
- 值为非0时: 当电机在一定时间段内没收到can指令时,电机进入reset模式
- 20000代表1s
### 6.5 标零功能
- **支持模式**: CSP和运控模式下可以标零
- **限制**: PP模式标零会屏蔽掉
- **说明**: 新版本电机在CSP和运控模式下标零,电机期望会马上更新为0,这样电机不会运动
## 七、数据转换说明
### 7.1 数据字节序
- **私有协议**: 大部分数据高字节在前,低字节在后
- **参数读写**: 数据低字节在前,高字节在后
- **MIT协议**: 按指令说明
### 7.2 数据范围映射
**⚠️ 重要**: 各型号电机的数据映射范围不同,详见 [1.2 可读写参数列表](#12-可读写参数列表) 中的各型号参数范围差异表。
#### 通用映射规则
| 数据类型 | 原始值范围 | 映射方式 | 备注 |
|----------|------------|----------|------|
| 角度(私有协议16位) | 0~65535 | 线性映射到 P_MIN~P_MAX | 各型号统一为 ±12.57rad |
| 角速度(私有协议16位) | 0~65535 | 线性映射到 V_MIN~V_MAX | 各型号不同,见差异表 |
| 力矩(私有协议16位) | 0~65535 | 线性映射到 T_MIN~T_MAX | 各型号不同,见差异表 |
| Kp(私有协议16位) | 0~65535 | 线性映射到 KP_MIN~KP_MAX | 小型号0~500,大型号0~5000 |
| Kd(私有协议16位) | 0~65535 | 线性映射到 KD_MIN~KD_MAX | 小型号0~5,大型号0~100 |
| 角度(MIT协议12位) | 0~65535 | 线性映射到 P_MIN~P_MAX | ±12.57rad |
| 角速度(MIT协议12位) | 0~4096 | 线性映射到 V_MIN~V_MAX | 各型号不同 |
| 力矩(MIT协议12位) | 0~4096 | 线性映射到 T_MIN~T_MAX | 各型号不同 |
| KpMIT协议12位) | 0~4096 | 线性映射到 KP_MIN~KP_MAX | 各型号不同 |
| KdMIT协议12位) | 0~4096 | 线性映射到 KD_MIN~KD_MAX | 各型号不同 |
#### 各型号数据映射快速参考
| 电机型号 | 力矩范围 | 速度范围 | Kp范围 | Kd范围 |
|----------|----------|----------|--------|--------|
| EL05 | ±6Nm | ±50rad/s | 0~500 | 0~5 |
| RS00 | ±14Nm | ±33rad/s | 0~500 | 0~5 |
| RS01 | ±17Nm | ±44rad/s | 0~500 | 0~5 |
| RS02 | ±17Nm | ±44rad/s | 0~500 | 0~5 |
| RS03 | ±60Nm | ±20rad/s | 0~5000 | 0~100 |
| RS04 | ±120Nm | ±15rad/s | 0~5000 | 0~100 |
| EL05 | ±6Nm | ±50rad/s | 0~500 | 0~5 |
| RS06 | ±36Nm | ±50rad/s | 0~5000 | 0~100 |
#### 温度映射
- 格式: Temp(摄氏度)*10
- 示例: 温度25.5度 = 255
#### 数据转换函数
```c
// 浮点数转无符号整数(用于发送)
int float_to_uint(float x, float x_min, float x_max, int bits) {
float span = x_max - x_min;
float offset = x_min;
if (x > x_max) x = x_max;
else if (x < x_min) x = x_min;
return (int)((x - offset) * ((float)((1 << bits) - 1)) / span);
}
// 无符号整数转浮点数(用于接收)
float uint_to_float(int x_int, float x_min, float x_max, int bits) {
float span = x_max - x_min;
float offset = x_min;
return ((float)x_int) * span / ((float)((1 << bits) - 1)) + offset;
}
```
### 7.3 浮点数格式
- **IEEE-754标准**: 32位单精度浮点数
- **字节序**: 按协议要求(低字节在前或高字节在前)
## 八、版本说明
本文档基于以下版本说明书整理:
- EL05使用说明书251210
- RS00使用说明书251210
- RS01使用说明书251210
- RS02使用说明书251210
- RS03使用说明书251210
- RS04使用说明书251210
- EL05使用说明书251210
- RS06使用说明书251210
**注意**: 不同型号的电机在某些细节上可能有差异,具体请参考对应型号的详细说明书。如无某些功能,请访问官网git升级最新版本。
## 九、参考资料
- 官方网站: https://www.robstride.com/
- 下载中心: www.robstride.com(可下载EDS文件等)
- 技术支持: 请通过官方网站联系技术支持
---
**文档生成日期**: 2025年12月29日
**文档版本**: 1.0
+139
View File
@@ -0,0 +1,139 @@
## 工程文件框架总览(RCPRO
- 工程类型:STM32F4(大疆 RoboMentors A 型板)四足机器人控制工程
- 工具链:STM32CubeMX 初始化 + Keil MDK 工程(Project 目录)
- 主要语言:C / C++(以 C 为主)
---
## 顶层目录结构
- Inc/
- 工程公共头文件与 HAL、CMSIS、FreeRTOS 相关头文件
- User/
- 用户自定义代码(算法、驱动、任务、启动文件等)
- Project/
- Keil 工程文件、编译输出中间文件、调试配置
- .vscode/
- VS Code 配置(智能提示、调试配置等)
- 文档与说明文件
- README.md、DBUS.md、can.md、app_can.md、姿态.md、辅助通道.md 等
- RS02使用说明书251112.pdf、遥控器相关 md 文档
- 其他工具与脚本
- keilkilll.bat 等
---
## Inc 目录结构
- Inc/hal_inc/
- STM32 HAL 库头文件(GPIO、RCC、CAN、UART、SPI、TIM、RTC 等)
- 由 STM32CubeMX 生成或随库提供
- Inc/m3_inc/
- CMSIS 相关头文件(内核 core_cmX、stm32f4xx.h、系统时钟 system_stm32f4xx.h 等)
- 提供底层寄存器与内核抽象
- Inc/os_inc/
- FreeRTOS 核心头文件(FreeRTOS.h、task.h、queue.h、semphr.h 等)
- CMSIS-OS 适配层 cmsis_os.h
- Inc 根目录下关键头文件:
- main.h:主函数相关声明
- gpio.h、dma.h、adc.h、tim.h、spi.h、usart.h、rtc.h:外设初始化接口
- can.h:CAN 相关句柄与接口声明
- FreeRTOSConfig.hFreeRTOS 配置
- stm32f4xx_hal_conf.hHAL 外设使能配置
- stm32f4xx_it.h / stm32f4xx_it.c:中断向量与中断服务函数
---
## User 目录结构
- User/algorithm/
- pid.c / pid.h
- PID 控制算法实现(位置/速度等)
- ramp.c / ramp.h
- 斜坡函数、平滑过渡控制(例如速度/位置渐变)
- User/driver/
- Movement.c / Movement.h
- 四足运动控制与步态生成(站立、行走等高层运动逻辑)
- leg.c / leg.h
- 机械腿几何建模与逆运动学计算
- lingzu_motor.c / lingzu_motor.h
- 灵足 RS02 关节电机 CAN 通讯与控制接口
- can_device.c / can_device.h
- CAN 收发封装、设备层抽象
- uart_device.c / uart_device.h
- UART 封装(遥控器、调试串口等)
- mpu6500_reg.h / ist8310_reg.h
- IMU、磁力计寄存器定义
- keyboard.h、calibrate.h 等
- 键盘控制、校准相关接口
- User/app/
- lingzu_task.c / lingzu_task.h
- 主要控制任务入口:四足行走、站立、模式切换等
- uart_task.c / uart_task.h
- 串口任务(接收/解析/发送数据)
- study_task.c / study_task.h
- 学习/实验用任务逻辑
- chassis_task.h、gimbal_task.h、shoot_custom.c、execute_task.h 等
- 源于 RM 工程的任务接口,可复用/裁剪
- User 其他文件
- startup.c / startup.h
- 启动相关代码(复位后初始化、任务启动等)
- rm_hal_lib.h
- RoboMentors 板级相关封装
- sys.h
- 系统级通用定义与工具
---
## Project 目录结构(Keil 工程)
- Project/RoboMentors_Board/
- RoboMentors_Board.uvprojx / .uvoptx / .uvguix.*
- Keil 工程、编译配置、调试配置文件
- *.o / *.d / *.crf
- 中间目标文件与依赖信息(编译产物)
- RoboMentors_Board.axf / .hex / .map / .htm
- 最终固件、链接映射与编译报告
- Project/DebugConfig/
- RoboMentors_Board_STM32F427IIHx*.dbgconf
- 调试器与目标芯片调试配置
- Project/output/
- RoboMentors_Board.map
- 链接映射文件(地址分布、段信息等)
- Project 根目录其他文件
- JLinkLog.txt / JLinkSettings.ini
- J-Link 调试相关日志与配置
- images.jpg
- 可能用于说明或调试记录
---
## 文档与辅助说明
- README.md
- 工程整体说明(来源、用途等)
- DBUS.md / can.md / app_can.md
- 遥控器 DBUS、CAN 通信相关说明
- move.c.md、姿态.md、辅助通道.md
- 与运动控制、姿态解算、辅助通道配置相关的说明文档
- # RadioLink AT9S Pro 遥控器使用说明书(详细版).md
- 遥控器详细使用说明
- RS02使用说明书251112.pdf
- RS02 关节电机官方说明书
---
## 建议阅读顺序(熟悉工程)
- 1)阅读顶层 README.md 与遥控器 / RS02 说明文档
- 2)查看 User/driver/ 中的 lingzu_motor.c、leg.c、Movement.c
- 3)查看 User/app/lingzu_task.c,理解任务入口与模式切换
- 4)根据需要再深入 Inc/、Project/ 与其他说明 md 文档