【2026机器人模块大赛】低功耗自适应智能外骨骼柔性髋关节

参赛声明
本作品在 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 调试必须先完成:

  1. 编码器/磁角度传感器的方向确认;
  2. 电角零位对齐;
  3. 极对数配置为 14;
  4. 角度连续性、零点重复性和断电重启行为验证。
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] 因此安装后必须做三个独立检查:

  1. 手动按规定正方向转动电机轴,确认 raw14 单调增加;若递减,应在软件中反向或更改传感器方向配置,但不能同时做两次反向。
  2. 将转子机械位置固定在约定零位,读取当前角度作为 angle_offset;运行时执行模 2π 处理。
  3. 检查 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 官方数据手册。

板子画的很漂亮!期待楼主补冲更多细节

楼主做的怎么样了,看看实际效果