指令与编程手册
Rev 1.7.1
适用于CH0x0/HI02/04/05/06/14/50/90/70系列共享编程接口
本手册基于固件版本: 1.7.1
具体功能以实际产品型号、固件版本及交付配置为准

适用固件版本
📌 先确认你的固件版本 — 不同固件版本的指令略有差异。查看方法:串口发送
LOG VERSION,或在 CHCenter 上位机 中查看,然后按下表选择对应手册。
| 你的固件版本 | 对应手册 | 获取 |
|---|---|---|
| ≥ 1.7.1(最新) | v1.7.1 | 本手册(本页 / 右上「下载 PDF」) |
| 1.5.5 – 1.7.0 | v1.3.0 | imu_cum_cn_150_170.pdf |
模块配置简述
在使用产品前,请仔细阅读本章节,结合实际使用需求,判断是否需要进行用户配置。
工作模式配置 - AHRS/9轴模式
⚠️ 警告 在机器人应用及室内环境中,AHRS(9轴)模式容易受到环境磁场或电机产生磁场干扰,导致航向角产生误差。
在空旷且无磁场干扰的环境下(如无人机户外飞行场景),可使用地磁辅助模式。使用前需要:
- 将模块配置为地磁辅助模式;
- 进行地磁校准(详见“地磁校准”章节)。
同步输入 - SYNC_IN/PPS
模块的同步相关功能依赖于 SYNC_IN/PPS 引脚,主要包括以下两类:
- SYNC_IN同步数据触发
- PPS标准秒脉冲接入,用于UTC时间同步
SYNC_IN同步数据触发
部分产品提供同步输入引脚(SYNC_IN/PPS),可用于外部脉冲触发数据输出。不使用时建议悬空或接地。工作原理:当输出协议配置为 ONMARK 触发模式时(详见 LOG 指令),模块在 SYNC_IN 引脚检测到上升沿后输出一帧数据。
应用场景:主要用于接收主控或外部时钟源产生的高精度脉冲,以触发同步输出 IMU 数据。

PPS标准秒脉冲接入
此功能使用(SYNC_IN/PPS)引脚接入GPS的PPS秒脉冲信号,配合串口接收时间消息,为IMU提供精确的UTC时间同步。当模块检测到有效的PPS上升沿,并通过串口接收到匹配的时间消息后,内部时钟将自动对齐至UTC整秒。
1. 时序与信号要求
为确保时间同步可靠,PPS 脉冲与串口时间消息需满足如下横向时序要求:
参数说明:
| 参数 | 描述 | 有效范围 | 推荐值 |
|---|---|---|---|
| t0 | 相邻两次秒脉冲上升沿的间隔 | 990 ms ~ 1010 ms | 1000 ms |
| t1 | 秒脉冲的高电平时间(脉宽) | 1 ms ~ 100 ms | 10 ms ~ 50 ms |
| t2 | 时间消息的传输时间 | 与波特率相关 | - |
| t3 | 时间消息开始发送相对于脉冲上升沿的延迟 | -200 ms ~ +200 ms | 0 ms ~ 100 ms |
⚠️ 核心要求: 用于对时的时间消息必须在 PPS 上升沿到来前后 200ms 内发出(即
),否则 IMU 将无法正确匹配 UTC 时间。
2. 硬件与接口配置要求
- 硬件引脚 (SYNC_IN/PPS):
- 触发方式:上升沿有效;
- 电平标准:高电平 ≤ 5V(TTL/CMOS兼容);
- 串口数据 (RX):
- 报文频率:1~10 Hz(推荐 1 Hz);
- 波特率:必须与IMU当前配置的波特率严格一致;
- 支持协议:仅支持标准 NMEA
RMC或GGA消息。
3. 时间消息示例(以GPRMC为例)
$GPRMC,235952.00,A,3112.5000,N,12127.5000,E,0.0,0.0,141125,0.0,E,A*3B时间同步后,数据帧中的时间戳(uint32_t)表示自当日 UTC 00:00:00 起累计的毫秒数。
| 参数 | 值 |
|---|---|
| 范围 | 0~86,399,999 ms |
| 对应时间 | 00:00:00.000至23:59:59.999 |
| 精度 | 1毫秒 |
时间戳转换示例与 C 代码
| 时间戳 (ms) | UTC时间 |
|---|---|
| 0 | 00:00:00.000 |
| 3661000 | 01:01:01.000 |
| 43200000 | 12:00:00.000 |
| 86399999 | 23:59:59.999 |
// Time conversion formula:
// Hours = timestamp / 3600000
// Minutes = (timestamp % 3600000) / 60000
// Seconds = (timestamp % 60000) / 1000
// Milliseconds = timestamp % 1000
void ms_to_utc_time(uint32_t total_ms, char *utc_time, int buf_size)
{
// Calculate hours, minutes, seconds and milliseconds
uint32_t total_seconds = total_ms / 1000;
uint32_t ms_part = total_ms % 1000;
uint8_t hours = (total_seconds / 3600) % 24;
uint8_t minutes = (total_seconds % 3600) / 60;
uint8_t seconds = total_seconds % 60;
// Format as hh:mm:ss.sss
snprintf(utc_time, buf_size, "%02d:%02d:%02d.%03d",
hours, minutes, seconds, ms_part);
}📝 注意事项
- 时间戳不包含日期信息,仅表示当日UTC时间(自00:00:00起的毫秒数);
- 不包含时区信息,默认按 UTC+0 解释;如需本地时间,请由主机侧自行叠加时区偏移。
同步输出 - SOUT
SOUT 是模块的同步输出引脚。无数据输出时为低电平(空闲);当一帧数据开始发送前,会先输出一个高脉冲,脉冲结束(下降沿)后紧接数据输出。

