🦘 一体化关节模组 · 底层底软详细拆解
Boot · BSP/RTOS · 电机功率 · 编码器采集 · 参数标定 · 诊断日志 · 安全保护
📌 章节定位:承接
2-7 三层总览 的「下层:底软与实时底座」,按 6 块内容逐块展开。
面向工程实现:Boot/BSP/RTOS → 电机功率级 → 传感器采集 → 参数管理 → 诊断日志 → 安全保护
0 · 6 块内容地图
底软不是单纯的「驱动开发」,它是整个模组的实时运行基础。下面 6 块按从启动到安全的顺序展开:
1Boot 与启动链
上电到应用可运行的完整路径,量产/升级/安全的根。
2BSP 与 RTOS
芯片支持包、实时内核、任务分层,是底软的时间骨架。
3电机与功率级
PWM/ADC/温度/保护,电机驱动的硬件接口层。
4编码器与传感器
多源采集、采样同步、扭簧观测链,R6 力矩感知源头。
5参数与标定管理
4 类参数 + 权限/版本/回滚,量产可维护的关键。
6诊断与故障日志
故障等级 5 档 + 故障上下文 + 现场可维护性。
为什么这个顺序:① 启动 → ② 操作系统 → ③ 硬件驱动 → ④ 传感器 → ⑤ 参数 → ⑥ 故障,正好对应一颗 MCU 上电、运行、出故障、恢复的完整生命周期。
为什么必须先有底软再聊控制:电流环跑 10kHz,需要底层提供:稳定的中断 + 准确的 PWM + 同步的 ADC + 可靠的看门狗 + 失败可控的故障关断。少一块,控制都调不稳。
1 · 1Boot 与启动链
1.1 启动链全流程
一体化关节模组上电之后,从硬件复位到应用可运行,要经过一长串动作。任何一个环节出错都会导致模组起不来,所以启动链必须可控、可观察、可恢复。
上电 / 复位
↓
硬件自检 (POR, 复位源识别, 看门狗状态)
↓
Bootloader 入口(双备份选择)
↓
芯片初始化(时钟 · PLL · 电源域 · Flash 等待)
↓
RAM 自检(栈指针校验 · 内存测试)
↓
Flash 校验(CRC · 固件版本识别)
↓
参数区加载(出厂标定 · 现场标定 · 自适应参数)
↓
外设自检(编码器 · 温度 · ADC · 通信口)
↓
安全启动校验(固件签名 · 防回滚版本)
↓
RTOS 启动 · 创建任务 · 进入主循环
1.2 关键子项拆解
Bootloader
- 双备份固件(A/B 槽位):升级失败自动回退到上一版本
- 启动槽位选择:根据上电计数 / 校验和 / 健康标志决定跑哪个槽
- 升级入口:收到升级指令时进入 Bootloader,不进入主程序
- 看门狗喂狗:Bootloader 内部必须有独立看门狗,防止升级卡死
芯片初始化
- 时钟源选择(外部晶振 / 内部 RC)
- PLL 配置(主频、外设分频)
- 电源域使能(电机驱动、传感器、通信模块的供电顺序)
- Flash 等待周期配置(CPU 主频对应的访问等待)
- 启动延迟(重要外设的稳定时间)
RAM 与栈自检
- 栈指针必须在合法范围内
- 关键内存区写读测试(March C-)
- 检测 RAM 容量是否符合预期
- 保留栈区(升级时使用)
Flash 与固件校验
- CRC32 / SHA-256 校验
- 固件头(版本号 · 兼容矩阵 · 签名)
- 反回滚版本号(防止降级到带漏洞的旧版本)
- 损坏固件处理(标记 + 自动回退)
参数区加载
- 出厂标定参数(电机参数 · 编码器零点 · 扭簧特性)
- 现场标定参数(机械安装角 · 摩擦特性)
- 运行自适应参数(PID · 摩擦补偿 · 温度补偿)
- 参数 CRC 校验
外设自检
- 编码器通信测试(SPI/ABZ/SSI 链路)
- 温度传感器读取合理性
- ADC 校准(零点 · 增益)
- 通信口环回测试(CAN / 串口 / EtherCAT PHY)
- 电机绕组通断检测
安全启动(Secure Boot)
- 固件签名验证(公钥烧录,不可改写)
- 公钥校验链(根公钥 → 子公钥)
- 防止加载未签名的固件
- 可选:可信执行环境(TEE)
1.3 工程化要点
| 问题 | 必须考虑 |
| 升级失败 | A/B 双备份自动回退,看门狗保护 |
| 参数与程序版本错配 | 程序升级后参数兼容性矩阵校验 |
| Flash 寿命 | 磨损均衡、坏块管理、写入计数统计 |
| 首次上电(工厂状态) | 检测到空参数区时使用默认参数,写入出厂初始值 |
| 长时间运行断电 | 关键状态写入非易失存储 |
| 出厂状态恢复 | 专门入口,恢复出厂标定参数 |
| 供应链安全 | Bootloader 锁死后只能通过特殊方式解锁 |
为什么 Boot 决定产品力:关节模组一旦批量装机到客户设备里,不能依赖拆机刷固件。Bootloader、升级、回滚不是后期附加功能,而是量产底座的一部分。一个不能远程升级、不能自动恢复的关节,本质上只能算半成品。
2 · 2BSP 与 RTOS
2.1 BSP 是什么
BSP(Board Support Package)是芯片支持包,把 MCU 寄存器级别的细节封装成可调用接口。它是上层实时控制算法和硬件之间的"翻译官"。
BSP 提供的接口
- GPIO 控制(输入 / 输出 / 中断)
- 定时器(基本 / 高级 / PWM / 编码器模式)
- ADC(单端 / 差分 / 多通道扫描)
- DAC(力矩指令模拟输出)
- DMA(不占 CPU 的数据传输)
- 通信接口(UART / SPI / I2C / CAN)
- 中断控制器(优先级 / 嵌套 / 屏蔽)
- 电源管理(低功耗模式 / 唤醒)
- 看门狗(独立 / 窗口)
- Flash 控制器(读写 / 擦除 / 保护)
2.2 RTOS 是什么,为什么需要
一体化关节模组的控制任务有强实时要求(电流环 10-20 kHz),单纯裸跑 main + while 循环很难管理多周期任务。RTOS 提供:
- 多任务调度(优先级 / 时间片 / 抢占)
- 任务间通信(信号量 / 队列 / 事件标志 / 互斥锁)
- 时间管理(软件定时器 / 延时)
- 内存管理(动态 / 静态分配策略)
- 临界区管理(中断开关 / 锁)
- 可裁剪(只保留需要的部分,节省 ROM/RAM)
常见选择:
| RTOS | 特点 | 典型场景 |
| FreeRTOS | 开源、轻量、生态成熟 | 单关节 MCU |
| RT-Thread | 国产、生态丰富、内置组件 | 国产化项目 |
| Zephyr | Linux 基金会、新一代 | 需要长期维护的项目 |
| 裸跑(Super-loop) | 无 RTOS,确定性最好 | 单任务、极致实时 |
2.3 实时任务分层(6 档周期)
底软必须把不同周期的任务分清楚,否则上层一个复杂算法就会打断电流环。
| 周期 | 任务 | 实现方式 | 优先级 |
| 10-50 μs | PWM 更新 · ADC 采样 | 硬件定时器触发 + DMA | 最高 |
| 50-100 μs | FOC 电流环(10-20 kHz) | DMA 完成中断 | 高 |
| 0.5-1 ms | 速度环 · 位置环 · 力矩估计(1-2 kHz) | 高优先级任务 | 中高 |
| 1-5 ms | 状态机 · 保护 · 温控 | 中优先级任务 | 中 |
| 10-100 ms | 诊断 · 日志 · 参数管理 | 低优先级任务 | 低 |
| 100 ms 以上 | OTA · 统计 · 后台维护 | 后台任务 | 最低 |
关键约束:上层算法不能直接打断底层实时控制环。
例:一个复杂的轨迹算法突然占满 CPU,不能影响电流环和过流保护。
实现方式:把实时任务放在中断或高优先级任务里,给上层算法留出明确的 CPU 配额(比如 ≤ 30%)。
2.4 中断与优先级
- 中断嵌套:电机相关中断不能被非电机中断打断
- 中断延迟:必须可测(示波器 / GPIO toggle)
- 中断服务程序(ISR)内只做最少工作(采样、置标志),处理逻辑放到任务里
- 中断与任务的同步:事件标志 / 信号量 / 队列
2.5 内存与临界区
- 静态分配优先(确定性、可分析)
- 动态分配仅用于非实时模块(参数解析、日志缓冲)
- 临界区尽量短(关中断时间 < 几 μs)
- 内存池管理(避免碎片化)
2.6 看门狗
- 独立看门狗(IWDG):独立时钟源,外部故障也能检测
- 窗口看门狗(WWDG):必须在时间窗口内喂狗,防止「喂狗频率异常」
- 喂狗位置:低优先级任务(不在中断里喂)
- 故障时的恢复动作:复位 → 重新初始化 → 检查故障上下文
3 · 3电机与功率级驱动
3.1 功率级硬件组成
一体化关节模组的功率级由以下几个部分构成:
- 三相桥:6 个 MOSFET / IGBT(H 桥 × 3 相)
- 栅极驱动:隔离 + 电平转换 + 死区
- 母线电容:吸收开关尖峰
- 电流采样:低侧分流电阻 / 霍尔传感器
- 母线电压采样:分压电阻
- 温度传感器:电机绕组 · 散热器 · 驱动芯片
- 抱闸(可选):失电抱闸 · 通电释放
3.2 底软需要做的事情
PWM 输出
- 三路互补 PWM(带死区)
- 中心对齐或边沿对齐
- PWM 频率(典型 10-30 kHz,要避开机械共振)
- PWM 分辨率(≥ 10 bit,最好 12-16 bit)
ADC 采样
- 三相电流同步采样(同一触发源)
- 采样点对齐 PWM 中点(避开开关噪声)
- 母线电压同步采样
- 温度采样(低优先级,足够慢即可)
- DMA 自动搬运 + 双缓冲
栅极驱动状态
- 驱动芯片故障检测(VGS 欠压、过流)
- 故障引脚快速关断 PWM
- 驱动使能信号
保护功能
- 过流保护(硬件 + 软件双层)
- 过压 / 欠压保护
- 短路保护(典型 ≤ 5 μs 关断)
- 过温保护(降额 → 关断)
- 堵转检测
- 缺相检测
- 制动控制
3.3 标准化接口(上层不碰硬件)
上层控制算法不应该直接操作寄存器,而是通过底软抽象出来的接口。这是最容易混乱的地方,必须把接口设计清楚。
// 上层调用(伪代码)
// PWM 控制
set_pwm(phase_u, phase_v, phase_w);
set_duty(duty_u, duty_v, duty_w);
// 采样读取
read_phase_current(); // 返回 [Iu, Iv, Iw]
read_bus_voltage();
read_motor_temperature();
read_driver_temperature();
// 功率级控制
enable_power_stage(); // 使能栅极驱动
disable_power_stage(); // 关闭栅极驱动(高阻态)
apply_brake(); // 主动制动
release_brake(); // 释放抱闸
// 保护状态
get_fault_status(); // 故障位
clear_fault(); // 清除可恢复故障
3.4 实际工程坑
- 采样点偏移:PWM 占空比变化后,采样点不再在电流中点 → 引入误差
- 死区影响:低速时死区导致电流畸变
- 温度漂移:分流电阻温漂,影响电流精度
- EMI:开关噪声耦合到采样
- 批量差异:MOSFET 导通电阻差异影响电流平衡
- 零速发热:低占空比 + 大电流 → 绕组发热
- 反向电动势:高速旋转时母线电压被泵升
功率级底软的两个硬要求:
① 保护响应时间 ≤ 5 μs(短路 / 硬件过流必须靠硬件触发,软件来不及)
② 采样同步精度 ≤ 1 μs(三相电流必须同一时刻采样,否则 FOC 解算会有旋转误差)
4 · 4编码器与传感器采集
4.1 模组里到底有哪些传感器
一体化关节模组的传感器比普通电机伺服多,因为要做R6 双编码器 + 力矩感知,需要完整观测链:
| 传感器 | 位置 | 用途 |
| 电机侧编码器 | 电机轴端(≥ 19 bit) | 电机转子角度 · FOC 解算源头 |
| 输出侧编码器 | 减速器输出端 | 关节实际位置 · 扭簧解算 |
| 扭簧两端角度 | 扭簧前后轴承位置 | 扭簧变形量 → 力矩 |
| 母线电流 | 母线侧 | 总功率监控 |
| 三相电流 | U/V/W 相 | FOC 电流环 |
| 电机温度 | 绕组 / 铁芯 | 过温保护 · 温度补偿 |
| 壳体温度 | 减速器外壳 | 过温保护 |
| 减速器温度 | 润滑相关 | 润滑状态监测 |
| 抱闸状态 | 抱闸机构 | 抱闸可靠性监测 |
| 振动传感器(可选) | 壳体 / 减速器 | 异常噪声 / 磨损检测 |
4.2 采集同步
多源数据的时间对齐是力矩感知的前提。如果各传感器在不同时间采样,扭簧解算会有相位误差。
同步策略
- 所有采样由同一个定时器触发(PWM 中心点)
- 编码器读数 + ADC 采样 + 温度采样在同一时刻锁存
- 每个数据点带硬件时间戳
- 丢帧检测与补偿
采样时间戳
- 硬件定时器计数(μs 级)
- 数据帧头携带时间戳
- 多个数据源的时间戳对齐后使用
4.3 R6 双编码器观测链(关键)
这是 R6 力矩感知能不能 work 的物理基础。底软要把这条链的数据质量做好。
电机角度 θm(电机侧编码器)
↓
减速器传动比 N
↓
理论输出角度 θo_theory = θm / N
↓
实际输出角度 θo(输出侧编码器)
↓
扭簧变形量 Δθ = θo_theory - θo
↓
扭簧特性表 f(Δθ, temperature, speed)
↓
输出侧力矩估计 τ = f(Δθ, T, ω)
↓
DOB / 自适应 K / 阻抗控制
底软需要保证
- 两个编码器时间同步(毫秒级以内)
- 编码器分辨率足够(≥ 19 bit,对应扭簧微变形)
- 编码器零偏校准(机械安装角的偏差)
- 编码器方向一致性(正反转定义)
- 编码器断线检测
- 扭簧特性表的温度补偿
- 原始值到物理量的单位转换(角度 → rad,力矩 → N·m)
4.4 传感器预处理
去毛刺
- 滑动窗口中值滤波(编码器)
- 异常值剔除(± 3σ)
- 丢帧填充(线性外推)
校准
- 零偏校准(标定工位)
- 增益校准(与参考传感器比对)
- 方向校准(机械定义 vs 编码器定义)
- 非线性校准(编码器线性度误差)
- 温度补偿(热机 vs 冷机)
异常值钳位
- 物理合理范围(位置限位 · 速度限位 · 力矩限位)
- 突变检测(相邻采样差分)
- 传感器故障时使用默认值 + 标记
4.5 传感器冗余
高安全等级应用需要考虑冗余:
- 双编码器互相校验(位置一致性检测)
- 电流与电压交叉校验(功率一致性)
- 温度多点检测(局部 vs 全局)
- 不同物理原理的传感器交叉验证
R6 力矩感知的物理基础:双编码器精度(≥ 19 bit)+ 采样同步(μs 级)+ 温度补偿(覆盖工况)+ 异常处理(容错)。少一块,R6 就只能停在 demo,不能量产。
5 · 5参数与标定管理
5.1 为什么参数管理重要
一体化关节模组有 4 类参数,每类的访问权限、修改流程、回滚要求都不同。混在一起管理会出现:
- 普通应用误改安全参数
- 升级固件把客户现场标定参数冲掉
- 不同批次参数不可对比
- 故障后无法回退到已知良好的参数
5.2 4 类参数
| 类别 | 典型参数 | 修改权限 | 存放位置 |
| 电机参数 | 电阻 · 电感 · 反电动势常数 · 极对数 · 转矩常数 · 最大电流 | 工厂 · 高级用户 | 出厂标定区 |
| 减速器参数 | 减速比 · 回差 · 效率 · 摩擦模型 · 温度相关特性 | 工厂 | 出厂标定区 |
| 传感器参数 | 零偏 · 增益 · 方向 · 安装角 · 温漂补偿 · 非线性修正 | 工厂 · 现场标定 | 出厂 + 现场标定区 |
| 安全参数 | 最大位置 · 最大速度 · 最大力矩 · 最大温度 · 过载时间 · 降额曲线 | 仅认证工程师 | 安全区(独立校验) |
5.3 参数区分维度
除了按"类别"分,还需要按生命周期分:
- 出厂标定参数(电机参数 · 编码器零点 · 扭簧特性)· 出厂后基本不变
- 现场标定参数(机械安装角 · 摩擦特性 · 温度补偿)· 装机后调整
- 运行自适应参数(PID · 摩擦补偿 · 温度补偿)· 运行中自动调整
- 安全保护参数(限位 · 降额曲线)· 强制保护,不可改
5.4 参数的工程管理
参数存储
- Flash 单独扇区(避免程序升级擦掉)
- 双备份(A 区 + B 区,写入失败可恢复)
- 出厂恢复区(保留出厂初始值)
- 参数 CRC 校验
权限控制
- 普通应用:只读 + 写运行自适应参数
- 现场标定工具:可改现场标定参数 + 部分安全参数
- 工厂标定工具:可改电机/减速器参数
- 安全参数:需要认证(密码 / 签名)+ 操作日志
版本管理
- 参数版本号(与固件版本绑定)
- 兼容性矩阵(哪些固件版本支持哪些参数版本)
- 升级时参数迁移
修改记录
- 时间戳
- 修改人(工具 ID / 用户 ID)
- 修改前后值
- 校验和
回滚
- 出厂恢复(清空现场标定,保留出厂)
- 上一次良好状态恢复
- 备份到上位机(人工管理)
5.5 标定流程示意
工厂标定工位
↓
电机参数辨识(电阻 · 电感 · 反电动势)
↓
编码器零点标定(机械角度 ↔ 编码器值)
↓
扭簧特性表生成(Δθ → 力矩)
↓
减速器参数测量(减速比 · 回差 · 摩擦)
↓
温度特性测试(多温度点参数)
↓
参数写入 + CRC + 签名
↓
现场标定(机械安装 · 客户工艺)
↓
交付使用
参数管理的红线:不能让普通上层应用随意修改安全参数。所有安全参数修改必须走认证通道 + 留操作日志,否则产品出厂后会出现"现场工程师乱调参数导致批次性失效"。
6 · 6诊断、日志与故障记录
6.1 故障等级的 5 档
工程样机阶段,日志可以多;量产阶段,日志必须可控。需要把故障按严重程度分级:
| 等级 | 处理 | 举例 |
| Warning | 继续运行,记录 + 上报 | 温度接近上限 · 编码器信号质量下降 |
| Derating | 限制电流/速度/力矩 | 温度达到降额区间 · 母线电压低 |
| Recoverable Fault | 进入安全状态,条件满足后恢复 | 通信超时 · 编码器丢帧 |
| Latched Fault | 必须人工确认或重新上电 | 过流保护 · 编码器断线 · 抱闸异常 |
| Critical Fault | 立即关断功率级 + 抱闸 | 硬件短路 · 驱动器损坏 · 通信完全中断 |
6.2 故障上下文记录
光记录「发生了故障」是不够的,必须记录故障时的状态,才能事后复盘。
必记录项
- 故障码(标准化编号)
- 首次发生时间
- 最近发生时间
- 发生次数
- 故障时的位置 / 速度 / 电流 / 力矩 / 温度
- 故障前后若干毫秒波形(用于回放)
- 当前控制模式
- 固件版本 + 参数版本
- 累计运行时间
波形记录
- 触发式:故障前 10 ms + 故障后 50 ms
- 环形缓冲(避免占用过多 RAM)
- 压缩存储(差分编码)
6.3 故障处理链
检测异常
↓
确认是否真实故障(去抖 · 多源校验)
↓
进入降额或安全状态
↓
停止输出 / 限制输出 / 抱闸
↓
记录故障上下文(波形 · 时间戳 · 上下文)
↓
上报上位机(实时告警)
↓
等待自动恢复 或 人工确认
6.4 安全停机 vs 正常停止
不能把安全停机和正常停止混为一谈:
| 类型 | 目标 | 允许代价 |
| 正常停止 | 减速到 0,动作平滑 | 不能损失轨迹精度 |
| 急停 | 保证人和设备安全 | 可以牺牲运动平滑性 |
| 机械卡死 | 保护电机和机械 | 不能继续加大电流硬顶 |
| 通信断开 | 进入安全姿态 | 不能简单保持最后一个力矩指令无限运行 |
6.5 日志管理
日志分级
- ERROR:故障类事件
- WARN:异常状态
- INFO:关键节点(启动 · 升级 · 状态切换)
- DEBUG:调试信息(量产关闭)
日志存储
- 循环存储(最新覆盖最旧)
- 故障时强制保存(不被覆盖)
- 导出接口(USB · 通信 · SD 卡)
- 远程上传(可选)
6.6 诊断与预测
不只是记录故障,还要预测故障。这部分交给上层算法应用(参见 2-10)。
- 减速器磨损检测(摩擦变化趋势)
- 电机退磁(反电动势常数变化)
- 编码器漂移(零偏统计)
- 扭簧疲劳(特性曲线变化)
- 温升异常预测
- 振动频谱分析(异常噪声)
- 剩余寿命估计(特征趋势 + 模型)
诊断日志的工程价值:
① 现场可维护:客户工程师能根据故障码快速定位
② 远程诊断:售后团队能远程读取故障波形
③ 质量追溯:批次性问题能在第一周发现
④ 预测性维护:从「坏了再修」变成「快要坏了就提醒客户」
7 · 今天小结 + 下一步
底软 6 块全部展开完了。今天聊的范围:
- 块 1:Boot 与启动链(启动流程 · 双备份 · 安全启动 · 版本兼容)
- 块 2:BSP/RTOS(任务分层 6 档 · 中断 · 看门狗)
- 块 3:电机与功率级(PWM · ADC · 保护 · 标准化接口)
- 块 4:编码器与传感器(多源采集 · 同步 · R6 观测链)
- 块 5:参数与标定(4 类参数 · 权限 · 版本 · 回滚)
- 块 6:诊断与故障日志(5 档故障等级 · 上下文 · 波形)
底层底软「准出门禁」清单:上电 / 自检 / 电机可使能 / 编码器可读 / 电流可采 / PWM 可控 / 故障可关断 / 参数可保存 / 日志可读取。
达到这个标准之后:才能进入
2-7 三层总览 中的「阶段 2:单关节闭环」(电流环 → 速度环 → 位置环),对应下一节「中层控制详细拆解」。
下一步建议:如果今天底层聊透了,进入 2-9 中层控制详细拆解(FOC / 闭环控制 / 摩擦补偿 / 力矩估计 / 阻抗控制 / 状态机 / 多关节协调)。如果还要继续在底层深挖,可以挑某一块再展开(比如 R6 双编码器观测链怎么具体实现)。