参赛声明
本作品在 MPS 原创首发,且原创首发于本次 MPS 机器人模块设计大赛,并已切实用到大赛邮寄的全部必用物料。参与活动即默认将分享内容授权许可 MPS、EEWorld 使用、复制、修改、汇编、发布和传播文章内容;参与活动即默认同意本活动隐私声明,MPS、EEWorld 有权了解、使用用户相关信息。文中文字(如文案、字幕等)及自制图片字体,已使用思源黑体,以防字体侵权产生赔偿。
一、 作品简介与设计名称
设计名称:低功耗自适应智能外骨骼柔性髋关节
作品照片:
作品简介:
本项目旨在解决传统刚性外骨骼功耗高、穿戴沉重且人机交互不自然的问题,设计了一款“低功耗自适应智能外骨骼柔性髋关节”。该关节采用柔性驱动器(SEA)架构,结合高精度绝对值编码器与线性霍尔电流传感器,实现了对人体步态意图的自适应感知与柔顺力矩输出。系统以超低功耗的 STM32L496ZG 为控制核心,深度集成了多款 MPS 高性能芯片。其中,MPQ6547A 负责无刷电机的高效三相驱动,MA730 提供零延迟的关节角度反馈,MCS1805 确保力矩控制的电流采样精度,而 MP2797 与 MP4201 则构建了安全、高效的电池管理与双向能量路径。整个系统不仅大幅降低了运行功耗,还显著提升了人机协作的安全性与舒适度,非常适合康复辅助与日常负重行走场景。
二、 物料清单与系统框图
1. 物料清单 (BOM)
本项目使用了本次大赛提供的核心物料,感谢赞助与技术支持,并辅以必要的外围器件,具体如下:
| 模块分类 | 器件型号 | 在系统中的作用 |
|---|---|---|
| 主控核心 | STM32L496ZG | 关节状态机控制、步态识别算法运行、低功耗电源管理与通信。 |
| 姿态与位置 | MA730GQ-Z | 14 位绝对角度编码器,用于髋关节输出角与柔性形变角的精确闭环检测。 |
| 电机驱动 | MPQ6547A-AEC1 | 32V/4A 三相无刷电机驱动功率级,提供高效的力矩输出。 |
| 电流采样 | MCS1805GS | 线性霍尔电流传感器,用于相电流监控与堵转异常保护。 |
| 电池管理 | MP2797DFP | 7-16 串电池监控、充放电保护(OCP/UVP/OVP)及库仑计数。 |
| 电源转换 | MP4201GQJ | 100V 同步双向 Buck-Boost 控制器,管理系统供电及潜在的能量回收路径。 |
| 机械与执行 | 无刷直流电机、弹性体 | 构成串联弹性驱动器(SEA),提供柔顺的物理输出。 |
2. 系统框图
系统的核心逻辑围绕“感知-决策-执行-供电”四个维度展开。
三、 各部分功能的实现说明和解析
1. 主控与计算模块:低功耗与实时性的平衡
主控板基于 NUCLEO-L496ZG-P 评估板开发,核心为 STM32L496ZG。该芯片的超低功耗特性(FlexPowerControl)使其在待机与唤醒之间能快速切换。我们在固件中设计了基于定时器的中断唤醒机制:在步态的支撑相(需要大算力进行力矩计算)全速运行 Cortex-M4 内核;在摆动相的空闲间隙,则自动降频或进入低功耗模式。这种设计最大化了电池的续航能力,完美契合外骨骼的移动穿戴需求 。
2. 姿态感知与柔性力矩估计
为了实现“柔性”控制,外骨骼的机械结构中串联了弹性元件。我们使用 MA730绝对角度编码器来实时测量弹性体两端的扭转角差。MA730 的 14 位高分辨率和 SPI 接口确保了角度数据的高频、低延迟读取 [1]。结合弹性体的标定刚度系数,主控 MCU 可以精确计算出当前关节输出的实际力矩,从而实现闭环的阻抗控制,让人体感觉不到机械的僵硬。
(图:智能外骨骼髋关节助力概念示意图)
(图:基于步态相位的自适应力矩辅助示意图)
3. 无刷电机驱动与电流保护
执行端采用了 MPQ6547A-AEC1 作为三相无刷电机的功率级。其内置的热关断和欠压锁定功能大大简化了硬件设计。为了实现精确的磁场定向控制(FOC),我们在电机相线上串联了 MCS1805GS 线性霍尔电流传感器。MCS1805 提供的隔离模拟电压信号被送入 STM32 的 ADC,配合其内置的过流检测(OCD)引脚,系统可以在极短时间内响应堵转或外部冲击,立即切断 MPQ6547A 的输出,保护穿戴者与硬件安全 [2] [3]。
4. 电池管理与双向电源系统
外骨骼的动力源为多串锂电池组。MP2797DFP 负责全面的电池状态监控,包括高精度的库仑计数(SOC 估算)、过压/欠压保护以及充放电 FET 的直接驱动 [4]。此外,系统预留了 MP4201GQJ 双向 Buck-Boost 控制器,不仅用于稳定电机母线电压,还为未来的下坡/减速能量回收(Regenerative Braking)提供了硬件基础 [5]。
四、 源码及说明
本项目的控制代码基于 STM32 HAL 库编写,避免了直接操作底层寄存器,提高了代码的可读性与移植性。以下是步态状态机与电机控制更新的核心逻辑片段说明。
// 核心状态机与力矩更新任务(由硬件定时器中断触发)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM3) {
// 1. 读取传感器数据
float joint_angle = MA730_ReadAngle_SPI(); // 获取 MA730 绝对角度
float phase_current = MCS1805_ReadCurrent_ADC(); // 获取 MCS1805 相电流
// 2. 步态相位识别
GaitPhase current_phase = EstimateGaitPhase(joint_angle);
// 3. 计算期望辅助力矩 (基于 SEA 弹性体形变)
float target_torque = CalculateAssistTorque(current_phase, joint_angle);
// 4. FOC 电流环更新与 PWM 输出
// 将目标力矩转化为目标交轴电流 (Iq)
UpdateFOC_Loop(target_torque, phase_current);
// 5. 驱动器指令下发
// 使用 HAL 库设置 MPQ6547A 的 PWM 占空比
SetMotorPWM_HAL(DutyCycle_A, DutyCycle_B, DutyCycle_C);
}
}
代码说明:定时器 TIM3 保证了控制环路的固定执行频率。每次中断发生时,系统通过 SPI 读取 MA730 的角度数据,通过 ADC 读取 MCS1805 的电流数据,随后经过步态估计与力矩计算,最终通过 HAL 库更新 PWM 占空比驱动 MPQ6547A。
六步换向法关键代码
static void SixStep_LogicTest(void)
{
SixStep_AllOff();
/* 唤醒功率级;三路 EN 此时仍为低。 */
HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO_Port,
MOTOR_ENABLE_Pin,
GPIO_PIN_SET);
HAL_Delay(2U);
/* 转子预定位:固定第一电气状态 300 ms。 */
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_15) == GPIO_PIN_RESET)
{
SixStep_AllOff();
HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO_Port,
MOTOR_ENABLE_Pin,
GPIO_PIN_RESET);
return;
}
SixStep_Apply(0U, SIXSTEP_TEST_CCR);
HAL_Delay(300U);
/* 慢速开环换相:先只运行 24 步,约 1.2 s。 */
for (uint8_t step = 0U; step < 100U; step++)
{
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_15) == GPIO_PIN_RESET)
{
SixStep_AllOff();
HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO_Port,
MOTOR_ENABLE_Pin,
GPIO_PIN_RESET);
return;
}
SixStep_Apply(step, SIXSTEP_TEST_CCR);
HAL_Delay(SIXSTEP_STEP_MS);
}
/* 测试结束,关闭所有相和共享唤醒。 */
SixStep_AllOff();
HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO_Port,
MOTOR_ENABLE_Pin,
GPIO_PIN_RESET);
}
五、制作过程
PCB画板
打样焊接
电机调试
先调试控制板,尝试六步换向驱动电机
驱动板不上电,不接电机
初始问题:PE7 测得约 4.8 V
最初要求 PE7/MOTOR_ENABLE 在默认状态保持 Low,但实测 PE7 约 4.8 V。进一步排查发现,驱动板上的 nSLEEP 由 MSK12C02 开关通过 1 kΩ 接到 +5 V;此前将 nSLEEP 与 PE7 直接相连时,驱动板侧上拉会把 MCU 引脚反向拉高。因此,PE7 的高电平并不是 STM32 固件主动输出,而是外部网络造成的。
最终修正原则是:
ENA、ENB、ENC 分离
MPQ6547A 的三个 EN 输入分别控制 A、B、C 半桥;PWM 输入决定相应半桥输出接 VIN 还是 GND。根据数据手册逻辑,ENx=Low 时该相为高阻,ENx=High 时才由 PWMx 控制输出。[6]
控制板输出测试:
ENA ENB 触发信号波形
因此,六步换向必须让每一相具备独立的 EN 控制。若 ENA、ENB、ENC 全部并接 PE7,则三相只能同时使能,第三相无法独立进入高阻,不能实现标准的“一相上拉、一相下拉、第三相悬空”。本项目通过分离三路 EN 网络解决了这一限制。
推荐的 Nucleo 接线为:
EN 与 PWM 的对应关系
必须保持同相对应:
ENA ↔ PWMA ↔ 电机 A 相
ENB ↔ PWMB ↔ 电机 B 相
ENC ↔ PWMC ↔ 电机 C 相
不能把 ENA 接到 PWMB,也不能只交换 ENA/ENB 而不同时交换 PWMA/PWMB。若需要改变 A/B 相映射,应同时交换对应的 EN 和 PWM,或者更简单地在完全断电后交换电机侧任意两根相线。
无电机、受保护上电验证
安全前提
测试前应断开电机,保持三路 PWM 比较值为 0,PE7 为 Low,TIM1 Break 保持启用且低有效。电源先设置 12 V、0.10 A 限流。
实测通过结果
本项目记录的静态上电结果如下:
此前观察到 PWMA/B/C 均出现 50 μs 周期波形,后来确认是代码中的比较值为 80U;将比较值改为 0U 后重新上电,三路波形消失,说明硬件没有异常,可以进行下一步优化固件测试参数。
六步换向原理
基本工作方式
三相 BLDC 电机通常由三相逆变桥驱动。六步换向把一个电气周期划分为六个 60° 电气区间,每个区间让两相通电、第三相悬空:一相连接到正母线产生“上拉”,另一相连接到地形成回流,第三相保持高阻。定子磁场因此沿六个离散方向旋转,永磁转子跟随磁场运动。[7]
标准六步状态可抽象为:
| 步骤 | 正向相 | 负向相 | 悬空相 |
|---|---|---|---|
| 0 | A+ | B− | C |
| 1 | A+ | C− | B |
| 2 | B+ | C− | A |
| 3 | B+ | A− | C |
| 4 | C+ | A− | B |
| 5 | C+ | B− | A |
在本项目的 MPQ6547A 接口中,EN=High 且 PWM=High 使对应相接近 VIN,EN=High 且 PWM=Low 使对应相接近 GND;EN=Low 时对应相为高阻。因此,例如步骤 0 可写为:
ENA=1, ENB=1, ENC=0
PWMA=PWM, PWMB=0, PWMC=X
其中 X 表示该相已被 EN 关闭,PWM 不再决定功率输出。
六步的优点与局限
六步换向实现简单、计算量低、便于快速验证相序和功率级。带 Hall 传感器时,三个 Hall 信号形成六个有效扇区,控制器可由 Hall 状态直接查表换相,启动和低速性能较可靠。[7]
本项目采用的是固定时间开环换相,没有 Hall 或 MA730 位置反馈参与换相。因此它只能假设转子会跟随预设速度。换相过快时会失步;换相过慢时会出现明显的“吸合—跳转”动作;相序错误时会前后摆动或反转。六步本身还会产生转矩脉动和电磁噪声,这正是本项目在 10 ms/步基线下仍听到周期性声音的主要原因。
六步代码结构
核心安全函数应先关断全部 PWM 和 EN,再等待死区,最后配置下一步:
static void SixStep_AllOff(void)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0U);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0U);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0U);
HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ENB_GPIO_Port, ENB_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ENC_GPIO_Port, ENC_Pin, GPIO_PIN_RESET);
}
以步骤 0 和步骤 1 为例:
case 0U: /* A+ B- C floating */
HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ENB_GPIO_Port, ENB_Pin, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, ccr);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0U);
break;
case 1U: /* A+ C- B floating */
HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ENC_GPIO_Port, ENC_Pin, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, ccr);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0U);
break;
每次换相前应执行:
SixStep_AllOff();
HAL_Delay(1U); // 原型验证用;正式产品应使用定时器死区/调度
/* 配置下一步 */
必须保留硬件 Break,不能通过清除 TIM1_BDTR_BKE 或强制 TIM1_BDTR_MOE 绕过保护。
开环启动经验
本项目经历了以下参数变化:
| PWM 占空比 | 换相间隔 | 结果 |
|---|---|---|
| 约 1% | 20 ms | 电机不动 |
| 约 2% | 20–500 ms | 小角度摆动或需要外力辅助 |
| 约 5% | 500 ms | 能逐步转动,但明显一步一步 |
| 约 5% | 50 ms | 更快、更顺滑 |
| 约 10% | 50 ms | 能自行转动,仍有顿挫 |
| 约 10% | 20 ms | 更连续,但有连续换相声 |
| 约 10% | 10 ms | 当前基线,运动更连续,输入约 22 mA |
这说明低占空比阶段首先受启动转矩和开环跟随能力限制;降低换相间隔后机械运动更连续,但并不能消除六步固有的转矩脉动。
驱动板测试:
驱动板输出ENC与PWMC波形
电机抖动
FOC 原理
FOC 的核心思想
FOC(Field-Oriented Control,磁场定向控制)不直接按六个离散状态切换,而是测量或估计转子电角度,把三相电流变换到随转子旋转的 d-q 坐标系中。这样可以把交流电机的电流分解为:
Id:与转子磁链同向的磁链分量;Iq:与转矩相关的正交分量。
对表贴式永磁同步电机,常用目标是 Id≈0,通过调节 Iq 产生转矩。控制器将目标 Id/Iq 与测量值比较,经两个 PI 电流环得到 Vd/Vq,再通过反 Park 变换和 SVPWM 生成三相 PWM。
典型数据流为:
Ia, Ib, Ic + rotor angle
↓
Clarke transform: abc → αβ
↓
Park transform: αβ → dq
↓
PI current controllers
↓
Inverse Park: dq → αβ
↓
SVPWM / sinusoidal PWM
↓
Three-phase inverter
TI 的电机控制资料将梯形六步和三相无传感器 FOC 分列为两类控制架构;FOC 依赖电流采样和转子位置信息,能够更连续地调节磁场和转矩。[8]
位置角度的重要性
FOC 对转子电角度非常敏感。机械角与电角的关系为:
θe = pole_pairs × θm + θoffset
本项目 HT4315 有 14 对极,因此机械转子转一圈对应 14 个电气周期。角度偏置 θoffset 若错误,可能出现转矩下降、抖动、发热甚至反向转矩。因此 FOC 调试必须先完成:
- 编码器/磁角度传感器的方向确认;
- 电角零位对齐;
- 极对数配置为 14;
- 角度连续性、零点重复性和断电重启行为验证。
FOC 与六步换向的对比
| 项目 | 六步换向 | FOC |
|---|---|---|
| 位置需求 | Hall、反电动势或固定时间开环 | 角度传感器或可靠估算器 |
| 电流波形 | 近似梯形/离散 | 近似正弦、可连续调节 |
| 计算量 | 低 | 较高,需要 Clarke/Park/PI/SVPWM |
| 启动 | 有 Hall 时可靠;纯开环容易失步 | 需要对齐和角度校准 |
| 低速平滑性 | 较差,转矩脉动明显 | 通常更好 |
| 噪声 | 换相声明显 | 可显著降低,但取决于调参和机械结构 |
| 适合本项目 | 第一阶段功率级和相序验证 | 最终外骨骼关节控制 |
六步换向适合作为本项目的 bring-up 工具,验证功率桥、相序、nSLEEP、EN、PWM、故障链路和基本旋转方向;外骨骼关节最终需要位置、速度和电流闭环,FOC 更适合实现柔顺、低噪声和可控转矩。
代码框架示意
以下代码仅表示控制结构,不是可以直接用于人体外骨骼的完整控制器。实际工程还必须加入采样同步、限流、过压、失速、角度失效和急停处理。
typedef struct {
float ia;
float ib;
float ic;
float theta_e;
float id_ref;
float iq_ref;
float vd;
float vq;
} FocState;
static void FOC_CurrentLoop(FocState *s)
{
float i_alpha = s->ia;
float i_beta = (s->ia + 2.0f * s->ib) * 0.577350269f;
float c = arm_cos_f32(s->theta_e);
float sn = arm_sin_f32(s->theta_e);
float id = i_alpha * c + i_beta * sn;
float iq = -i_alpha * sn + i_beta * c;
s->vd = PI_Id(s->id_ref - id);
s->vq = PI_Iq(s->iq_ref - iq);
SVPWM_SetVoltage(s->vd, s->vq, s->theta_e);
}
执行节拍是:TIM1 更新事件触发 ADC 采样,DMA 完成后在固定控制周期中运行 Clarke、Park、PI 和 SVPWM;不要在任意时间读取 ADC 后直接更新 PWM,否则采样延迟和 PWM 更新不同步会增加电流纹波。
MA730GQ-Z 角度传感器集成
器件作用与硬件连接
MA730GQ-Z 是 14 位、非接触式绝对角度传感器,工作电源为 3.0–3.6 V,典型供电为 3.3 V,典型电流约 11.7 mA。器件支持 SPI 绝对角度读取,也提供 ABZ 增量输出和 PWM 角度输出。[9]
MA730 的磁场检测区域位于芯片中心附近,要求永磁体的磁场主要位于封装平面内。典型端轴安装使用径向充磁圆柱磁铁;数据手册建议关注磁铁与芯片的同心度、气隙和磁场强度。推荐在传感器电源脚附近放置约 1 µF 去耦电容,并将 TEST 脚接地;NC 脚保持悬空。[9]
| MA730 引脚 | 功能 | STM32 连接建议 |
|---|---|---|
| 4 | MOSI,SPI 数据输入 | Nucleo SPI_MOSI |
| 5 | CS,片选,低有效 | 任意空闲 GPIO 推挽输出 |
| 7 | MISO,SPI 数据输出 | Nucleo SPI_MISO |
| 8 | GND | 控制器逻辑地 |
| 10 | TEST | 接地,不作普通 GPIO 使用 |
| 12 | SCLK | Nucleo SPI_SCK |
| 13 | VDD | 3.3 V,不能接 5 V |
| 14 | NC | 悬空 |
| 16/11 | MGH/MGL 磁场诊断输出 | 可选 GPIO 输入 |
| 2/6/3 | A/B/Z 增量输出 | 可选定时器编码器接口 |
| 9 | PWM 角度输出 | 可选定时器输入捕获 |
具体 SPI 实例和 CS 引脚必须依据当前 Nucleo 工程和 PCB 实际接线确定,不能直接套用下列示例中的 hspi1 或 MA730_CS_Pin。
SPI 时序与 16 位角度读取
MA730 支持 SPI Mode 0 和 Mode 3,数据 MSB first,最高 SCLK 为 25 MHz。一次完整角度读取需要 16 个时钟;主机 MOSI 发送 0,传感器在 MISO 返回 16 位角度帧。MA730 的 14 位有效角度通常位于返回字的高 14 位,因此读取后应右移 2 位得到 0…16383 的角度码。[9]
SPI 角度读取的关键时序是:CS 拉低后冻结输出缓冲区,发送 16 个时钟,CS 拉高释放输出缓冲区。CS 拉低前后以及寄存器操作前后需要满足数据手册规定的空闲时间。工程上可用微秒级延时或确保 HAL SPI 事务之间有足够间隔;不要在 CS 仍为低时连续拼接未定义的多帧操作。[9]
下面是 STM32 HAL 的保守读取示例。该示例只读角度,不涉及配置寄存器写入:
#include "spi.h"
#include "gpio.h"
#include <stdbool.h>
#define MA730_ANGLE_MASK 0xFFFCU /* 14-bit value left-aligned in 16 bits */
static bool MA730_ReadRawAngle(SPI_HandleTypeDef *hspi, uint16_t *raw14)
{
uint8_t tx[2] = {0x00U, 0x00U};
uint8_t rx[2] = {0x00U, 0x00U};
if (raw14 == NULL) {
return false;
}
HAL_GPIO_WritePin(MA730_CS_GPIO_Port, MA730_CS_Pin, GPIO_PIN_RESET);
if (HAL_SPI_TransmitReceive(hspi, tx, rx, 2U, 2U) != HAL_OK) {
HAL_GPIO_WritePin(MA730_CS_GPIO_Port, MA730_CS_Pin, GPIO_PIN_SET);
return false;
}
HAL_GPIO_WritePin(MA730_CS_GPIO_Port, MA730_CS_Pin, GPIO_PIN_SET);
uint16_t frame = ((uint16_t)rx[0] << 8) | rx[1];
*raw14 = (uint16_t)((frame & MA730_ANGLE_MASK) >> 2);
return true;
}
static float MA730_RawToMechanicalRad(uint16_t raw14)
{
return ((float)raw14 * 2.0f * 3.14159265359f) / 16384.0f;
}
代码中的右移 2 位依据 14 位数据左对齐的 SPI 输出格式;首次接入时应让磁铁缓慢转动一圈,并用逻辑分析仪或串口打印确认角度单调递增、范围覆盖约 0…16383。
方向、零位和磁场诊断
MA730 默认从芯片顶视方向观察时,磁场顺时针旋转会使角度增加;旋转方向和零角都可以编程。[9] 因此安装后必须做三个独立检查:
- 手动按规定正方向转动电机轴,确认
raw14单调增加;若递减,应在软件中反向或更改传感器方向配置,但不能同时做两次反向。 - 将转子机械位置固定在约定零位,读取当前角度作为
angle_offset;运行时执行模 2π 处理。 - 检查 MGH/MGL 或其他磁场诊断信号,确认磁铁没有偏心、气隙过大或磁场过强/过弱。
示例校准代码如下:
typedef struct {
uint16_t zero_raw;
bool reverse;
} MA730_Calibration;
static float MA730_ApplyCalibration(uint16_t raw,
const MA730_Calibration *cal)
{
int32_t delta = (int32_t)raw - (int32_t)cal->zero_raw;
if (cal->reverse) {
delta = -delta;
}
while (delta < 0) {
delta += 16384;
}
while (delta >= 16384) {
delta -= 16384;
}
return ((float)delta * 2.0f * 3.14159265359f) / 16384.0f;
}
angle_offset 只能修正零位,不能修正错误的相序;相序、传感器正方向和控制器正转方向必须分别验证。
机械角到电角
HT4315 有 14 对极,因此电角度计算为:
theta_e = wrap_2pi(14.0f * theta_m + theta_e_offset);
其中 theta_m 是 MA730 测得的机械角,theta_e_offset 是通过电流注入或静态对齐得到的电角零位偏置。 MA730 安装在电机轴上,它测到的是机械轴角;如果传感器安装在减速器输出端,必须根据传动比换算到电机轴角,不能直接乘 14。
static float wrap_2pi(float x)
{
while (x >= 2.0f * 3.14159265359f) {
x -= 2.0f * 3.14159265359f;
}
while (x < 0.0f) {
x += 2.0f * 3.14159265359f;
}
return x;
}
static float MA730_MechanicalToElectrical(float theta_m,
float theta_e_offset)
{
return wrap_2pi(14.0f * theta_m + theta_e_offset);
}
MA730 接入六步换向
接入 MA730 后,最直接的升级是从固定时间换相改为角度扇区换相。不要再使用:
HAL_Delay(SIXSTEP_STEP_MS);
而应周期性读取 theta_e,将电角度划分为六个 60° 扇区:
static uint8_t SixStep_SectorFromAngle(float theta_e)
{
const float sector = 3.14159265359f / 3.0f;
uint8_t s = (uint8_t)(theta_e / sector);
return (s >= 6U) ? 5U : s;
}
void SixStep_RunWithMA730(void)
{
uint16_t raw;
if (!MA730_ReadRawAngle(&hspi1, &raw)) {
SixStep_AllOff();
HAL_GPIO_WritePin(MOTOR_ENABLE_GPIO_Port,
MOTOR_ENABLE_Pin,
GPIO_PIN_RESET);
return;
}
float theta_m = MA730_ApplyCalibration(raw, &ma730_cal);
float theta_e = MA730_MechanicalToElectrical(theta_m,
theta_e_offset);
uint8_t sector = SixStep_SectorFromAngle(theta_e);
SixStep_Apply(sector, current_pwm_ccr);
}
实际项目中必须在固定控制周期内执行,并加入角度跳变检测、SPI 超时检测、磁场失效检测和 nFAULT 处理。角度读取失败时必须关闭三相输出,而不是保持上一状态继续驱动。
MA730 接入 FOC
FOC 不使用六步 sector 查表,而应直接使用连续电角度:
uint16_t raw;
if (!MA730_ReadRawAngle(&hspi1, &raw)) {
Motor_DisableImmediately();
return;
}
float theta_m = MA730_ApplyCalibration(raw, &ma730_cal);
float theta_e = MA730_MechanicalToElectrical(theta_m,
theta_e_offset);
FOC_UpdateCurrentLoop(theta_e, id_ref, iq_ref);
调试顺序是:先只读 MA730 并通过串口输出角度;然后验证正方向和零位;再执行小电流静态对齐;随后闭合 Iq 电流环;最后才闭合速度环和位置环。不能在角度方向、极对数和零位未验证时直接运行 FOC。
传感器故障保护
MA730 不是功率级故障保护器件,不能替代 MPQ6547A 的 nFAULT、TIM1 Break 和硬件急停。建议至少实现以下判定:
| 故障 | 判定方法 | 动作 |
|---|---|---|
| SPI 超时 | HAL SPI 返回错误 | 立即关闭 PWM、EN 和 nSLEEP |
| 角度跳变 | 单周期变化超过物理最大速度 | 关闭驱动并记录故障 |
| 磁场异常 | MGH/MGL 指示异常或角度噪声突增 | 禁止启动 |
| CS/SCLK/MISO 断线 | 连续读取固定值或全 0/全 1 | 禁止换相 |
| 电角度不连续 | 模运算后出现异常跳变 | 进入安全关断 |
| nFAULT/BKIN 低 | 硬件 Break 或驱动故障 | 保持关闭,等待人工复位 |
六、 演示视频与功能验证
七、源码
exo_motor_bringup.zip (14.8 MB)
八、 参考文献
[1] Monolithic Power Systems. “MA730 – 14-Bit, Digital Angle Sensor with ABZ & PWM Outputs.”
[2] Monolithic Power Systems. “MPQ6547A – 32V, 4A Peak Current, Three-Phase Power Stage.”
[3] Monolithic Power Systems. “MCS1805 – Hall-Effect Linear Current Sensor with OCD.”
[4] Monolithic Power Systems. “MP2797 - 7 to 16-Cell Battery Monitor and Protector.”
[5] Monolithic Power Systems. “MP4201 – 100V, Synchronous Bi-Directional Buck-Boost Controller.”
[6] Monolithic Power Systems, MPQ6547A-AEC1 产品页,器件输入范围、三相功率级、PWM/EN 输入、同步整流和保护功能。
[7] Microchip, Introduction to Six-Step Sensored BLDC Motor Commutation,Hall 扇区、六步导通顺序和两相导通/一相悬空原理。
[8] Texas Instruments, MSPM0 Motor Control, SPRAD34,梯形六步控制、Hall 传感器控制和三相无传感器 FOC 架构概览。
[9] Monolithic Power Systems, MA730 产品页,MA730GQ-Z 的绝对角度、SPI、ABZ/PWM、供电和机械磁场安装信息;另参见 MA730GQ-Z 官方数据手册。

