SOUT 引脚还支持分频输出,可按设定的分频系数输出同步脉冲,用于触发相机等低速率设备,实现严格时间同步。分频系数配置见“模块配置”章节中的 CONFIG PMUX2 DIV。
船舶海浪补偿位移输出 - Heave, Surge, Sway
本产品支持测量海浪引起的船舶周期性运动(垂荡、纵荡、横荡),可提供高精度的实时三轴海浪运动信息:
| 运动轴 | 描述 | 输出数据 |
|---|---|---|
| Heave | 垂直升沉 | 垂直位移、垂直速度、垂直位移周期 |
| Surge | 纵向涌浪 | 纵向位移、纵向速度、纵向位移周期 |
| Sway | 横向摇摆 | 横向位移、横向速度、横向位移周期 |
应用场景:
- 船舶动态监测与姿态控制
- 海洋工程作业补偿(起重、对接)
- 波浪特性研究与统计分析
- 海上平台稳定性分析
- 动态定位系统(DP)辅助
使用限制
⚠️ 重要限制
仅适用于周期性往复运动
以下情况通常无法准确测量:
- 周期过长的运动(>30 s)
- 单向线性运动
- 阶跃式位移
零均值假设:算法假设位移的长期平均值为 0
初始化时间:需要稳定的 5~20 个海浪周期作为初始化时间才能获得正确结果
频率响应范围:典型海浪周期 3~20 s,超出此范围精度下降
📝 产品兼容性 仅 HI7x/9x 系列产品支持此功能,详见“产品特性支持表”。
产品特性支持表
下表给出各产品家族的常用功能支持概览。具体功能以实际产品型号、固件版本及交付配置为准。
表中未列项不表示该功能一定支持或默认开放;对于单一型号产品,请结合实际交付说明确认。
| 型号/指令 | HI02 | HI05/06 | CH0x0, HI04/12/13/14 | HI50 | HI7x/9x |
|---|---|---|---|---|---|
| 地磁辅助/地磁校准 | ✗ | ✅ | ✅ | ✗ | ✅ |
| 用户姿态校准 | ✗ | ✅ | ✅ | ✅ | ✅ |
| IO复用映射(PMUX) | ✗ | ✅ | ✅ | ✗ | ✗ |
| CAN通讯接口 | ✗ | ✅ | ✅ | ✅ | ✅ |
| 船舶垂荡信息输出 | ✗ | ✗ | ✗ | ✗ | ✅ |
| 倾角输出 | ✗ | ✗ | ✗ | ✅ | ✗ |
模块配置命令(ASCII)
模块配置采用串口 ASCII 字符串命令格式,每条命令必须以回车换行 \r\n 结束(类似 AT 指令)。
凡涉及参数修改的操作,建议按“发送配置指令 -> 执行 SAVECONFIG -> 复位或重新上电 -> 再次确认”的流程进行。查询类命令以及部分通信控制命令可能在当前通信会话中立即体现,但不改变上述推荐配置流程。
📝 配置语义说明
- 命令是否立即生效,以各命令说明为准;
- 需要长期保留的配置,建议执行
SAVECONFIG后再复位或重新上电确认;- 通信参数类命令可能在当前接口上立即切换;
- 恢复类命令可能自动保存并触发复位。
下表列出常用对外配置命令。对于兼容、调试或定制用途的附加命令,请以实际交付说明为准。
配置命令总览
| 指令 | 功能 | 备注 |
|---|---|---|
| REBOOT | 复位模块 | 和重上电等效 |
| SAVECONFIG | 保存所有配置参数 | 立即生效 |
| SERIALCONFIG | 串口波特率设置 | 立即生效 |
| CONFIG | 配置模块各种参数及模式 | 保存后,复位生效 |
| LOG | 查询模块信息或配置输出数据 | 立即生效 |
| FRESET | 恢复出厂设置 | 立即生效 |
指令详解
REBOOT
复位模块。执行 REBOOT BL 可复位进入 Bootloader 模式。 示例: REBOOT、REBOOT BL
SAVECONFIG
保存所有用户配置到 Flash。 示例:SAVECONFIG
SERIALCONFIG
设置当前串口波特率。
格式:SERIALCONFIG <BAUD>
参数说明:
BAUD:目标波特率。当前支持值:4800、9600、19200、38400、57600、115200、230400、256000、460800、921600
示例:
SERIALCONFIG 115200- 设置当前串口为115200波特率
⚠️ 重要提示 该指令立即生效,当执行该指令后,需要切换到新波特率才能和模块继续通讯。
CONFIG
用于配置模块各种参数及工作模式。建议所有需要长期保存的 CONFIG 配置在完成后执行 SAVECONFIG 保存,并在复位或重新上电后确认配置结果。
工作模式配置
工作模式配置:6轴或9轴(地磁辅助)模式,格式:CONFIG ATT MODE <VAL>。以下列出常用模式,其他行业模式或定制模式请以实际交付说明为准。
示例:
CONFIG ATT MODE 0- 配置模块为VRU(6轴)模式CONFIG ATT MODE 1- 配置模块为AHRS(9轴)模式CONFIG ATT MODE 4- 人形机器人专用模式
姿态用户校准
用于执行姿态零点相关操作,格式:CONFIG ATT RST <VAL>。执行该命令时,设备应保持静止,否则可能引入较大校准误差。
示例:
CONFIG ATT RST 1- 航向复位:将当前航向角置零CONFIG ATT RST 2- 设置相对零点:将当前 Pitch、Roll 角度置零CONFIG ATT RST 3- 自动校平:仅在设备接近水平放置时有效,具体定义如下:- 如果当前Pitch/Roll接近0°(水平正面放置),则自动校准到Pitch=0°,Roll=0°;
- 如果当前Pitch接近0°,Roll接近180°(水平倒放),则自动校准到Pitch=0°,Roll=180°;
- 判定阈值为Pitch、Roll均小于5°。
CONFIG ATT RST 5- 取消水平校平:清除相对 Pitch、Roll 角度,恢复绝对角度
安装角度设置
用于修改模块安装方向,如水平安装、垂直安装、倒装以及组合导航前向安装等。此类配置建议保存后复位确认,无需每次上电重复发送。
格式:CONFIG IMU URFR <CODE>
参数说明:
CODE:2~3 位方向编码,表示用户坐标系相对于传感器坐标系的安装方向。- 编码写作
ABC,其中:A表示用户坐标系X轴对应传感器坐标系的哪个方向B表示用户坐标系Y轴对应传感器坐标系的哪个方向C表示用户坐标系Z轴对应传感器坐标系的哪个方向
- 每一位数字的含义如下:
| 数字 | 方向 |
|---|---|
0 | +X |
1 | -X |
2 | +Y |
3 | -Y |
4 | +Z |
5 | -Z |
使用说明:
24等价于024,表示用户坐标系X=+X、Y=+Y、Z=+Z。对本产品默认安装方向,可理解为X 指右,Y 指前,Z 指上。- 该命令使用空格分隔参数,正确写法为
CONFIG IMU URFR 24,不是CONFIG IMU URFR=24。 - 当前配置查询结果会以
URFR=<CODE>的形式显示。 - 如果用户坐标系定义与机体右、前、上方向一致,则可直接按安装朝向从下表选择对应编码。
完整配置示例(24 种合法右手系):
- 下表按“等效安装描述”展示(与上位机下拉一致):
IMU X/Y/Z在Body(B)中的方向。 URFR本质编码仍是ABC三位数字(右手系约束:X × Y = Z);2 位显示值等价于补前导零后的 3 位值(如24=024)。
| 等效安装描述(IMU 轴在 Body(B) 中) | 配置命令 | 说明 |
|---|---|---|
IMU X 指右,IMU Y 指前,IMU Z 指上 | CONFIG IMU URFR 24 | 默认水平安装;完整编码为 024。 |
IMU X 指右,IMU Y 指后,IMU Z 指下 | CONFIG IMU URFR 35 | 相对默认姿态绕 X 轴翻转后的常见倒装;完整编码为 035。 |
IMU X 指右,IMU Y 指下,IMU Z 指前 | CONFIG IMU URFR 43 | 常见侧装;该组合与上位机“Right + Down”一致。 |
IMU X 指右,IMU Y 指上,IMU Z 指后 | CONFIG IMU URFR 52 | 常见侧装;该组合与上位机“Right + Up”一致。 |
IMU X 指左,IMU Y 指前,IMU Z 指下 | CONFIG IMU URFR 125 | X 轴反向且 Z 向下的倒装组合。 |
IMU X 指左,IMU Y 指后,IMU Z 指上 | CONFIG IMU URFR 134 | X/Y 同时反向、Z 向上,常见于朝向对调安装。 |
IMU X 指左,IMU Y 指上,IMU Z 指前 | CONFIG IMU URFR 142 | 左向立装组合,Y 轴朝上。 |
IMU X 指左,IMU Y 指下,IMU Z 指后 | CONFIG IMU URFR 153 | 左向立装组合,Y 轴朝下。 |
IMU X 指前,IMU Y 指右,IMU Z 指下 | CONFIG IMU URFR 205 | 前向安装组合,适合 X 轴沿车头方向布置。 |
IMU X 指后,IMU Y 指右,IMU Z 指上 | CONFIG IMU URFR 214 | 后向安装组合,Y 轴保持朝右。 |
IMU X 指上,IMU Y 指右,IMU Z 指前 | CONFIG IMU URFR 240 | 立装组合,X 轴朝上、Y 轴朝右。 |
IMU X 指下,IMU Y 指右,IMU Z 指后 | CONFIG IMU URFR 251 | 立装组合,X 轴朝下、Y 轴朝右。 |
IMU X 指前,IMU Y 指左,IMU Z 指上 | CONFIG IMU URFR 304 | 前向安装组合,Y 轴改为朝左。 |
IMU X 指后,IMU Y 指左,IMU Z 指下 | CONFIG IMU URFR 315 | 后向倒装组合,X/Y 均为反向。 |
IMU X 指下,IMU Y 指左,IMU Z 指前 | CONFIG IMU URFR 341 | 左向立装组合,X 轴朝下。 |
IMU X 指上,IMU Y 指左,IMU Z 指后 | CONFIG IMU URFR 350 | 左向立装组合,X 轴朝上。 |
IMU X 指前,IMU Y 指上,IMU Z 指右 | CONFIG IMU URFR 402 | Y 轴朝上、Z 轴朝右的前向立装。 |
IMU X 指后,IMU Y 指下,IMU Z 指右 | CONFIG IMU URFR 413 | 后向立装,Y 轴朝下、Z 轴朝右。 |
IMU X 指下,IMU Y 指前,IMU Z 指右 | CONFIG IMU URFR 421 | 立装组合,X 朝下且 Z 朝右。 |
IMU X 指上,IMU Y 指后,IMU Z 指右 | CONFIG IMU URFR 430 | 立装组合,X 朝上且 Z 朝右。 |
IMU X 指前,IMU Y 指下,IMU Z 指左 | CONFIG IMU URFR 503 | 前向立装,Y 轴朝下、Z 轴朝左。 |
IMU X 指后,IMU Y 指上,IMU Z 指左 | CONFIG IMU URFR 512 | 后向立装,Y 轴朝上、Z 轴朝左。 |
IMU X 指上,IMU Y 指前,IMU Z 指左 | CONFIG IMU URFR 520 | 常见立装组合,X 轴朝上、Z 朝左。 |
IMU X 指下,IMU Y 指后,IMU Z 指左 | CONFIG IMU URFR 531 | 常见立装组合,X 轴朝下、Z 朝左。 |
多功能IO复用功能配置
模块提供多个多功能引脚(IOx)。每个 IO 引脚具有默认复用功能,也可通过软件重新映射为其他复用功能。格式:CONFIG <PMUX> <IO>。
参数说明:
PMUX:复用功能编号(PMUX1~PMUX3)IO:目标引脚编号(IO1~IO5)
| 功能 | 名称 | 方向 | 说明 | 默认IO |
|---|---|---|---|---|
| PMUX1 | SIN/PPS | I | 同步脉冲输入(SIN/PPS):输入引脚,见"同步输入与同步输出"章节 | IO1 |
| PMUX2 | SOUT | O | 无数据输出时为低电平(空闲),当一帧数据开始发送前会发送一个高脉冲,高脉冲结束(下降沿)后紧接着输出数据 | IO2 |
| PMUX3 | LED | O | 运行状态指示灯输出 | IO5 |
示例:
CONFIG PMUX3 IO2- 将IO2引脚分配为LED(PMUX3)功能CONFIG PMUX2 IO1- 将IO1引脚分配为同步输出(PMUX2)功能
📝 注意 并非所有 IO 引脚都会在具体产品上实际引出,详细硬件资源请参见对应产品用户手册。
SOUT(PMUX2)同步输出分频设置
SOUT 同步输出支持分频,可用于触发相机等低速率传感器融合设备。格式:CONFIG PMUX2 DIV <N>。
参数说明:
N:分频系数,范围1~1000,默认值为1(不分频)
示例:
CONFIG PMUX2 DIV 5- 设置SOUT分频系数为5,若数据输出速率为100 Hz,则SOUT脉冲输出频率为20 Hz
地磁校准
开始一次手动地磁校准:CONFIG MCAL START。发送该指令后,模块开始地磁校准流程,并根据空间磁场分布自动完成校准,无需再手动发送结束指令。执行过程中应在原地缓慢旋转模块,并确保与模块刚性连接的物体(PCB、外壳、机器人等)相对位置保持不变。详细说明见“地磁校准”章节。
发送开始校准指令后,可通过 LOG MCAL STAT 查询地磁校准状态,返回示例如下:
STAT=1
PROGRESS=8
OKSTAT:当前地磁校准状态。0表示空闲,1表示校准中,3表示校准完成,4表示校准失败PROGRESS:当前校准进度,范围0~100
📝 重要提示 地磁校准指令要求固件版本 ≥ 1.7.0。
坐标系定义设置
模块默认采用东北天(ENU)坐标系,也可通过以下命令切换世界坐标系定义:
CONFIG IMU COORD 0- 将模块世界坐标系定义为东北天(ENU)坐标系CONFIG IMU COORD 4- 将模块世界坐标系定义为北西天(NWU)坐标系
用户级陀螺校准
该命令用于手动校准陀螺仪Z轴比例因子。正确执行该指令后,可提升航向角精度(校准后可保证比例因子误差在0.1%以内)。适用于AGV、大型水平移动机器人等,且对长期航向角误差要求高的工况下使用。格式:CONFIG USRCAL START <ANGLE>。
参数说明:
ANGLE:校准角度,范围720~1800°(2~5 圈)。旋转圈数越多,统计误差越小,但需确保旋转速度均匀。
示例:
- 准备工作:将模块(连同固联设备,如机器人等)放置在水平、平整地面上,确保环境温度稳定,避免强烈振动干扰。
- 发送开始命令:如
CONFIG USRCAL START 720- 开始720°(2圈)校准。 - 执行校准动作:按照
<ANGLE>设定的角度以20~100 deg/s(约5~20秒转一圈)完成水平旋转,旋转方向任意(顺时针或逆时针),整个旋转(校准)过程需保持速度均匀,避免中途停顿、突然加减速等。 - 发送结束命令:当旋转完成后,确保实际旋转角度与ANGLE设定值的误差在±5°以内,发送
CONFIG USRCAL STOP指令完成校准。发送指令后,如果校准成功,则返回OK,否则返回ERR。
常见校准失败原因:
| 失败原因 | 说明 |
|---|---|
| 旋转操作不规范 | 确保模块放置水平、平稳 |
| 操作不当 | 转动太快或太慢,中途停顿 |
| 环境干扰 | 避免在有振动的设备附近操作,机器人电机振动过大等 |
| 校准后误差依然存在甚至更大 | 最有可能的原因是校准操作不规范。校准是一个精密的过程,假设标定时规定旋转720°,实际却旋转了725°,则比例因子则会错误的标定为5/720 = 0.6%,这已经远超出厂精度 |
LOG
开/关闭数据输出
LOG ENABLE- 全局使能数据帧输出LOG DISABLE- 全局禁止数据帧输出
模块版本信息
LOG VERSION - 查询并打印固件版本信息
显示串口配置信息
LOG COMCONFIG - 打印串口及输出协议配置信息
设置数据帧输出类型及频率
格式: LOG <MSG> <TYPE> <VALUE>
参数说明:
- MSG:数据帧种类,常用如
HI91、HI81、HI83、GGA、RMC、SXT等,具体可用项以对应产品和当前串口配置为准 - TYPE:输出触发方式,支持
ONTIME(定时输出)和ONMARK(同步脉冲触发或软件触发) - VALUE:当
TYPE=ONTIME时表示输出周期,单位为 s,可选范围:0.001(1 kHz)~1(1 Hz),其中0表示关闭定时输出;当TYPE=ONMARK时,1表示由SYNC_IN/PPS脉冲触发,ONCE表示手动触发一次输出
示例:
LOG HI91 ONTIME 0.01- 将当前串口的HI91数据帧输出周期设置为0.01 s(100 Hz)LOG HI91 ONTIME 0.05- 将当前串口的HI91数据帧输出周期设置为0.05 s(20 Hz)LOG HI91 ONTIME 0- 关闭HI91数据帧输出LOG HI91 ONMARK 1- 将当前串口的HI91数据帧配置为SYNC_IN/PPS引脚脉冲触发模式LOG HI91 ONMARK ONCE- 手动触发一次HI91数据输出,效果与SYNC_IN/PPS脉冲触发一次相同
HI83 可变数据帧配置
HI83 是可变长度二进制输出帧,适用于需要同时输出 IMU、姿态、时间、GNSS 或组合导航数据,并希望按需控制帧长的应用。HI83 的数据内容由 data_bitmap 决定,data_bitmap 中每一位对应一种数据段;置 1 表示输出该数据段,置 0 表示不输出。实际数据段在帧内按 bit 从低到高的顺序依次排列。
字段配置格式:LOG HI83 MAP <BITMAP>
<BITMAP>可使用十六进制或十进制形式,例如0x000000FF;data_bitmap各 bit 的含义见后文“可变类型协议(HI83)”章节;- HI83 字段位图默认值为
0x000000FF
常用配置示例:
| 指令 | 说明 |
|---|---|
LOG HI83 MAP 0x000000FF | 配置 HI83 默认字段组合:加速度、角速度、磁场、欧拉角、四元数、系统时间、UTC、气压 |
LOG HI83 MAP 0x0000001F | 配置 IMU + 姿态基础字段:加速度、角速度、磁场、欧拉角、四元数 |
LOG HI83 ONTIME 0.01 | 将当前串口的 HI83 数据帧输出周期设置为 0.01 s(100 Hz) |
LOG HI83 ONTIME 0 | 关闭当前串口的 HI83 定时输出 |
⚠️ 波特率注意事项 当输出帧率设置较高时(如 500 Hz),默认的
115200波特率可能无法满足输出带宽要求,此时建议将模块波特率提高到更高档位(如921600),以保证数据能够稳定输出。
FRESET
用于恢复模块默认用户配置。执行后模块会自动保存并复位,请谨慎使用。 部分校准相关参数可能保留,具体以当前固件行为为准。 示例:FRESET
RS-232/TTL/USB 数据协议(二进制)
RS-232、串口 TTL 以及 USB(虚拟串口)均属于流式串行数据接口,这些接口支持超核自定义二进制协议。
数据帧格式
| 域名称 | 值 | 长度(字节) | 说明 |
|---|---|---|---|
| SOF | 5A A5 | 2 | 帧头同步标志 |
| LEN | 1-4096 | 2 | 帧中数据域的长度,LSB(低字节在前)长度表示数据域的长度(不包含帧头、帧类型、长度及CRC) |
| CRC校验 | - | 2 | 对帧头、长度和数据域进行16位CRC校验(不包含CRC字段本身) |
| 数据域 | - | 1-4096 | 一帧携带的数据,由若干个子数据段组成。每个子数据段由标签和数据两部分组成,标签决定数据类型及长度 |
出厂默认输出
出厂默认输出: 浮点型 IMU 数据帧(HI91)
数据域内容
浮点型IMU数据帧(HI91)
数据域共76字节,包含模块ID、温度、IMU的原始数据、地磁、气压、融合后的姿态数据等。
| 字节偏移 | 名称 | 数据类型 | 大小(Byte) | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0 | tag | uint8_t | 1 | - | - | 数据标签:0x91 |
| 1 | main_status | uint16_t | 2 | - | - | 状态字,见 MAIN_STATUS 状态字说明 |
| 3 | temperature | int8_t | 1 | °C | 1 | 模块平均温度 |
| 4 | air_pressure | float | 4 | Pa | 1 | 气压 |
| 8 | system_time | uint32_t | 4 | ms | 1 | 当 GPS 时间未同步成功时,该字段为本地时间戳,即自系统上电以来累计的毫秒数;当 GPS 时间同步成功时,该字段对齐为 UTC 当日时间戳 |
| 12 | acc_b | float | 4×3 | G | 1 | 经过出厂校准后的加速度,顺序为:XYZ轴 1G = 1倍标准重力加速度(约9.8 m/s²) |
| 24 | gyr_b | float | 4×3 | deg/s | 1 | 经过出厂校准后的角速度,顺序为:XYZ轴 |
| 36 | mag_b | float | 4×3 | μT | 1 | 磁强度,顺序为:XYZ轴 |
| 48 | roll | float | 4 | deg | 1 | 横滚角 |
| 52 | pitch | float | 4 | deg | 1 | 俯仰角 |
| 56 | yaw | float | 4 | deg | 1 | 航向角 |
| 60 | quat | float | 4×4 | - | - | 节点四元数集合,顺序为WXYZ |
可变类型协议(HI83)
此协议所携带的数据可以配置,可根据 data_bitmap 输出不同的数据组合,协议帧大小也会随配置改变。
| 字节偏移 | 名称 | 数据类型 | 大小(Byte) | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0 | tag | uint8_t | 1 | - | - | 数据标签:0x83 |
| 1 | main_status | uint16_t | 2 | - | - | 状态字,见 MAIN_STATUS 状态字说明 |
| 3 | ins_status | uint8_t | 1 | - | - | 组合导航解状态(只针对组合导航产品): 0: 解无效:无GNSS信息,无法初始化位置 1:对准中: 位置初始化成功,但需要一定速度来完成组合导航滤波器初始化,从而进入组合导航状态 3:组合导航中: 当前已进入组合导航状态 6:惯性递推中: 当前处于组合导航状态,但GNSS信号丢失,处于纯惯导状态(隧道或地库等) |
| 4 | data_bitmap | uint32_t | 4 | - | - | 所携带数据段的位图标识 data_bitmap,可配置。每一位对应一种数据类型,后续数据段按位图从低位到高位的顺序依次排列 |
| 8 | - | - | 1-512 | - | - | 后续数据内容由 data_bitmap 定义。 |
data_bitmap位及数据段说明
| data_bitmap 位 | 名称 | 数据类型 | 大小 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0 | acc_b | float | 4x3 | m/s^(2) | 1 | IMU载体系, 经出厂校准的加速度,顺序:XYZ |
| 1 | gyr_b | float | 4x3 | rad/s | 1 | IMU载体系. 经出厂校准的角速度,顺序:XYZ |
| 2 | mag_b | float | 4x3 | μT | 1 | IMU载体系. 经校准的磁场强度,顺序:XYZ |
| 3 | rpy | float | 4x3 | deg | 1 | 姿态角(欧拉角) 顺序为 横滚角roll, 范围:180 - 180 俯仰角pitch, 范围: -90 - 90 航向角yaw, 范围:-180 - 180, 逆时针为正 |
| 4 | quat | float | 4x4 | - | 1 | 节点四元数集合,顺序为WXYZ |
| 5 | system_time_us | uint64_t | 8 | us | 1 | 该字段为本地高分辨率时间戳,即自系统上电以来累计的微秒数,每 1 us 递增 1 |
| 6 | utc | - | 8 | - | - | UTC 时间,共 8 字节: 年:1字节,如 24 表示 2024 年 月:1字节 日:1字节 时:1字节 分:1字节 秒:2字节,单位为 1 ms,例如 12 s 表示为 12000 保留:1字节 |
| 7 | air_pressure | float | 4 | Pa | 1 | 气压 |
| 8 | temperature | float | 4 | ℃ | 1 | 模块平均温度 |
| 9 | inclination | float | 4x3 | deg | 1 | 倾角仪输出, 顺序: 饶X轴, 饶Y轴, 饶Z轴 |
| 10 | heave_surge_sway | float | 4x3 | m | 1 | 船舶升沉位移信息,顺序: 垂荡(heave)、纵荡(surge)、横荡(sway) |
| 11 | heave_surge_sway_frq | float | 4x3 | Hz | 1 | 船舶升沉频率信息,顺序: 垂荡(heave)、纵荡(surge)、横荡(sway) |
| 12 | vel_enu | float | 4x3 | m/s | 1 | 导航系下东北天速度, 组合导航解算输出 |
| 13 | acc_enu | float | 4x3 | m/s^(2) | 1 | 导航系下东北天加速度, 组合导航解算输出 |
| 14 | ins_lon_lat_msl | double | 8x3 | - | 1 | 组合导航融合后的经纬度, 顺序: 经度(deg), 纬度(deg),海拔高度(m) |
| 15 | gnss_quality_nv | - | 4 | - | - | GNSS解状态组,共4字节, 顺序依次为 solq_pos: 1字节, 位置解状态 nv_pos: 1字节, 位置解使用卫星数 solq_heading: 1字节, 航向解状态 nv_heading: 1字节, 航向解使用卫星数 |
| 16 | od_speed | float | 4 | m/s | - | 外接里程计传感器速度 |
| 17 | undulation | float | 4 | m | 高程异常值 | |
| 18 | diff_age | float | 4 | s | RTK差分龄期 | |
| 19 | node_info | - | 4 | - | 设备版本及 ID 信息:node_id:1 字节,节点 ID 与 CAN ID 相同,范围 1~127保留:3 字节 | |
| 20-24 | 保留 | |||||
| 25 | event_counter | uint32_t | 4x16 | - | 1 | 内部量测事件计数器。常用顺序包括 gravity、mag、gnss_pos、gnss_vel、dual_heading、nhc、zupt、zaru、zihr、od,其余保留 |
| 26 | kf_acc_bias | float | 4x3 | m/s^(2) | 1 | 组合导航 KF 估计的加速度零偏,顺序:XYZ |
| 27 | kf_gyr_bias | float | 4x3 | rad/s | 1 | 组合导航 KF 估计的陀螺零偏,顺序:XYZ |
| 28 | gnss_std | float | 4x3 | - | 1 | GNSS 精度信息,顺序:位置标准差范数、速度标准差范数、保留 |
| 29 | gnss_heading_info | float | 4x3 | - | 1 | 双天线 GNSS 航向信息,顺序:基线长度(m)、俯仰角(deg)、航向角(deg) |
| 30 | gnss_lon_lat_msl | double | 8x3 | - | 1 | GNSS 原始经纬高,顺序:经度(deg)、纬度(deg)、海拔高度(m) |
| 31 | gnss_vel | float | 4x3 | m/s | 1 | GNSS 东北天速度,顺序:E、N、U |
MAIN_STATUS状态字说明
| 位 | 名称 | 描述 |
|---|---|---|
| 0-2 | 保留 | - |
| 3 | WB_CONV | 零偏收敛状态报警 1:当前零偏估计收敛精度差,建议将模块静止3~5 s以提高航向角精度 0:当前零偏收敛良好 |
| 4 | MAG_DIST | 磁场异常检测报警: 1:检测到当前环境磁场有干扰,或磁传感器未进行校准,或硬磁环境已经变化,9轴模式下航向角误差可能大 0:当前地磁环境良好,磁航向精度收敛,或系统处于6轴模式 |
| 5 | ACC_SAT | 加速度计量程饱和报警 1:当前或最近 2 s 内检测到加速度计量程饱和 0:当前未检测到加速度计量程饱和,且已连续 2 s 无饱和事件 |
| 6 | GYR_SAT | 陀螺仪量程饱和报警 1:当前或最近 2 s 内检测到陀螺仪量程饱和 0:当前未检测到陀螺仪量程饱和,且已连续 2 s 无饱和事件 |
| 7 | ATT_CONV | 姿态精度指示 1:当前姿态精度较差,AHRS姿态KF协方差较大,建议保持静止片刻以等待姿态精度恢复 0:当前姿态精度正常 |
| 8-9 | 保留 | - |
| 10 | MAG_AIDING | 磁参与姿态解算标志: 1:磁传感器正在参与航向计算(9轴模式) 0:磁传感器不参与航向计算(6轴模式) |
| 11 | UTC_SYNCED | 时间同步标志:1 表示未完成时间同步,此时 system_time 为本地时间;0 表示 UTC 时间同步成功,此时 HI91 中的 system_time 已对齐为当日 UTC 毫秒计数 |
| 12 | SOUT_PULSE | SOUT脉冲输出标志,用于与低速传感器(摄像头、LiDAR 等)进行时间同步:1 表示当前数据帧对应 SOUT 脉冲输出;0 表示当前数据帧不对应 SOUT 脉冲输出 |
| 13-15 | 保留 | - |
📝 兼容性说明
MAIN_STATUS状态字仅适用于产品固件版本 ≥ 1.7.0。
CRC校验
CRC校验采用 CRC-16/CCITT格式,C语言实现示例如下:
/*
currectCrc: previous crc value, set 0 if it's first section
src: source stream data
lengthInBytes: length
*/
static void crc16_update(uint16_t *currectCrc, const uint8_t *src, uint32_t lengthInBytes)
{
uint32_t crc = *currectCrc;
uint32_t j;
for (j=0; j < lengthInBytes; ++j)
{
uint32_t i;
uint32_t byte = src[j];
crc ^= byte << 8;
for (i = 0; i < 8; ++i)
{
uint32_t temp = crc << 1;
if (crc & 0x8000)
{
temp ^= 0x1021;
}
crc = temp;
}
}
*currectCrc = crc;
}数据帧结构示例(以HI91为例)
使用串口助手采样一帧数据(HI91数据帧),共82字节,前6字节为帧头、长度和CRC校验值,剩余76字节为数据域。假设数据接收到C语言数组buf中,如下所示:
5A A5 4C 00 14 BB 91 08 15 23 09 A2 C4 47 08 15 1C 00 CC E8 61 BE 9A 35 56 3E 65 EA 72 3F 31 D0 7C BD 75 DD C5 BB 6B D7 24 BC 89 88 FC 40 01 00 6A 41 AB 2A 70 C2 96 D4 50 41 ED 03 43 41 41 F4 F4 C2 CC CA F8 BE 73 6A 19 BE F0 00 1C 3D 8D 37 5C 3F数据解析表:
| 字段名称 | 类型 | 原始值 | 解析值 | 描述 |
|---|---|---|---|---|
| 帧头 | - | 5A A5 | - | 帧头 |
| 数据域长度 | - | 4C 00 | 0x004C = 76 | 数据域长度=76字节 |
| CRC | - | 14 BB | 0xBB14 | CRC校验值 |
| tag | - | 91 | 0x91 | 0x91 子数据段标签(从此字段开始为 payload 数据域) |
| main_status | uint16_t | 08 15 | 0x1508 | 状态字 |
| temperature | int8_t | 23 | 0x23 = 35 | 温度:°C |
| air_pressure | float | 09 A2 C4 47 | 100676 | 气压,Pa |
| system_time | uint32_t | 08 15 1C 00 | 0x001C1508 = 1840392 | 时间戳,ms |
| acc_b_x | float | CC E8 61 BE | -0.220615 | 加速度X轴,G |
| acc_b_y | float | 9A 35 56 3E | 0.209189 | 加速度Y轴,G |
| acc_b_z | float | 65 EA 72 3F | 0.948889 | 加速度Z轴,G |
| gyr_b_x | float | 31 D0 7C BD | -0.061722 | 角速度X轴,deg/s |
| gyr_b_y | float | 75 DD C5 BB | -0.00603836 | 角速度Y轴,deg/s |
| gyr_b_z | float | 6B D7 24 BC | -0.0100611 | 角速度Z轴,deg/s |
| mag_b_x | float | 89 88 FC 40 | 7.89167 | 磁场X轴,μT |
| mag_b_y | float | 01 00 6A 41 | 14.625 | 磁场Y轴,μT |
| mag_b_z | float | AB 2A 70 C2 | -60.0417 | 磁场Z轴,μT |
| roll | float | 96 D4 50 41 | 13.0519 | 横滚角,deg |
| pitch | float | ED 03 43 41 | 12.1885 | 俯仰角,deg |
| yaw | float | 41 F4 F4 C2 | -122.477 | 航向角,deg |
| q_w | float | CC CA F8 BE | -0.485922 | 四元数W |
| q_x | float | 73 6A 19 BE | -0.14982 | 四元数X |
| q_y | float | F0 00 1C 3D | 0.0380868 | 四元数Y |
| q_z | float | 8D 37 5C 3F | 0.860223 | 四元数Z |
C语言解析代码示例(以HI91为例)
以下示例给出常用的 C 语言解析片段:
校验CRC
int16_t payload_len;
uint16_t crc;
crc = 0;
payload_len = buf[2] + (buf[3] << 8);
/* Calculate 5A A5 and LEN field crc */
crc16_update(&crc, buf, 4);
/* Calculate payload crc */
crc16_update(&crc, buf + 6, payload_len);计算得到的CRC值为0xBB14,与数据帧中的CRC字段值相同,CRC校验通过。
定义数据接收结构
从 0x91 开始为该子数据段的数据域,下面给出示例数据结构体和常用转换宏:
#include "stdio.h"
#include "string.h"
/* Common type conversion */
#define U1(p) (*((uint8_t *)(p)))
#define I1(p) (*((int8_t *)(p)))
#define I2(p) (*((int16_t *)(p)))
static uint16_t U2(uint8_t *p) {uint16_t u; memcpy(&u,p,2); return u;}
static uint32_t U4(uint8_t *p) {uint32_t u; memcpy(&u,p,4); return u;}
static int32_t I4(uint8_t *p) {int32_t u; memcpy(&u,p,4); return u;}
static float R4(uint8_t *p) {float r; memcpy(&r,p,4); return r;}
typedef struct
{
uint8_t tag; /* Item tag: 0x91 */
float acc[3]; /* Acceleration */
float gyr[3]; /* Angular velocity */
float mag[3]; /* Magnetic field */
float eul[3]; /* Attitude: Euler angle */
float quat[4]; /* Attitude: quaternion */
float pressure; /* Air pressure */
uint32_t timestamp; /* Timestamp */
}imu_data_t;接收数据
从buf[6]=0x91开始为payload部分:
imu_data_t i0x91 = {0};
int offset = 6; /* Payload start at buf[6] */
i0x91.tag = U1(buf+offset+0);
i0x91.pressure = R4(buf+offset+4);
i0x91.timestamp = U4(buf+offset+8);
i0x91.acc[0] = R4(buf+offset+12);
i0x91.acc[1] = R4(buf+offset+16);
i0x91.acc[2] = R4(buf+offset+20);
i0x91.gyr[0] = R4(buf+offset+24);
i0x91.gyr[1] = R4(buf+offset+28);
i0x91.gyr[2] = R4(buf+offset+32);
i0x91.mag[0] = R4(buf+offset+36);
i0x91.mag[1] = R4(buf+offset+40);
i0x91.mag[2] = R4(buf+offset+44);
i0x91.eul[0] = R4(buf+offset+48);
i0x91.eul[1] = R4(buf+offset+52);
i0x91.eul[2] = R4(buf+offset+56);
i0x91.quat[0] = R4(buf+offset+60);
i0x91.quat[1] = R4(buf+offset+64);
i0x91.quat[2] = R4(buf+offset+68);
i0x91.quat[3] = R4(buf+offset+72);打印接收到的数据
printf("%-16s0x%X\r\n", "tag:", i0x91.tag);
printf("%-16s%8.4f %8.4f %8.4f\r\n", "acc(G):", i0x91.acc[0], i0x91.acc[1], i0x91.acc[2]);
printf("%-16s%8.3f %8.3f %8.3f\r\n", "gyr(deg/s):", i0x91.gyr[0], i0x91.gyr[1], i0x91.gyr[2]);
printf("%-16s%8.3f %8.3f %8.3f\r\n", "mag(uT):", i0x91.mag[0], i0x91.mag[1], i0x91.mag[2]);
printf("%-16s%8.3f %8.3f %8.3f\r\n", "eul(deg):", i0x91.eul[0], i0x91.eul[1], i0x91.eul[2]);
printf("%-16s%8.3f %8.3f %8.3f %8.3f\r\n", "quat:", i0x91.quat[0], i0x91.quat[1], i0x91.quat[2], i0x91.quat[3]);
printf("%-16s%8.3f\r\n", "pressure(pa):", i0x91.pressure);
printf("%-16s%d\r\n", "timestamp(ms):", i0x91.timestamp);最大传输速率
| 协议 | 字节数 | 9600bps | 115200bps | 230400bps | 256000bps | 460800bps | 921600bps |
|---|---|---|---|---|---|---|---|
| HI91 | 76 | 10Hz | 100Hz | 250Hz | 250Hz | 500Hz | 1000Hz |
RS-485输出协议(Modbus)
Modbus 协议是工业自动化领域常用的通用协议,可运行于 RS485 或以太网接口。带有 RS485 或以太网接口的相关产品通常支持 Modbus,具体以实际产品型号和交付配置为准。
当前固件默认将 Modbus 从站挂载在 COM1 对应的 RS485 通道上。若产品存在多接口或定制通信映射,请以实际交付配置为准。
Modbus指令说明
RS485通讯协议遵循Modbus RTU协议规范,数据以寄存器为单位进行发送和接收,每个寄存器占用2个字节,采用大端模式(高字节在前)。采用标准Modbus CRC校验。
支持的功能码:
- 0x06(Write Single Register):写单个寄存器(每个Modbus寄存器为2个字节)
- 0x03(Read Holding Registers):读取单个或多个寄存器数据
- 0x50(自定义功能码):用于 Modbus ID 自动分配等场景,便于量产部署和固件升级
出厂默认节点 ID: 80 (0x50)
数据帧格式
读寄存器(0x03)
主机发送:
| 域名称 | 值 | 说明 |
|---|---|---|
| ID | 1-0xFF | Modbus 节点ID |
| FUN_CODE | 0x03 | 命令码 |
| ADDR_H | - | 要读取的寄存器地址高8位 |
| ADDR_L | - | 要读取的寄存器地址低8位 |
| LEN_H | - | 要读取寄存器长度高8位(以寄存器个数为单位) |
| LEN_L | - | 要读取寄存器长度低8位(以寄存器个数为单位) |
| CRC_L | - | CRC低8位 |
| CRC_H | - | CRC高8位 |
从机(模块)返回:
| 域名称 | 值 | 说明 |
|---|---|---|
| ID | 1-0xFF | Modbus 节点ID |
| FUN_CODE | 0x03 | 命令码 |
| LEN | - | 返回寄存器数据的长度(不算ID,FUN_CODE,LEN,CRC字段)以字节为单位 |
| DATAH | - | 返回数据高8位 |
| DATAL | - | 返回数据低8位 |
| ... | - | 更多返回数据 |
| CRC_L | - | CRC低8位 |
| CRC_H | - | CRC高8位 |
写寄存器(0x06)
主机发送:
| 域名称 | 值 | 说明 |
|---|---|---|
| ID | 1-0xFF | Modbus 节点ID |
| FUN_CODE | 0x06 | 命令码 |
| ADDR_H | - | 寄存器地址高8位 |
| ADDR_L | - | 寄存器地址低8位 |
| DATA_H | - | 写入数据高8位 |
| DATA_L | - | 写入数据低8位 |
| CRC_L | - | CRC低8位 |
| CRC_H | - | CRC高8位 |
从机返回:
| 域名称 | 值 | 说明 |
|---|---|---|
| ID | 1-0xFF | Modbus 节点ID |
| FUN_CODE | 0x06 | 命令码 |
| ADDR_H | - | 寄存器地址高8位 |
| ADDR_L | - | 寄存器地址低8位 |
| DATA_H | - | 写入数据高8位 |
| DATA_L | - | 写入数据低8位 |
| CRC_L | - | CRC低8位 |
| CRC_H | - | CRC高8位 |
寄存器列表
| 地址(Hex) | 地址(Dec) | 名称 | 类型 | 功能 | R/W | 说明 |
|---|---|---|---|---|---|---|
| 0x00 | 0 | CTRL | u16 | 控制 | W | 参见控制寄存器说明 |
| 0x04 | 4 | UART1_BAUD | u16 | 波特率 | R/W | 串口波特率 |
| 0x05 | 5 | MD_ID | u16 | Modbus ID | R/W | Modbus ID: 有效范围: 1-128 |
| 0x06 | 6 | HEADING_MODE | u16 | 航向角模式 | R/W | 0: 6轴模式(相对航向,航向角上电为0). 1:9轴模式(地磁融合,绝对航向) |
| 0x34 | 52 | ACCX | i16 | 加速度X | R | 单位:G(1G = 1×重力加速度), 比例因子:0.00048828 |
| 0x35 | 53 | ACCY | i16 | 加速度Y | R | 单位:G(1G = 1×重力加速度), 比例因子:0.00048828 |
| 0x36 | 54 | ACCZ | i16 | 加速度Z | R | 单位:G(1G = 1×重力加速度), 比例因子:0.00048828 |
| 0x37 | 55 | GYRX | i16 | 角速度X | R | 单位deg/s, 比例因子:0.061035 |
| 0x38 | 56 | GYRY | i16 | 角速度Y | R | 单位deg/s, 比例因子:0.061035 |
| 0x39 | 57 | GYRZ | i16 | 角速度Z | R | 单位deg/s, 比例因子:0.061035 |
| 0x3A | 58 | MAGX | i16 | 磁强度X | R | 单位uT, 比例因子: 0.030517 |
| 0x3B | 59 | MAGY | i16 | 磁强度Y | R | 单位uT, 比例因子: 0.030517 |
| 0x3C | 60 | MAGZ | i16 | 磁强度Z | R | 单位uT, 比例因子: 0.030517 |
| 0x3D | 61 | R_H | i32 | 横滚角高16位 | R | 单位deg, 比例因子:0.001 |
| 0x3E | 62 | R_L | - | 横滚角低16位 | R | 单位deg, 比例因子:0.001 |
| 0x3F | 63 | P_H | i32 | 俯仰角高16位 | R | 单位deg, 比例因子:0.001 |
| 0x40 | 64 | P_L | - | 俯仰角低16位 | R | 单位deg, 比例因子:0.001 |
| 0x41 | 65 | Y_H | i32 | 航向角高16位 | R | 单位deg, 比例因子:0.001 |
| 0x42 | 66 | Y_L | - | 航向角低16位 | R | 单位deg, 比例因子:0.001 |
| 0x43 | 67 | TEMP | i16 | 温度 | R | 单位℃, 比例因子:0.01 |
| 0x44 | 68 | PRS_H | i32 | 气压高16位 | R | 单位Pa, 比例因子:0.01 |
| 0x45 | 69 | PRS_L | - | 气压低16位 | R | 单位Pa, 比例因子:0.01 |
| 0x46 | 70 | Q0 | u16 | 四元数QW | R | 四元数,比例因子: 0.0001 |
| 0x47 | 71 | Q1 | u16 | 四元数QX | R | 四元数,比例因子: 0.0001 |
| 0x48 | 72 | Q2 | u16 | 四元数QY | R | 四元数,比例因子: 0.0001 |
| 0x49 | 73 | Q3 | u16 | 四元数QZ | R | 四元数,比例因子: 0.0001 |
| 0x4A | 74 | INCLI_X | i16 | 倾角仪X轴角度 | R | 双轴倾角仪产品:X角度, ±180,单位deg, 比例因子: 0.011 单轴倾角仪产品:X角度, 0-360, 单位deg, 比例因子: 0.011 |
| 0x4B | 75 | INCLI_Y | i16 | 倾角仪Y轴角度 | R | 双轴倾角仪Y角度: ±90, 单位deg,比例因子: 0.011 单轴倾角仪: 此寄存器保留 |
| 0x4E | 78 | HEVAE | i16 | 船舶垂荡 | R | 船舶垂荡位移输出, 单位 m, 比例因子 0.01 |
| 0x51 | 81 | HEAVE_PERIOD | i16 | 船舶垂荡周期 | R | 船舶垂荡位移周期, 单位s, 比例因子 0.001 |
| 0x70-0x77 | 112-119 | PNAME | u16 | 设备名 | R | 设备名字符串, ASCII码,共占8个寄存器 |
| 0x78 | 120 | SW_VERSION | u16 | 软件版本 | R | 软件版本 |
| 0x79 | 121 | BL_VERSION | u16 | BL版本 | R | BL版本 |
| 0x7F-0x82 | 127-130 | SN | u16 | 产品唯一序列号 | R | 产品唯一序列号, 占4寄存器 |
| 0xA5 | 165 | ATT_RST | u16 | 自动校平 | W | 3: 执行一次自动调平: 如果当前俯仰角/横滚角接近0°,0°(水平正面放置), 则自动校准到0,0. 前如果当前俯仰角/横滚角接近0° 或 180°(水平倒放),则自动校准到 0°,180° 适用于机器人安装环境。 其中,“接近”定义为 Pitch Roll均小于15° 5: 取消自动调平,恢复绝对测量角度 其他值: 无效 |
控制寄存器说明(寄存器地址: 0x00)
| 命令 | CTL寄存器写入值 |
|---|---|
| 保存所有配置参数到 Flash | 0x0000 |
| 恢复出厂设置 | 0x0001 |
| 复位 | 0x00FF |
常用配置
📝 注意 以下所有配置示例均以 Modbus 地址
0x50(出厂默认)为例。若用户已修改 Modbus ID,则需要同步修改报文中的 ID 字段和 CRC。
保存配置到 Flash
50 06 00 00 00 00 84 4B
恢复出厂设置
50 06 00 00 00 01 45 8B
⚠️ 执行后将恢复模块默认用户配置,并自动保存后复位。部分校准相关参数可能保留。
复位
50 06 00 00 00 FF C4 0B
配置波特率(0x04)
| 配置目标波特率 | 指令(Hex)ID=0x50(出厂默认) |
|---|---|
| 4800 | 50 06 00 04 00 00 C5 8A |
| 9600 | 50 06 00 04 00 01 04 4A |
| 19200 | 50 06 00 04 00 02 44 4B |
| 38400 | 50 06 00 04 00 03 85 8B |
| 57600 | 50 06 00 04 00 04 C4 49 |
| 115200 | 50 06 00 04 00 05 05 89 |
| 230400 | 50 06 00 04 00 06 45 88 |
| 460800 | 50 06 00 04 00 07 84 48 |
| 921600 | 50 06 00 04 00 08 C4 4C |
配置节点 ID(0x05)
格式:[CURRENT_ID] 06 00 05 00 [NEW_ID] CRC(2字节)
参数说明:
CURRENT_ID:当前 Modbus 节点 IDNEW_ID:新的目标 Modbus 节点 ID
示例(当前节点 ID = 0x50):
- 设置
NEW_ID=0x50:50 06 00 05 00 50 94 76 - 设置
NEW_ID=0x51:50 06 00 05 00 51 55 B6 - 设置
NEW_ID=0x52:50 06 00 05 00 52 15 B7 - 设置
NEW_ID=0x53:50 06 00 05 00 53 D4 77
⚠️ 重要提示 修改成功后,Modbus 地址会立即生效。主机侧后续发送时,需要将
CURRENT_ID切换为新的节点 ID。若不熟悉 Modbus 报文构造,建议使用上位机工具完成配置。
设置安装方式(0xA6)
| 配置目标安装方式 | 指令(Hex)ID=0x50(出厂默认) |
|---|---|
| 水平,Z轴朝上安装(默认值) | 50 06 00 A6 00 18 64 62 |
| 绕X轴旋转-90°(Y轴正方向朝下的垂直安装) | 50 06 00 A6 00 2B 24 77 |
| 绕X轴旋转90°(Y轴正方向朝上的垂直安装) | 50 06 00 A6 00 34 65 BF |
| 绕Y轴旋转90°(X轴正方向朝上的垂直安装) | 50 06 00 A6 02 08 64 CE |
| 绕Y轴旋转-90°(X轴正方向朝下垂直安装) | 50 06 00 A6 01 A5 A5 83 |
设置水平校准(0xA5)
- 启动自动水平校平:
50 06 00 A5 00 02 15 A9 - 取消自动水平校平:
50 06 00 A5 00 05 54 6B
设置6轴或9轴模式(0x06)
- 设置为6轴模式:
50 06 00 06 00 00 64 4A - 设置为9轴模式:
50 06 00 06 00 01 A5 8A
读取模块版本信息(0x70-0x82)
读取模块产品名、软件版本及SN号:请求帧: 50 03 00 70 00 14 49 9F
| 字段 | 值 | 说明 |
|---|---|---|
| Modbus节点ID | 0x50 | Modbus节点ID |
| 功能码 | 0x03 | 读保持寄存器 |
| 起始地址 | 0x0070 | 产品信息起始地址 |
| 读取长度 | 0x0014 | 读取20个寄存器 |
| CRC校验 | 0x9F49 | - |
响应帧: 50 03 28 48 49 31 34 52 32 4E 2D 34 38 35 2D 30 30 30 00 00 98 00 6B 00 00 00 00 00 00 00 00 00 00 04 7D 95 5F 8D 2A 17 08 00 00 4D 0C
| 字段 | 数据 | 说明 |
|---|---|---|
| Modbus节点ID | 0x50 | Modbus节点ID |
| 功能码 | 0x03 | 功能码 |
| 数据长度 | 0x28 | 返回40字节数据 ,一共请求读取20个寄存器, 每个寄存器2字节 |
| 产品名 | 48 49...30 30 | CH10x(M) |
| 软件版本 | 0x98 | V1.52 |
| 引导版本 | 0x6B | V1.07 |
| 序列号 | 047D955F8D2A1708 | SN码 |
读取传感器数据(0x34-0x4B)
请求帧: 50 03 00 34 00 18 09 8F
| 字段 | 值 | 说明 |
|---|---|---|
| Modbus节点ID | 0x50 | Modbus节点ID |
| 功能码 | 0x03 | 读保持寄存器 |
| 起始地址 | 0x0034 | 传感器数据起始地址 |
| 读取长度 | 0x0018 | 读取24个寄存器 |
| CRC校验 | 0x8F09 | - |
响应帧: 50 03 30 FF 01 03 B0 06 50 FC C9 FF 7C 00 91 01 D5 FD DB FD 27 00 00 21 FF 00 00 7F F6 FF FD 73 E7 00 00 00 00 00 00 10 A6 0D 59 DD 4E 86 A8 06 30 17 82 1E CE
数据解析示例:
加速度(单位:G,可取9.8m/s²):
| 轴向 | 寄存器值(HEX) | 原始值(DEC) | 比例因子 | 计算得出物理值 |
|---|---|---|---|---|
| X | FF 01 | -255 | 0.00048828 | -0.1245 |
| Y | 03 B0 | 944 | 0.00048828 | 0.4609 |
| Z | 06 50 | 1616 | 0.00048828 | 0.7891 |
角速度(单位:deg/s):
| 轴向 | 寄存器值(HEX) | 原始值(DEC) | 比例因子 | 计算得出物理值 |
|---|---|---|---|---|
| X | FC C9 | -823 | 0.061035 | -50.2318 |
| Y | FF 7C | -132 | 0.061035 | -8.0566 |
| Z | 00 91 | 145 | 0.061035 | 8.8501 |
磁场(单位:μT):
| 轴向 | 寄存器值(HEX) | 原始值(DEC) | 比例因子 | 计算得出物理值 |
|---|---|---|---|---|
| X | 01 D5 | 469 | 0.030517 | 14.3125 |
| Y | FD DB | -549 | 0.030517 | -16.7538 |
| Z | FD 27 | -729 | 0.030517 | -22.2469 |
欧拉角(单位:deg):
| 轴向 | 寄存器值(HEX) | 原始值(DEC) | 比例因子 | 计算得出物理值 |
|---|---|---|---|---|
| 横滚(Roll) | 00 00 21 FF | 8703 | 0.001 | 8.703 |
| 俯仰角(Pitch) | 00 00 7F F6 | 32758 | 0.001 | 32.758 |
| 航向角(Yaw) | FF FD 73 E7 | -166937 | 0.001 | -166.937 |
CAN数据协议(J1939)
支持 CAN 输出的相关产品通常默认采用 J1939 协议,严格遵循 SAE J1939 国际标准。J1939 是基于 CAN 2.0B 扩展帧格式的高层协议,广泛应用于商用车辆和工业设备的网络通信。有关 J1939 协议的更多细节可参考这里。
CAN扩展帧格式
J1939使用CAN 2.0B扩展帧格式,29位标识符结构如下:
位域分布(MSB → LSB):
[28:26] Priority (P) - 优先级(3位)
[25] Reserved (R) - 保留位(1位)
[24] Data Page (DP) - 数据页(1位)
[23:16] PDU Format (PF) - PDU格式(8位)
[15:8] PDU Specific (PS)- PDU特定(8位)
[7:0] Source Address - 源地址(8位)标识符计算公式:
CAN_ID = (Priority << 26) | (Reserved << 25) | (DataPage << 24) | (PF << 16) | (PS << 8) | SourceAddress数据字节序(Endianness)
重要说明: J1939协议采用**小端序(Little-Endian)**数据格式:
多字节数据:低位字节在前,高位字节在后
位序:LSB(Least Significant Bit)在低位
示例:32位整数0x12345678在CAN帧中的字节顺序为:
78 56 34 12
CANFD 支持
本节描述 CANFD 数据输出的协议格式。具体产品是否支持 CANFD、以及当前固件是否启用 CANFD 功能,以实际产品型号和固件配置为准。
当产品支持并启用 CANFD 输出时,CANFD 帧控制域波特率与经典 CAN 2.0B 模式相同,FD 帧数据域波特率通常配置为 4Mbps,数据长度为 64 字节。
协议参数配置
| 参数项 | 配置值 | 说明 |
|---|---|---|
| CAN波特率 | 500Kbps(默认) | 支持125K/250K/500K/800K/1000K |
| 帧格式 | CAN 2.0B扩展帧(29位标识符) | 符合J1939标准 |
| 数据长度 | 8字节(经典J1939) | 经典PGN数据载荷长度,CANFD数据帧请见对应章节 |
| 帧优先级 | 3(默认) | 范围:0-7,0为最高优先级 |
| 默认节点地址 | 8 | 可配置范围:1-127, 广播地址:255 |
| PF (PDU Format) | 0xFF(专有PGN) | 厂商自定义PGN范围 |
| PS (PDU Specific) | 数据类型标识 | 区分不同的传感器数据类型 |
| 数据格式 | 小端序(LSB优先) | 多字节数据低位在前 |
| 数据类型 | 有符号/无符号整型 | 根据具体PGN定义 |
PGN消息列表
本产品支持多种传感器数据的J1939 PGN消息,所有PGN均采用厂商自定义格式(PF=0xFF)。大多数经典J1939 PGN包含8字节数据载荷,采用小端序编码;CANFD数据帧请见对应章节。
PGN 65327(0xFF2F)- 时间信息
功能描述: 提供UTC时间信息输出,用于状态查看或上位机解析。
CAN标识符格式: 0x0CFF2F[SA]
- Priority: 3 (0x0C)
- PF: 0xFF, PS: 0x2F
- SA: 源地址(默认0x08)
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0 | UTC年 | uint8 | 0-99 | 年 | 1 | 20代表2020年 |
| 1 | UTC月 | uint8 | 0-12 | 月 | 1 | 1-12表示月份 |
| 2 | UTC日 | uint8 | 0-31 | 日 | 1 | 1-31表示日期 |
| 3 | UTC时 | uint8 | 0-23 | 时 | 1 | 24小时制 |
| 4 | UTC分 | uint8 | 0-59 | 分 | 1 | 分钟 |
| 5 | UTC秒 | uint8 | 0-59 | 秒 | 1 | 秒 |
| 6-7 | UTC毫秒 | uint16 | 0-999 | ms | 1 | 毫秒,小端序存储 |
输出示例:
CAN ID: 0x0CFF2F08
数据: 18 06 12 0E 1E 2D 58 02
解析: 2024年6月18日 14:30:45.600 UTCPGN 65332(0xFF34)- 三轴加速度
功能描述: 提供三轴加速度测量数据
CAN标识符格式: 0x0CFF34[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-1 | 加速度X | int16 | ±32767 | G | 0.00048828 | X轴加速度,小端序 |
| 2-3 | 加速度Y | int16 | ±32767 | G | 0.00048828 | Y轴加速度,小端序 |
| 4-5 | 加速度Z | int16 | ±32767 | G | 0.00048828 | Z轴加速度,小端序 |
| 6-7 | 保留 | uint16 | 0 | - | - | 保留字段,固定为0 |
PGN 65335(0xFF37)- 三轴角速度
功能描述: 提供三轴角速度(陀螺仪)测量数据
CAN标识符格式: 0x0CFF37[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-1 | 角速度X | int16 | ±32767 | deg/s | 0.061035 | X轴角速度,小端序 |
| 2-3 | 角速度Y | int16 | ±32767 | deg/s | 0.061035 | Y轴角速度,小端序 |
| 4-5 | 角速度Z | int16 | ±32767 | deg/s | 0.061035 | Z轴角速度,小端序 |
| 6-7 | 保留 | uint16 | 0 | - | - | 保留字段,固定为0 |
PGN 65341(0xFF3D)- 俯仰横滚角
功能描述: 提供俯仰角和横滚角姿态信息
CAN标识符格式: 0x0CFF3D[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-3 | 横滚角(Roll) | int32 | ±180000000 | deg | 0.001 | 横滚角,小端序 |
| 4-7 | 俯仰角(Pitch) | int32 | ±90000000 | deg | 0.001 | 俯仰角,小端序 |
PGN 65345(0xFF41)- 航向角
功能描述: 提供航向角(偏航角)信息,支持两种表示方式
CAN标识符格式: 0x0CFF41[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-3 | 航向角(0-360°) | uint32 | 0-360000000 | deg | 0.001 | 0-360°表示,顺时针为正,小端序 |
| 4-7 | 航向角(±180°) | int32 | ±180000000 | deg | 0.001 | ±180°表示,逆时针为正,小端序 |
PGN 65338(0xFF3A)- 三轴磁场强度
功能描述: 提供三轴磁场强度测量数据
CAN标识符格式: 0x0CFF3A[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-1 | 磁场强度X | int16 | ±32767 | μT | 0.030517 | X轴磁场强度,小端序 |
| 2-3 | 磁场强度Y | int16 | ±32767 | μT | 0.030517 | Y轴磁场强度,小端序 |
| 4-5 | 磁场强度Z | int16 | ±32767 | μT | 0.030517 | Z轴磁场强度,小端序 |
| 6-7 | 保留 | uint16 | 0 | - | - | 保留字段,固定为0 |
PGN 65350(0xFF46)- 四元数
功能描述: 提供姿态四元数表示
CAN标识符格式: 0x0CFF46[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-1 | 四元数 qw | int16 | ±32767 | - | 0.0001 | 四元数实部,小端序 |
| 2-3 | 四元数 qx | int16 | ±32767 | - | 0.0001 | 四元数i分量,小端序 |
| 4-5 | 四元数 qy | int16 | ±32767 | - | 0.0001 | 四元数j分量,小端序 |
| 6-7 | 四元数 qz | int16 | ±32767 | - | 0.0001 | 四元数k分量,小端序 |
PGN 65354(0xFF4A)- 倾角仪输出
功能描述: 专用于倾角仪产品的角度输出。
适用范围: 仅适用于启用 J1939 输出的倾角仪产品及固件配置
CAN标识符格式: 0x0CFF4A[SA]
数据格式:
| 字节位置 | 字段名称 | 数据类型 | 取值范围 | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0-3 | X轴倾角 | int32 | 0-360000000 | deg | 0.001 | X轴倾角,可配置0-360°或±180° |
| 4-7 | Y轴倾角 | int32 | 0-360000000 | deg | 0.001 | Y轴倾角,可配置0-360°或±90° |
PGN 65370(0xFF5A)- CANFD数据帧0 - IMU数据
功能描述: 当产品支持并启用 CANFD 输出时,可输出 CANFD 数据帧0,包含打包后的 IMU 数据,帧长为 64 字节。
适用范围: 仅适用于支持并启用 CANFD 输出的产品及固件配置
CAN标识符格式: 0x0CFF5A[SA]
数据格式:
数据域共64字节,包含主状态、时间戳、IMU原始数据、姿态角、四元数、温度等信息。
| 字节偏移 | 名称 | 数据类型 | 大小(Byte) | 单位 | 比例因子 | 说明 |
|---|---|---|---|---|---|---|
| 0 | main_status | uint16 | 2 | - | - | 状态字,见 MAIN_STATUS 状态字说明 |
| 2 | reserved | uint8 | 1 | - | - | 保留 |
| 3 | reserved | uint8 | 1 | - | - | 保留 |
| 4 | system_time | uint32 | 4 | ms | 1 | 本地时间戳(系统开机累计ms) |
| 8 | acc_x | int16 | 2 | g | 0.00048828 | 加速度X |
| 10 | acc_y | int16 | 2 | g | 0.00048828 | 加速度Y |
| 12 | acc_z | int16 | 2 | g | 0.00048828 | 加速度Z |
| 14 | gyr_x | int16 | 2 | deg/s | 0.061035 | 角速度X |
| 16 | gyr_y | int16 | 2 | deg/s | 0.061035 | 角速度Y |
| 18 | gyr_z | int16 | 2 | deg/s | 0.061035 | 角速度Z |
| 20 | mag_x | int16 | 2 | uT | 0.030517 | 磁强度X |
| 22 | mag_y | int16 | 2 | uT | 0.030517 | 磁强度Y |
| 24 | mag_z | int16 | 2 | uT | 0.030517 | 磁强度Z |
| 26 | roll | int32 | 4 | deg | 0.001 | 横滚角 |
| 30 | pitch | int32 | 4 | deg | 0.001 | 俯仰角 |
| 34 | yaw | int32 | 4 | deg | 0.001 | 航向角 |
| 38 | qw | int16 | 2 | - | 0.0001 | 四元数w |
| 40 | qx | int16 | 2 | - | 0.0001 | 四元数x |
| 42 | qy | int16 | 2 | - | 0.0001 | 四元数y |
| 44 | qz | int16 | 2 | - | 0.0001 | 四元数z |
| 46 | temp | int16 | 2 | ℃ | 0.01 | 模块平均温度 |
| 48 | reserved | uint8 | 16 | - | - | 保留 |
配置协议
协议格式
本产品采用基于 J1939 的配置协议,支持主机对部分设备参数进行读写。配置消息使用专用 PGN,并通过标准 J1939 扩展帧格式传输。
配置帧格式:
- CAN标识符:
0x0CEF[DA][SA] - SA: 源地址,表示发起配置请求的主机地址,可按主机侧规划分配
- DA: 目的地址,通常为产品节点 ID,也可使用广播地址 255
数据载荷格式:
| 字节位置 | 字段名称 | 数据类型 | 说明 |
|---|---|---|---|
| 0-1 | ADDR | uint16 | 寄存器地址,小端序 |
| 2 | CMD | uint8 | 命令类型(0x06=写,0x03=读) |
| 3 | STATUS | uint8 | 状态字段(写命令时为0,读响应时为状态) |
| 4-7 | VAL | uint32 | 数据值,小端序 |
寄存器地址映射
见 Modbus 协议章节中的寄存器列表。
配置示例
以下配置示例以出厂默认节点 ID 8 为例。
| 29'b 拓展帧地址 | 数据 | 描述 | 说明 |
|---|---|---|---|
| 0x0CEF08xx | 2F 01 06 00 [VAL] | VAL: 4字节 | PGN:FF2F(UTC时间) 发送间隔,单位ms, 范围:5 - 1000 |
| 0x0CEF08xx | 34 01 06 00 [VAL] | VAL: 4字节 | PGN:FF34(加速度) 发送间隔,单位ms, 范围:5 - 1000 |
| 0x0CEF08xx | 37 01 06 00 [VAL] | VAL: 4字节 | PGN:FF37(角速度) 发送间隔,单位ms, 范围:5 - 1000 |
| 0x0CEF08xx | 3D 01 06 00 [VAL] | VAL: 4字节 | PGN:FF3D(俯仰横滚) 发送间隔,单位ms, 范围:5-1000 |
| 0x0CEF08xx | 41 01 06 00 [VAL] | VAL: 4字节 | PGN:FF41(航向角) 发送间隔,单位ms, 范围:5 -1000 |
| 0x0CEF08xx | 3A 01 06 00 [VAL] | VAL: 4字节 | PGN:FF3A(磁强度) 发送间隔,单位ms, 范围:5 -1000 |
| 0x0CEF08xx | 46 01 06 00 [VAL] | VAL: 4字节 | PGN:FF46(四元数) 发送间隔,单位ms, 范围:5 -1000 |
| 0x0CEF08xx | 4A 01 06 00 [VAL] | VAL: 4字节 | PGN:FF4A(倾角仪输出) 发送间隔,单位ms, 范围:5 -1000 |
| 0x0CEF08xx | 5A 01 06 00 [VAL] | VAL: 4字节 | PGN:FF5A(CANFD帧0) 发送间隔,单位ms, 范围:5 -1000,仅在支持并启用 CANFD 输出时有效 |
| 0x0CEF08xx | 96 00 06 00 [PGN] | PGN: 4字节 | 同步触发输出。例如 PGN=0xFF34(加速度)时,发送 96 00 06 00 34 FF 00 00 可触发模块发送一次加速度帧。该请求无响应帧,发送成功后模块直接输出相应数据帧 |
| 0x0CEF08xx | A5 00 06 00 [VAL] | VAL: 4字节 | VAL=1 航向复位:重置航向角为 0VAL=2 设置相对零点:将当前 Pitch、Roll 角度设置为零VAL=3 自动校平:自动校准到水平位置VAL=5 取消水平校平:清除相对 Pitch、Roll 角度 |
| 0x0CEF08xx | 9D 00 06 00 01 00 00 00 | - | 全局使能节点数据输出(默认) |
| 0x0CEF08xx | 9D 00 06 00 00 00 00 00 | - | 全局关闭节点数据输出 |
| 0x0CEF08xx | 00 00 06 00 00 00 00 00 | - | 保存所有配置参数到 Flash |
| 0x0CEF08xx | 00 00 06 00 01 00 00 00 | - | 恢复模块默认用户配置,执行后自动保存并复位 |
| 0x0CEF08xx | 00 00 06 00 FF 00 00 00 | - | 复位 |
| 0x0CEF08xx | 9A 00 06 00 [VAL] | VAL: 4字节 | 配置波特率(保存设置,复位生效): 0:1000K, 1:800K, 2:500K, 3:250K, 4:125K |
| 0x0CEF08xx | 9C 00 06 00 [VAL] | VAL: 4字节 | 设置J1939 节点ID: 1-127 |
| 0x0CEF08xx | 9E 00 06 00 [VAL] | VAL: 4字节 | 设置倾角仪X轴正负方向, 0:默认 1:反向 |
| 0x0CEF08xx | 9F 00 06 00 [VAL] | VAL: 4字节 | 设置倾角仪Y轴正负方向, 0:默认 1:反向 |
📋 地址说明
- 地址域中xx:J1939协议标识符的源地址(SA),可为任意字节
- 数据域中xx:任意字节
示例: ID=0x0CEF0855,DATA = 37 01 06 00 64 00 00 00:将PGN:FF37(角速度)设置为100ms周期(10Hz)
时间同步
当前固件中,J1939 的 PGN 65327(时间信息)用于输出UTC时间信息,不作为模块内部时钟的对时输入通道。
如需对模块时间进行UTC同步,请使用前文“同步输入 - SYNC_IN/PPS”章节中描述的 PPS + 串口时间消息方案。
使用说明
- PGN 65327 可用于读取模块当前输出的UTC时间信息;
- 当前固件不支持通过发送 J1939 时间帧来校准模块内部时钟;
- 如项目需要高精度时间同步,请参见前文 PPS 接入与串口时间同步配置要求。
输出示例
以下示例表示模块通过 J1939 输出一帧时间信息,供主机解析当前UTC时间:
CAN ID: 0x0CFF2F08
数据: 18 06 12 0E 1E 2D 58 02
解析:
- UTC年: 0x18 = 24 (2024年)
- UTC月: 0x06 = 6 (6月)
- UTC日: 0x12 = 18 (18日)
- UTC时: 0x0E = 14 (14时)
- UTC分: 0x1E = 30 (30分)
- UTC秒: 0x2D = 45 (45秒)
- UTC毫秒: 0x0258 = 600 (600毫秒)CAN数据协议(CANopen)
支持 CAN 接口的相关产品通常默认采用 J1939 协议栈。部分产品或交付配置支持 CANopen 从站通信,是否启用以实际产品型号和交付配置为准。CANopen 通信使用标准数据帧,常用数据通过 TPDO1/2/3/4/6/7 传输,不使用远程帧和扩展数据帧。默认配置下,TPDO 采用异步定时触发模式;如需同步模式,可参考后文“同步协议”章节。
CANopen 默认设置
以下默认值适用于常规交付配置,具体仍以实际产品型号和交付配置为准。
| 默认配置 | 值 |
|---|---|
| CAN波特率 | 500 kbit/s |
| 节点ID | 8 |
| 初始化状态 | Operational |
| TPDO输出速率 | 1Hz - 200Hz(每个TPDO) |
CANopen TPDO
| 通道 | 帧ID | 数据长度(DLC) | 传输方式 | 输出频率(Hz) | 数据 | 说明 |
|---|---|---|---|---|---|---|
| TPDO1 | 0x180+ID | 6 | 异步定时(0xFE) | 100 | 加速度 | 类型:int16,低字节在前,每个轴2字节,共6字节 分别为X、Y、Z轴加速度,单位为mG(0.001G) |
| TPDO2 | 0x280+ID | 6 | 异步定时(0xFE) | 100 | 角速度 | 类型:int16,低字节在前,每个轴2字节,共6字节 分别为X、Y、Z轴角速度,单位为0.1deg/s |
| TPDO3 | 0x380+ID | 6 | 异步定时(0xFE) | 100 | 欧拉角 | 类型:int16,低字节在前,每个轴2字节,共6字节 顺序分别为横滚角(Roll)、俯仰角(Pitch)、航向角(Yaw),单位为0.01° |
| TPDO4 | 0x480+ID | 8 | 异步定时(0xFE) | 100 | 四元数 | 类型:int16,低字节在前,每个元素2字节,共8字节 分别为w,x,y,z,单位四元数扩大10000倍后结果。如四元数为1,0,0,0时,输出10000,0,0,0 |
| TPDO6 | 0x680+ID | 4 | 异步定时(0xFE) | 20 | 气压 | 类型:int32,共4字节,单位Pa |
| TPDO7 | 0x780+ID | 8 | 异步定时(0xFE) | 100 | 倾角仪角度 | 类型:int32,低字节在前,每个轴4字节,共8字节 顺序分别为X轴、Y轴,单位为0.01° |
数据解析示例
加速度和角速度数据解析:
加速度CAN帧: ID=0x188,DATA = 4A 00 1F 00 C8 03
- ID=0x188:ID为8的设备发送的加速度数据帧
- 加速度X轴 = 0x004A = 74 = 74mG
- 加速度Y轴 = 0x001F = 31 = 31mG
- 加速度Z轴 = 0x03C8 = 968 = 968mG
角速度CAN帧: ID=0x288,DATA = 15 00 14 01 34 00
- ID=0x288:ID为8的设备发送的角速度数据帧
- 角速度X轴 = 0x0015 = 21 = 2.1deg/s
- 角速度Y轴 = 0x0114 = 276 = 27.6deg/s
- 角速度Z轴 = 0x0034 = 52 = 5.2deg/s
上位机连接CAN设备
使用 PCAN-View 配合 PCAN 适配器,可在接收窗口(Rx Message)中查看收到的 CAN 消息及帧率,如下图所示:

配置指令(SDO协议)
本节常用配置指令均采用快速 SDO。若需要掉电保持,请在配置完成后执行保存配置指令,将参数写入 Flash。
SDO(Service Data Object)协议
快速SDO格式:
主机发送SDO命令到从机:
| CAN_ID | CS命令符(1B) | 数据字典索引(2B) | 子索引(1B) | 数据(4B) |
|---|---|---|---|---|
| 0x600+ID | 0x23(写4B) | 低位在前 | 子索引 | 数据,低位在前 |
从机回复SDO命令到主机:
| CAN_ID | SDO命令(1B) | 数据字典索引(2B) | 子索引(1B) | 数据(4B) |
|---|---|---|---|---|
| 0x580+ID | 0x60(写成功应答) | 低位在前 | 子索引 | 保留 |
常用配置指令
修改节点 ID(0x209C)
指令: ID=0x608,DATA=23,9C,20,00,[ID],00,00,00
- ID修改范围:1-127
- 如需掉电保持,修改后请保存配置到 Flash,并复位(或重新上电)使其生效
保存配置到 Flash(0x2000)
指令: ID=0x608,DATA=23,00,20,00,00,00,00,00
复位(0x2000)
指令: ID=0x608,DATA=23,00,20,00,FF,00,00,00
恢复出厂设置(0x2000)
指令: ID=0x608,DATA=23,00,20,00,01,00,00,00
⚠️ 警告 恢复出厂设置将恢复模块默认用户配置,执行后模块会自动保存并复位。部分校准相关参数可能保留,请谨慎使用。
修改CAN波特率(0x209A)
指令: ID=0x608,DATA=23,9A,20,00,[BAUD_CODE]
如需掉电保持,修改后请保存配置到 Flash,并复位(或重新上电)使其生效。
- CAN波特率修改为1000 kbit/s:
ID=0x608,DATA=23,9A,20,00,00,00,00,00 - CAN波特率修改为500 kbit/s:
ID=0x608,DATA=23,9A,20,00,02,00,00,00 - CAN波特率修改为250 kbit/s:
ID=0x608,DATA=23,9A,20,00,03,00,00,00 - CAN波特率修改为125 kbit/s:
ID=0x608,DATA=23,9A,20,00,04,00,00,00
TPDO配置
以下配置操作均通过快速 SDO 写入对应数据字典,其中 TPDO 通道与参数索引的对应关系如下:
| 通道 | 帧ID | 参数索引地址 | 说明 |
|---|---|---|---|
| TPDO1 | 0x180+ID | 0x1800 | 加速度 |
| TPDO2 | 0x280+ID | 0x1801 | 角速度 |
| TPDO3 | 0x380+ID | 0x1802 | 欧拉角 |
| TPDO4 | 0x480+ID | 0x1803 | 四元数 |
| TPDO6 | 0x680+ID | 0x1804 | 气压 |
| TPDO7 | 0x780+ID | 0x1805 | 倾角仪输出 |
修改/关闭/开启数据输出速率(0x1800-0x1805)
📋 配置说明 此项配置写入后立即生效;如需掉电保持,请另行保存配置。
常用配置示例:
ID=0x608,DATA=2B,00,18,05,00,00,00,00— 关闭加速度输出(1800.5=0)ID=0x608,DATA=2B,00,18,05,05,00,00,00— 加速度200Hz输出(1800.5=5)ID=0x608,DATA=2B,00,18,05,0A,00,00,00— 加速度100Hz输出(1800.5=10)ID=0x608,DATA=2B,00,18,05,14,00,00,00— 加速度50Hz输出(1800.5=20)ID=0x608,DATA=2B,00,18,05,32,00,00,00— 加速度20Hz输出(1800.5=50)ID=0x608,DATA=2B,00,18,05,64,00,00,00— 加速度10Hz输出(1800.5=100)
角速度配置:
ID=0x608,DATA=2B,01,18,05,00,00,00,00— 关闭角速度输出(1801.5=0)ID=0x608,DATA=2B,01,18,05,05,00,00,00— 角速度200Hz输出(1801.5=5)ID=0x608,DATA=2B,01,18,05,0A,00,00,00— 角速度100Hz输出(1801.5=10)ID=0x608,DATA=2B,01,18,05,14,00,00,00— 角速度50Hz输出(1801.5=20)ID=0x608,DATA=2B,01,18,05,32,00,00,00— 角速度20Hz输出(1801.5=50)ID=0x608,DATA=2B,01,18,05,64,00,00,00— 角速度10Hz输出(1801.5=100)
欧拉角配置:
ID=0x608,DATA=2B,02,18,05,00,00,00,00— 关闭欧拉角输出(1802.5=0)ID=0x608,DATA=2B,02,18,05,05,00,00,00— 欧拉角200Hz输出(1802.5=5)ID=0x608,DATA=2B,02,18,05,0A,00,00,00— 欧拉角100Hz输出(1802.5=10)ID=0x608,DATA=2B,02,18,05,14,00,00,00— 欧拉角50Hz输出(1802.5=20)ID=0x608,DATA=2B,02,18,05,32,00,00,00— 欧拉角20Hz输出(1802.5=50)ID=0x608,DATA=2B,02,18,05,64,00,00,00— 欧拉角10Hz输出(1802.5=100)
四元数配置:
ID=0x608,DATA=2B,03,18,05,00,00,00,00— 关闭四元数输出(1803.5=0)ID=0x608,DATA=2B,03,18,05,05,00,00,00— 四元数200Hz输出(1803.5=5)ID=0x608,DATA=2B,03,18,05,0A,00,00,00— 四元数100Hz输出(1803.5=10)ID=0x608,DATA=2B,03,18,05,14,00,00,00— 四元数50Hz输出(1803.5=20)ID=0x608,DATA=2B,03,18,05,32,00,00,00— 四元数20Hz输出(1803.5=50)ID=0x608,DATA=2B,03,18,05,64,00,00,00— 四元数10Hz输出(1803.5=100)
气压配置:
ID=0x608,DATA=2B,04,18,05,00,00,00,00— 关闭气压输出(1804.5=0)ID=0x608,DATA=2B,04,18,05,05,00,00,00— 气压200Hz输出(1804.5=5)ID=0x608,DATA=2B,04,18,05,0A,00,00,00— 气压100Hz输出(1804.5=10)ID=0x608,DATA=2B,04,18,05,14,00,00,00— 气压50Hz输出(1804.5=20)ID=0x608,DATA=2B,04,18,05,32,00,00,00— 气压20Hz输出(1804.5=50)ID=0x608,DATA=2B,04,18,05,64,00,00,00— 气压10Hz输出(1804.5=100)
📋 配置示例说明 以 TPDO1(加速度)输出速率为 100 Hz(每 10 ms 输出一次)为例:
0x23表示 SDO 写入 4 字节,0x00 0x18对应索引0x1800,0x05为子索引,0x0A 0x00表示周期值10(单位 ms),剩余字节补0。
设置倾角仪零点(0x20A5)
ID=0x608,DATA=23,A5,20,00,02,00,00,00— 写入后即设置当前位置为输出零点(X=0,Y=0)ID=0x608,DATA=23,A5,20,00,05,00,00,00— 写入后取消零点配置,输出真实的X、Y角度(相当于X、Y offset=0)
同步协议
模块支持将各个 TPDO 配置为同步模式。启用后,模块停止异步定时发送,转而等待 CANopen 同步帧;当同步帧到来时,再发送一帧对应的 TPDO 数据。
配置TPDO为同步模式
如需将某个 TPDO 配置为同步模式,可将对应 TPDO 通讯参数字典 [0x180x.2](Transmission type)设置为 0x01。相关字段定义请参考标准 CANopen 协议说明。
以TPDO1(加速度信息)为例:
ID=0x608,DATA=2F,00,18,02,01,00,00,00— 写入[0x1800.2] = 1,将 TPDO1 通讯模式设置为同步模式ID=0x608,DATA=2F,00,18,02,FF,00,00,00— 写入[0x1800.2] = 0xFF,将 TPDO1 通讯模式设置为异步模式(出厂默认)
发送CANopen同步帧
发送 CANopen 同步帧:ID=0x80,DATA 为空
模块接收到同步帧后,所有配置为同步模式的TPDO会发送一帧数据,实现同步。
设置心跳包
心跳包周期通过写入 [0x1017.0] 设置,有效范围 0~65535,单位为 ms。其中 0 表示禁用心跳包。
示例: ID=0x608,DATA=2B,17,10,00,64,00,00,00 — 设置心跳包周期为100ms
地磁校准
地磁校准适用场景
9 轴模式(磁辅助绝对航向角模式)建议在满足以下条件时使用:
- 首次使用 9 轴模式前,至少进行一次用户地磁校准
- 使用环境中不存在明显空间磁场干扰;建议在室外空旷处校准,室内复杂磁环境下难以保证校准效果
- 模块与安装载体(PCB、外壳、机器人等)的相对位置在使用过程中保持固定
地磁校准步骤
当首次使用模块且需要使用 AHRS(9 轴)模式时,应按以下步骤进行校准操作:
1. 模式切换
先将模块切换到 9 轴模式,详见“工作模式配置”章节。
2. 环境检查
常见磁场干扰源: 铁质家具、电脑显示器、电机与变压器、手机充电器、建筑钢筋结构等。
推荐校准环境:
- 最佳:室外空旷场地,远离建筑物和车辆(距离 > 5m)
- 可接受:室内远离干扰源的区域(距离 > 30cm)
⚠️ 重要提示
如果模块已安装在产品的PCB上,或产品具有磁性外壳,或已安装在机器人/机械设备上,必须将这些与模块固联的物体视为一个整体进行校准。单独校准模块后再安装到产品中无法达到校准效果。
3. 校准操作
发送校准指令: CONFIG MCAL START(需固件版本 ≥ 1.7.0)
执行校准动作:
- 在尽量小的空间范围内保持位置基本不变,仅缓慢旋转模块
- 每个轴至少旋转
360°(建议2~3圈),速度保持均匀,推荐20~100 deg/s(约5~20秒转一圈),避免中途停顿 - 校准时间通常需要
30~60 s
建议旋转方案: 绕X轴旋转2圈 → 绕Y轴旋转2圈 → 绕Z轴旋转2圈,或随机旋转确保每个轴都经历充分的角度变化
4. 校准状态查询
发送指令:LOG MCAL STAT
返回示例:
STAT=1
PROGRESS=8
OK状态字段STAT
| STAT值 | 状态说明 | 操作建议 |
|---|---|---|
| 0 | 当前空闲 | 可以开始新的校准 |
| 1 | 正在校准中 | 继续旋转模块,等待校准完成 |
| 2 | 正在验证结果 | 保持静止,等待验证完成 |
| 3 | 校准已完成 | 校准成功,可以正常使用 |
| 4 | 校准失败 | 参考故障排查流程,重新校准 |
PROGRESS:范围 0~100,表示当前校准进度百分比。当 PROGRESS=100 且 STAT=3 时,表示校准成功。
5. 校准结果验证
- 校准完成后,水平放置模块,缓慢旋转一周(360°)
- 观察航向角输出:理想情况下应连续变化
0°~360°且无跳变,可接受误差在±5°以内 - 若出现大角度跳变(>
10°)或航向角不随旋转变化,请参考下文“校准故障排查流程”
校准故障排查流程
当校准失败(STAT=4)或验证结果异常时,按以下步骤排查:
步骤1:检查环境磁场强度
在校准位置静止放置模块,读取磁场强度(mag_b 字段),计算磁场总强度:B_total = √(Bx² + By² + Bz²)。
| 磁场强度 | 环境评估 | 处理建议 |
|---|---|---|
| 20-60 μT | 正常 | 可以继续校准 |
| < 20 μT 或 > 60 μT | 异常 | 检查是否靠近强磁性物体,远离磁场干扰源,必要时更换位置 |
步骤2:检查旋转动作 - 确保每个轴至少旋转 360°,速度保持在 20~100 deg/s,避免停顿
步骤3:检查空间磁场干扰 - 在同一位置、不同朝向测量磁场强度。若变化 > 10 μT,说明存在空间磁场干扰,需更换位置或改用 6 轴模式
常见问题及解决方案
| 失败原因 | 典型现象 | 解决方案 |
|---|---|---|
| 环境磁场干扰过大 | STAT=4或航向角跳变 | 更换校准环境至室外空旷处 |
| 旋转动作不规范 | PROGRESS增长缓慢或停滞 | 确保每个轴充分旋转,速度均匀 |
| 旋转时位置移动 | 校准完成但精度差 | 校准时保持位置固定,仅旋转姿态 |
| 模块与载体位置变化 | 重新安装后航向角误差增大 | 将模块与载体作为整体重新校准 |
重要提醒
⚠️ 警告1:室内磁场环境限制 - 室内空间磁场干扰严重且无法通过校准消除,地磁辅助(9轴)模式航向角精度很大程度上取决于室内磁场畸变程度。
⚠️ 警告2:室内使用建议 - 若室内磁场环境较差(电脑机房、实验室、车间、地下车库等),即使校准成功,航向角精度可能仍不如6轴模式,甚至会出现大角度误差(>10°)。建议在室内环境下优先使用6轴模式。
⚠️ 警告3:固定安装要求 - 若安装环境存在磁场干扰,该干扰源必须与模块保持固定相对位置。模块安装在导磁刚体(机器人/机械设备/车辆/船舶/三脚架/PCB板等)之上时,需要将整个系统一起旋转校准。模块在使用过程中不应与被安装体发生相对位移,一旦分离需要重新校准。
⚠️ 警告4:电机振动影响 - 机器人电机运行时产生的振动和磁场干扰可能影响校准效果。建议在电机停止状态下进行校准,或在实际工作状态下校准(将电机磁场视为固定干扰源)。
校准频率与模式选择
校准频率建议:
- 固定安装且环境稳定时,首次校准 1 次即可;
- 移动应用在每次更换环境后建议重新校准;
- 模块与载体相对位置发生变化时应重新校准;
- 长期使用(>1 年)建议每年校准 1 次;
- 出现异常航向角误差时应立即重新校准。
模式选择建议:
| 应用场景 | 推荐模式 | 原因 |
|---|---|---|
| 室外空旷环境(无人机等) | 9轴模式 | 磁场干扰小,可获得绝对航向角 |
| 室内环境(AGV、机器人等) | 6轴模式 | 室内磁场干扰大,6轴模式更稳定 |
| 靠近电机/电磁设备 | 6轴模式 | 电磁干扰无法通过校准消除 |
| 需要绝对航向角 | 9轴模式 | 必须确保环境磁场稳定且完成校准 |
| 仅需相对航向角 | 6轴模式 | 6轴模式航向角上电为0,适合相对测量 |
附录1 四元数/欧拉角/旋转矩阵互转
四元数转旋转矩阵
给定四元数
四元数转欧拉角 - 东北天(ENU)-312(先转Z,然后X轴,最后Y轴)旋转顺序下的欧拉角

给定四元数
- pitch(θ):绕X轴的旋转角度,范围
- roll(φ):绕Y轴的旋转角度,范围
- yaw(ψ):绕Z轴的旋转角度,范围
四元数转欧拉角:
欧拉角转四元数:
四元数转欧拉角 - 北东地(NED)-321(先转Z轴,然后Y轴,最后X轴)旋转顺序下的欧拉角

给定四元数
- pitch(θ):绕Y轴的旋转角度,范围
- roll(φ):绕X轴的旋转角度,范围
- yaw(ψ):绕Z轴的旋转角度,范围
四元数转欧拉角:
欧拉角转四元数:
附录2 固件升级
本产品支持固件升级。请使用 CHCenter 上位机软件按下图步骤进行升级;固件升级文件(.hex)请联系技术支持获取。

附录3 关于磁干扰的更多知识
磁干扰可分为空间磁场干扰与传感器坐标系下的磁场干扰,如下图所示:

| 磁干扰类型 | 随传感器坐标系的磁场干扰 (硬磁干扰/软磁干扰) | 空间磁场干扰 |
|---|---|---|
| 特点 | 干扰源随传感器运动而运动 | 干扰源不随传感器运动而运动 |
| 典型干扰源 | 与模块固定在一起的PCB、金属外壳、无人机等 | 家具、家用电器、线缆、房屋内的钢筋结构等 |
| 校准可能性 | 可以 | 不可能 |
| 抗干扰措施 | 可以通过用户磁校准过程消除 | 无论如何校准都无法消除,会严重影响航向角误差 |
空间磁场干扰说明 空间磁场干扰是造成室内地磁融合难以稳定使用的主要原因。这类干扰无法通过校准消除,会显著增大航向角误差。在室内环境中,尤其是靠近桌椅、家电等区域时,这类干扰通常更明显。

📋 图例说明 上图展示了典型的室内空间磁场干扰分布:蓝色表示弱干扰区,红色表示强干扰区。
附录5 技术支持
新产品与资料信息可通过官方网站及公众号获取。 微信:


