{"code":1,"msg":"成功","time":"1791589110","data":{"title":"【2026嵌入式大赛】 GD32H759+ RT-Thread Nano  BLDC电机控制","content":"## 一、项目概述\r\n\r\n无刷直流电机（BLDC）凭借高效率、长寿命、低噪声、高功率密度等优势，已成为工业自动化、机器人、风机水泵、电动工具等领域的主流执行机构。BLDC 的驱动核心在于根据转子位置按顺序导通三相逆变桥，而霍尔传感器方案以其简单可靠、成本低廉，成为工业场合最常用的位置检测方式。\r\n\r\n本项目以**兆易创新 GD32H759I-EVAL 开发板**为核心控制器，运行 **RT-Thread Nano 实时操作系统**，通过 **TIMER0 高级定时器输出六路互补 PWM**，驱动**正点原子 ATK-PD6010B 大功率直流无刷驱动板**（DC12~60V \/ 最大 10A \/ 600W），实现对 **57BL50A2430 无刷直流电机**（24V 级，内置霍尔传感器）的**霍尔六步换相控制**，并完整实现了**电位器无级调速、正反转切换、三相电流\/母线电压\/板载温度实时采集、上位机波形监控**等实用功能。\r\n\r\n## 二、功能介绍\r\n\r\n### 2.1 功能清单\r\n\r\n| 功能 | 实现说明 |\r\n| --- | --- |\r\n| 霍尔六步换相驱动 | 基于 3 路霍尔位置信号（PE0\/PE1\/PE2），120° 导通六步换相，PWM 频率 15kHz，单极性 PWM 调制 |\r\n| 启停控制 | K3 按键（PC13）切换启动\/停止；启动前校验霍尔状态有效性（1~6），停止时按安全时序关断 |\r\n| 方向切换 | USER 按键（PF8）切换正\/反转，自动完成\"停止 → 换向 → 重新启动\"完整时序 |\r\n| 电位器无级调速 | ADC2（PC2_C）采样电位器电压，12bit → 千分比占空比（0~1000‰），内置 30‰ 死区防抖动，100ms 刷新 |\r\n| 三相电流采集 | 驱动板 20mΩ 采样电阻 + 6 倍差分放大 + 1.25V 偏置，ADC0 采样换算，一阶低通滤波（α=0.15） |\r\n| 母线电压采集 | PA1 经 25 倍分压换算，实时监测母线电压 |\r\n| 板载温度采集 | PA2 采集 10K NTC（B=3950）分压，对数公式计算温度 |\r\n| 串口调试打印 | 独立线程周期打印母线电压\/三相电流\/霍尔状态\/运行状态，可配置打印项与周期 |\r\n| 上位机波形监控 | USART2（460800bps）按 VOFA JustFloat 协议上传 4 通道波形（Iu\/Iv\/Iw\/VBUS） |\r\n| 运行指示 | LED1（PF10）500ms 周期闪烁，指示系统运行状态 |\r\n| 安全保护 | 驱动板硬件过流锁存保护（约 10.4A 触发）+ 软件启动占空比下限（10%）+ 软件关断时序 |\r\n\r\n### 2.2 操作说明\r\n\r\n1. **上电**：开发板供电后，串口输出系统 banner（见第七章），LED1 开始 500ms 周期闪烁；\r\n2. **设定转速**：旋转电位器，设定目标占空比（占空比低于 10% 时启动将自动抬高至 10% 下限）；\r\n3. **启动**：按下 **K3（PC13）**，系统读取霍尔状态并校验 → SHUTDOWN 拉高使能 H 桥 → 按当前方向执行六步换相，电机开始运转；\r\n4. **调速**：运行中旋转电位器，100ms 内更新占空比并实时下发到换相逻辑；\r\n5. **换向**：按下 **USER（PF8）**，系统自动执行\"停止 → 方向取反 → 重新启动\"；\r\n6. **停止**：再次按下 **K3**，PWM 输出清零 → 延时 2ms → SHUTDOWN 拉低关断 H 桥，电机自由停转；\r\n7. **监控**：上位机（VOFA+ 等）连接 USART2 串口可观察三相电流与母线电压实时波形；连接 USART0 控制台可查看 FinSH 与调试日志。\r\n\r\n---\r\n\r\n## 三、硬件框架\r\n\r\n### 3.1 系统硬件框图\r\n\r\n\r\n![screenshot_image.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261007\/dd33ab205c4df859d2aeae6f3c63df95.png.webp)\r\n实物连接如下所示：\r\n\r\n![screenshot_5c786711eaaefb3dd5b887b8f427f878.jpg](https:\/\/oss-club.rt-thread.org\/uploads\/20261007\/db77892481578706d37b387c9de8d090.jpg.webp)\r\n\r\n### 3.2 硬件选型\r\n\r\n| 模块 | 型号 | 关键参数 \/ 说明 |\r\n| --- | --- | --- |\r\n| 主控开发板 | 兆易创新 GD32H759I-EVAL（V2.1） | GD32H759，Arm Cortex-M7，最高 600MHz，1552 DMIPS \/ CoreMark 2888，3840KB Flash，1024KB SRAM，LQFP176，121 个 IO |\r\n| 电机驱动板 | 正点原子 ATK-PD6010B | DC12~60V 宽压输入，最大输出电流 10A，最大驱动功率 600W；三相 H 桥（6×IRFS3607 + IR2110S 栅极驱动）；控制信号光耦隔离；支持霍尔\/编码器\/过零检测；3 相电流 + 3 相反电动势 + 母线电压 + 温度采集；硬件过流保护 |\r\n| 无刷电机 | 57BL50A2430 | 57 机座无刷直流电机，24V 级额定电压，内置霍尔传感器（属 57BL 系列典型规格：额定转速约 3000rpm 级） |\r\n| 直流电源 | 24V 开关电源 | 为 PD6010B 提供母线电压 |\r\n| 电位器 | 10K 电位器 | 转速给定，接入 PC2_C（ADC2_IN0） |\r\n| 调试上位机 | VOFA+ \/ 串口助手 | USART2 波形监控 \/ USART0 控制台日志 |\r\n\r\n### 3.3 接线说明（开发板 ↔ 驱动板）\r\n\r\n| 功能 | 开发板引脚 | 驱动板信号 | 备注 |\r\n| --- | --- | --- | --- |\r\n| U 相上桥 PWM | PE8（TIMER0 输出, AF1） | PWM_UH | 与 PE9 构成互补对 |\r\n| U 相下桥 PWM | PE9（TIMER0 互补输出, AF1） | PWM_UL | |\r\n| V 相上桥 PWM | PE10（TIMER0 输出, AF1） | PWM_VH | 与 PE11 构成互补对 |\r\n| V 相下桥 PWM | PE11（TIMER0 互补输出, AF1） | PWM_VL | |\r\n| W 相上桥 PWM | PE12（TIMER0 输出, AF1） | PWM_WH | 与 PE13 构成互补对 |\r\n| W 相下桥 PWM | PE13（TIMER0 互补输出, AF1） | PWM_WL | |\r\n| 霍尔 U | PE0 | H&Z_U | 上拉输入 |\r\n| 霍尔 V | PE1 | H&Z_V | 上拉输入 |\r\n| 霍尔 W | PE2 | H&Z_W | 上拉输入 |\r\n| H 桥使能 | PE3 | CTRL_SD | 高电平使能，低电平关断（软件 SHUTDOWN） |\r\n| 制动控制 | PE4 | R_BREAK | 预留，配合 JP1 跳线可选制动电阻控制 |\r\n| 电流采样 U | PA5 | AMP_IU | ADC0_IN19 |\r\n| 电流采样 V | PA6 | AMP_IV | ADC0_IN3 |\r\n| 电流采样 W | PA7 | AMP_IW | ADC0_IN7 |\r\n| 母线电压 | PA1 | VBUS | ADC0_IN17，25 倍分压 |\r\n| 温度采样 | PA2 | VTEMP | ADC0_IN14，10K NTC |\r\n| 转速给定 | PC2_C | — | ADC2_IN0，电位器输入 |\r\n| 控制台串口 | PA9 \/ PA10 | — | USART0，RT-Thread FinSH + rt_kprintf |\r\n| 波形串口 | PB10 \/ PB11 | — | USART2，VOFA JustFloat，460800bps |\r\n\r\n### 3.4 驱动板（ATK-PD6010B）接口要点\r\n\r\n- **CN3（2×12P 牛角座）**：驱动板专用控制\/采集接口，含 6 路互补 PWM（PWM_UH\/UL、VH\/VL、WH\/WL）、3 路霍尔\/过零信号（H&Z_U\/V\/W）、3 路编码器信号（ENCA\/B\/Z）、3 路电流（AMP_IU\/V\/W）、3 路反电动势（BEMF_U\/V\/W）、母线电压（VBUS）、温度（VTEMP）以及停机关断信号（CTRL_SD）；\r\n- **CN1（5P 端子）**：电机三相动力线 Motor_U\/V\/W + 电源 VIN\/GND（DC12~60V）；\r\n- **CN2（8P 端子）**：电机编码器\/霍尔接口，默认 5V 供电（JP2 可选 11V）；\r\n- **JP3**：霍尔\/过零检测选择跳线，本方案默认短接 1-2 脚使用霍尔检测；\r\n- **电流采集换算**：采样电阻 20mΩ，差分放大倍数 6，偏置 1.25V，即\r\n  `I = (V_ADC × 3.3 \/ 4095 − 1.25) \/ (6 × 0.02)（A）`；\r\n- **母线电压采集**：12K+12K+1K 分压，`VBUS = V_ADC × 25`；\r\n- **温度采集**：10K NTC（25℃）与 4.7K 电阻分压，`VTEMP = 3.3V × 4.7K \/ (Rt + 4.7K)`；\r\n- **过流保护**：硬件比较器阈值约 10.4A（含 0.5A 迟滞），R70 默认焊接为锁存模式——过流后 H 桥持续关断，需 CTRL_SD 拉低复位；\r\n- **电机接线**：相线按黄 U、绿 V、蓝 W 一一对应接入 CN1；霍尔信号线与相线颜色对应，接反将导致电机无法正常工作甚至烧毁驱动板。\r\n\r\n---\r\n\r\n## 四、软件框架说明\r\n\r\n### 4.1 软件架构\r\n\r\n\r\n![screenshot_image.png](https:\/\/oss-club.rt-thread.org\/uploads\/20261007\/e459837cc2df275d02fec69d5ae5975f.png.webp)\r\n\r\n### 4.2 线程设计\r\n\r\n| 线程 | 优先级 | 栈大小（B） | 周期 | 功能 |\r\n| --- | --- | --- | --- | --- |\r\n| motor（电机控制） | 10 | 2048 | 1ms | 按键扫描、启停\/换向、电位器调速、ADC 采样处理、温度更新 |\r\n| dbg（调试打印） | 18 | 1024 | 500ms（默认，可配置） | 周期打印母线电压\/三相电流\/霍尔\/运行状态 |\r\n| vofa（波形上传） | 20 | 1024 | 10ms（默认，可配置） | USART2 VOFA JustFloat 协议上传波形 |\r\n| led（运行指示） | 20 | 512 | 500ms | LED1 闪烁 |\r\n| finsh（命令行） | 21 | 1024 | — | FinSH MSH 控制台（USART0） |\r\n| idle（空闲） | 最低 | — | — | RT-Thread 系统空闲线程 |\r\n\r\n> 优先级数值越小优先级越高（RT-Thread 32 级优先级）。电机控制线程优先级最高且周期最短（1ms），保证换相与调速的实时性；调试与波形线程优先级较低，利用空闲时间片执行，不干扰电机控制。\r\n\r\n### 4.3 RT-Thread 使用情况概述\r\n\r\n- **内核**：RT-Thread Nano（Keil RTE 集成，版本 3.1.5），Arm Cortex-M7 移植，系统节拍 1000Hz（1ms tick）；\r\n- **线程管理**：`rt_thread_create \/ rt_thread_startup` 创建 4 个应用线程，`rt_thread_mdelay` 进行延时调度（电机控制循环 1ms 周期稳定运行）；\r\n- **组件自动初始化**：使用 `INIT_APP_EXPORT(MOTOR_APP_Start)` 由 RT-Thread 组件初始化机制自动创建电机控制线程，无需手工调用；\r\n- **内核配置**：32 级线程优先级、512KB 动态堆（`RT_HEAP_SIZE = 500*1024`）、软件定时器关闭、信号量与邮箱支持、FinSH MSH（仅 MSH 模式）命令行；\r\n- **控制台**：`rt_kprintf` 经 USART0（EVAL_COM）输出，支持 CR\/LF 转换，串口中断由 RT-Thread tick 框架统一管理（SysTick → `rt_os_tick_callback`）；\r\n- **板级适配**：`board.c` 完成 SystemCoreClock 更新、SysTick 配置、堆初始化、USART0 控制台注册与 `rt_hw_console_output` \/ `rt_hw_console_getchar` 实现。\r\n\r\n---\r\n\r\n## 五、软件模块说明\r\n\r\n### 5.1 模块划分总览\r\n\r\n| 模块 | 文件 | 职责 |\r\n| --- | --- | --- |\r\n| motor_config | Motor\/motor_config.h | 引脚定义、PWM 频率\/死区、ADC 通道、换算系数、滤波参数、线程参数等集中配置 |\r\n| motor_pwm | Motor\/motor_pwm.c\/h | TIMER0 六路互补 PWM 初始化、占空比写入、输出使能\/关断、影子寄存器更新 |\r\n| motor_hall | Motor\/motor_hall.c\/h | 霍尔引脚初始化、霍尔状态读取（含连续两次采样防抖） |\r\n| motor_commutate | Motor\/motor_commutate.c\/h | 目标占空比\/方向管理、六步换相表执行（正\/反向） |\r\n| motor_control | Motor\/motor_control.c\/h | 启停按键、方向按键、电位器调速轮询、电机启停安全时序、运行状态查询 |\r\n| motor_adc | Motor\/motor_adc.c\/h | ADC0 软件触发采样、电流\/电压换算与滤波、NTC 温度计算、ADC2 电位器采样 |\r\n| motor_app | Motor\/motor_app.c\/h | 电机控制线程入口，按序初始化各模块，进入 1ms 周期轮询 |\r\n| debug_print | MDK-ARM\/debug_print.c\/h | 独立调试打印线程，支持打印项掩码与周期配置 |\r\n| vofa | MDK-ARM\/vofa.c\/h | USART2 VOFA JustFloat 协议数据上传线程 |\r\n| 板级支持 | RTE\/RTOS\/board.c、Utilites\/gd32h759i_eval.c | RT-Thread 板级适配（tick\/控制台\/堆）、LED\/按键\/串口底层驱动 |\r\n\r\n### 5.2 各模块详细说明\r\n\r\n#### （1）motor_config —— 参数集中配置\r\n\r\n所有硬件相关参数集中在 `motor_config.h`，包括：\r\n\r\n- PWM：`PWM_FREQ_HZ = 15000Hz`（15kHz）、`PWM_DEADTIME_NS = 500ns`、TIMER0、GPIOE AF1、PE8~PE13；\r\n- 霍尔：PE0\/PE1\/PE2，上拉输入，防抖 10μs；\r\n- 按键：K3 = PC13（启停）、PF8（方向）；\r\n- H 桥 IO：SHUTDOWN = PE3（高使能）、BRAKE = PE4；\r\n- ADC：ADC0 12bit、3.3V 参考、通道映射（电流\/电压\/温度）、电位器 ADC2（PC2_C → IN0）、采样周期分频、30‰ 死区；\r\n- 换算：`AMP_VPERA = 6 × 0.02 = 0.12 V\/A`、`VBUS_DIV = 25`、NTC B = 3950、LPF α = 0.15；\r\n- 线程参数：电机线程栈 2048B、优先级 10、周期 1ms。\r\n\r\n#### （2）motor_pwm —— 六路互补 PWM 驱动\r\n\r\n核心功能：\r\n\r\n- **引脚初始化**：PE8~PE13 配置为复用推挽输出，AF1（TIMER0 功能）；\r\n- **定时器配置**：TIMER0 中心对齐模式（`TIMER_COUNTER_CENTER_BOTH`，向上计数），周期 `CAR = timerClk \/ (2 × 15kHz)`，死区 `DT = timerClk(MHz) × 500ns`；\r\n- **通道配置**：CH0\/CH1\/CH2 三路主输出 + 三路互补输出全部使能，PWM 模式 0，输出极性高有效，空闲电平低，开影寄存器（shadow）实现占空比同步更新；\r\n- **接口**：\r\n  - `MOTOR_PWM_SetPairDuty(subModule, dutyA, dutyB)`：dutyA = 上桥 PWM 占空比（0~1000‰），dutyB = 1000 表示下桥常通（互补输出拉低，下管全程导通），两者均为 0 时关闭该相输出（防止悬空）；\r\n  - `MOTOR_PWM_UpdateAll()`：软件产生 UPG 事件，影子寄存器统一生效；\r\n  - `MOTOR_PWM_EnableOutput \/ DisableOutput`：单相输出使能\/关断。\r\n\r\n#### （3）motor_hall —— 霍尔位置检测\r\n\r\n- PE0\/PE1\/PE2 配置为上拉输入，分别对应霍尔 U\/V\/W；\r\n- `MOTOR_HALL_ReadState()`：读取三路霍尔电平，组合为 1~6 的有效状态值（bit0=U、bit1=V、bit2=W）；\r\n- `MOTOR_HALL_GetStableState()`：连续两次读取一致才返回，用于抗抖。\r\n\r\n#### （4）motor_commutate —— 六步换相\r\n\r\n- 管理目标占空比（`s_targetDuty`，0~1000‰）与方向（`s_direction`）；\r\n- `MOTOR_Comm_Execute(hallState)` 根据霍尔状态查表输出三相的\"上桥 PWM \/ 下桥常通 \/ 关断\"组合（见第六章换相表）；\r\n- 反向换相表由正向表\"上 PWM 相与下常通相对调\"得到，实现反转。\r\n\r\n#### （5）motor_control —— 启停与调速控制\r\n\r\n- 按键扫描带软件防抖（10ms）与锁定（300ms），检测下降沿；\r\n- **启动时序**：校验霍尔（1~6）→ 读电位器占空比（<10% 时抬升至 10%）→ SHUTDOWN 拉高使能 H 桥 → 按当前霍尔执行换相 → 置运行标志；\r\n- **停止时序**：三相 PWM 全部清零 → 影子更新 → 延时 2ms → SHUTDOWN 拉低关断 H 桥 → 清运行标志；\r\n- **换向时序**：若运行中先执行停止 → 延时 20ms → 方向取反 → 重新启动；\r\n- **电位器调速**：每 100ms（1ms 轮询 × 100 分频）读取一次电位器，占空比变化时更新目标占空比，若正在运行则按最新霍尔立即执行换相；\r\n- 提供 `MOTOR_CTRL_IsRunning()` 供调试\/波形线程查询运行状态。\r\n\r\n#### （6）motor_adc —— 采集与换算\r\n\r\n- **ADC0**：12bit、右对齐、软件触发单通道采样（`MOTOR_ADC_SampleOne` 动态切换通道，含超时保护），上电执行偏移校准；\r\n- **采样调度**：`MOTOR_ADC_Process()` 每 10 次调用（1ms 周期 → 100Hz）依次采样三相电流与母线电压；\r\n- **电流换算**：`I = (V_ADC × 3.3\/4095 − 1.25) \/ 0.12`，并做一阶低通滤波（α=0.15）；\r\n- **母线电压**：`VBUS = V_ADC × 3.3\/4095 × 25`；\r\n- **温度**：`MOTOR_ADC_TempUpdate()` 每 12 个主循环更新一次，NTC 阻值 `Rt = 4.7K × (3.3\/v − 1)`，再按 B 值公式 `T = 1\/(1\/T0 + ln(Rt\/R0)\/B) − 273.15` 计算；\r\n- **ADC2（电位器）**：12bit，4 次采样平均 → 千分比（0~1000‰）→ 死区 30‰ 归零，防止旋钮噪声导致电机乱转。\r\n\r\n#### （7）motor_app —— 应用入口\r\n\r\n- `MOTOR_APP_Start()` 创建电机控制线程（优先级 10、栈 2048B、时间片 10）；\r\n- 线程内按序初始化 PWM → 霍尔 → 换相 → 控制 → ADC → 电位器 ADC → 调试打印 → VOFA；\r\n- 主循环：`MOTOR_CTRL_Poll()`（按键\/调速\/启停）+ `MOTOR_ADC_Process()`（采样）+ 每 12 次更新一次温度，周期 1ms；\r\n- 通过 `INIT_APP_EXPORT` 注册，由 RT-Thread 组件初始化自动启动。\r\n\r\n#### （8）debug_print —— 调试打印线程\r\n\r\n- 独立线程（优先级 18、栈 1024B），默认周期 500ms，默认打印项为母线电压\/霍尔\/运行状态；\r\n- 打印项通过位掩码配置（VBUS\/Iu\/Iv\/Iw\/HALL\/RUN），支持 `DEBUG_PRINT_SetMask \/ SetPeriod` 动态调整；\r\n- 打印格式自带时间戳（tick）与千分位电压\/电流格式化，方便人工观察。\r\n\r\n#### （9）vofa —— 波形上传\r\n\r\n- 独立线程（优先级 20、栈 1024B），默认周期 10ms；\r\n- USART2（PB10\/PB11）460800bps 8N1，JP9 引出到外部 USB-TTL 连接上位机；\r\n- 按 VOFA **JustFloat** 协议组帧：4 个 float（Iu \/ Iv \/ Iw \/ VBUS）+ 帧尾 `0x00 0x00 0x80 0x7F`；\r\n- 数据源可配置（支持电流\/电压\/温度\/霍尔\/运行状态\/方向\/原始值共 12 种）。\r\n\r\n---\r\n\r\n## 六、关键技术实现\r\n\r\n### 6.1 互补 PWM 与死区\r\n\r\nBLDC 三相 H 桥由 6 个开关管组成，每相上下管必须严格互斥导通，否则母线直通短路。本设计使用 GD32H759 **TIMER0 高级定时器**：\r\n\r\n```c\r\ntimerInit.alignedmode = TIMER_COUNTER_CENTER_BOTH;   \/* 中心对齐 *\/\r\ntimerInit.period      = s_carVal;                    \/* CAR = timerClk\/(2×15kHz) *\/\r\n...\r\nocInit.outputstate  = TIMER_CCX_ENABLE;              \/* 主输出使能 *\/\r\nocInit.outputnstate = TIMER_CCXN_ENABLE;             \/* 互补输出使能 *\/\r\n...\r\nbrkInit.deadtime = s_dtVal;                          \/* 死区 500ns *\/\r\ntimer_break_config(MOTOR_PWM_BASE, &brkInit);        \/* 刹车\/死区配置 *\/\r\n```\r\n\r\n- **中心对齐模式**：计数器先增后减，PWM 波形关于周期中心对称，换相点附近的电流纹波更小，电机噪声与转矩脉动更低；\r\n- **硬件死区**：互补输出在上下管切换间自动插入 500ns 死区，从硬件层面杜绝直通；\r\n- **影子寄存器**：占空比写入后由 `MOTOR_PWM_UpdateAll()`（软件 UPG 事件）统一加载，避免更新时刻不一致导致的相间畸变；\r\n- 15kHz 开关频率兼顾可听噪声抑制与开关损耗。\r\n\r\n### 6.2 六步换相原理与换相表\r\n\r\n无刷电机三相绕组呈 120° 空间分布，任意时刻只导通两相（一相上桥 PWM、一相下桥常通），第三相关断，合成旋转磁场带动转子运转。霍尔传感器每 60° 电角度改变一次状态，一个电周期产生 6 个状态，对应 6 个换相组合：\r\n\r\n**正向换相表：**\r\n\r\n| 霍尔状态 | 上桥 PWM 相 | 下桥常通相 | 关断相 |\r\n| --- | --- | --- | --- |\r\n| 0x06 | V | W | U |\r\n| 0x04 | V | U | W |\r\n| 0x05 | W | U | V |\r\n| 0x01 | W | V | U |\r\n| 0x03 | U | V | W |\r\n| 0x02 | U | W | V |\r\n\r\n**反向换相表：** 将正向表中每个状态的\"上桥 PWM 相\"与\"下桥常通相\"对调（例如 0x06：W 上桥 PWM、V 下桥常通），即可驱动电机反转。\r\n\r\n代码实现采用查表法，语义清晰、易于校验：\r\n\r\n```c\r\ncase 0x05:  \/* W上PWM，U下常通 *\/\r\n    MOTOR_PWM_SetPairDuty(MOTOR_PWM_SUBMOD_U, 0, 1000);   \/* U下桥常通 *\/\r\n    MOTOR_PWM_SetPairDuty(MOTOR_PWM_SUBMOD_V, 0, 0);      \/* V关断 *\/\r\n    MOTOR_PWM_SetPairDuty(MOTOR_PWM_SUBMOD_W, s_targetDuty, 0); \/* W上桥PWM *\/\r\n    break;\r\n```\r\n\r\n其中 `MOTOR_PWM_SetPairDuty(phase, dutyA, dutyB)` 语义：`dutyA` = 上桥 PWM 占空比（0=常关），`dutyB` = 1000 表示下桥常通（互补输出输出低电平，下管全程导通）。占空比通过 `pulse = duty × CAR \/ 1000` 换算为定时器比较值。\r\n\r\n### 6.3 启停安全时序\r\n\r\n大功率 BLDC 驱动对上下电时序敏感，本设计在软件层面做了两层保护：\r\n\r\n```c\r\n\/* 启动：先使能H桥，再输出换相 *\/\r\ngpio_bit_set(SHUTDOWN_GPIO_PORT, SHUTDOWN_PIN_NUM);   \/* CTRL_SD=1 使能 *\/\r\nMOTOR_Comm_Execute(hall);\r\n\r\n\/* 停止：先清PWM，再关断H桥 *\/\r\nMOTOR_PWM_SetPairDuty(U, 0, 0);  MOTOR_PWM_SetPairDuty(V, 0, 0);  MOTOR_PWM_SetPairDuty(W, 0, 0);\r\nMOTOR_PWM_UpdateAll();\r\nrt_thread_mdelay(2);                                    \/* 等桥臂放电完成 *\/\r\ngpio_bit_reset(SHUTDOWN_GPIO_PORT, SHUTDOWN_PIN_NUM);  \/* CTRL_SD=0 关断 *\/\r\n```\r\n\r\n- **启动**：霍尔校验通过后才使能 H 桥，避免在位置未知状态下直接强驱；\r\n- **停止**：先移除全部 PWM 激励并等待 2ms，让功率管关断、母线电压回落，再关断 H 桥，避免突然断流产生的反电动势尖峰冲击；\r\n- 启动占空比下限 10%，防止小占空比下无法建立足够的启动转矩。\r\n\r\n### 6.4 电位器调速与死区处理\r\n\r\n- ADC2 12bit 采样，4 次平均降噪 → `percent = raw × 1000 \/ 4095` 映射到千分比；\r\n- 死区 30‰：低于该值的占空比强制归零，防止电位器在零位附近的噪声引起电机蠕动；\r\n- 运行中每 100ms 检测一次占空比变化，变化即更新目标占空比并立即按当前霍尔重新执行换相，实现\"无感变速\"。\r\n\r\n### 6.5 电流 \/ 电压 \/ 温度采集换算\r\n\r\n```c\r\n\/* 电流：V→A *\/\r\nv = raw × 3.3f \/ 4095.0f;\r\ncurrent_raw = (v - 1.25f) \/ (6.0f × 0.02f);      \/* 1.25V偏置, 6倍增益, 20mΩ采样电阻 *\/\r\ncurrent += 0.15f × (current_raw - current);      \/* 一阶低通滤波 *\/\r\n\r\n\/* 母线电压 *\/\r\nvbus = raw × 3.3f \/ 4095.0f × 25.0f;             \/* 25倍分压 *\/\r\n\r\n\/* NTC温度 *\/\r\nRt = 4.7f × (3.3f \/ v - 1.0f);\r\nT  = 1.0f \/ (1.0f\/298.15f + logf(Rt\/10.0f)\/3950.0f) - 273.15f;\r\n```\r\n\r\n### 6.6 过流保护联动\r\n\r\n- **硬件层**：PD6010B 板载比较器过流检测（约 10.4A + 0.5A 迟滞），R70 默认焊接为**锁存保护**——一旦过流，栅极驱动 IC 被强制关断并自锁，过流指示灯点亮；\r\n- **软件层**：锁存状态下必须 `CTRL_SD=0` 才能复位。软件停止时序中的\"先清 PWM → 延时 → SHUTDOWN 拉低\"即承担了复位职责；启动时 SHUTDOWN 拉高重新使能；\r\n- 同时软件限制启动占空比下限，并建议在大功率应用中使用缓启动，避免瞬时大电流触发硬件保护。\r\n\r\n---\r\n\r\n## 七、调试与测试\r\n\r\n### 7.1 串口启动日志\r\n\r\n```\r\n===== GD32H759 BLDC (RT-Thread Nano) =====\r\nPress K3 (PC13) to Start \/ Stop\r\nTarget duty = 200\r\n\r\n[PWM] timerClk=300000000, CAR=10000, DT=150\r\n[HALL] PE0\/PE1\/PE2 init\r\n[COMM] init done\r\n[CTRL] init done\r\n[ADC] ADC0 software-trigger init\r\n[POT] ADC2 init done, PC2_C -> ADC2_IN0\r\n[DBG] debug print thread started\r\n[MotorApp] Motor thread created\r\n\r\n[Motor] Start, hall=0x05, duty=200, dir=FWD\r\n[  123] VBUS=23.980V HALL=0x05(101) RUN=On\r\n[  623] VBUS=23.961V HALL=0x03(011) RUN=On\r\n[Motor] Direction -> REV\r\n[Motor] Stop\r\n[Motor] Start, hall=0x05, duty=200, dir=REV\r\n[Motor] Stop\r\n```\r\n\r\n### 7.2 VOFA 波形监控\r\n\r\n- 上位机选择 **JustFloat** 协议，波特率 460800；\r\n- 4 个通道分别为 **Iu \/ Iv \/ Iw \/ VBUS**（10ms 刷新）；\r\n- 可直观观察：启动瞬间电流冲击、六步换相电流换向、调速时电流幅值变化、母线电压跌落等；\r\n- 波形数据用于换相表正误校验（电流在换相点应平滑换向）与调速逻辑验证。\r\n\r\n### 7.3 调试过程中解决的主要问题\r\n\r\n| 问题 | 原因 | 解决方案 |\r\n| --- | --- | --- |\r\n| ADC 采样方案复杂、占用资源 | 最初规划 TIMER2 触发 + DMA 连续采样，链路长、调试成本高 | 改为 ADC0 软件触发 + 轮询采样（每通道 100Hz），电位器 4 次平均，保留配置宏以便未来升级回 DMA 方案 |\r\n| 电机启停瞬间母线电压冲击 | 直接关断 H 桥导致反电动势叠加 | 停止时序改为\"清 PWM → 延时 2ms → SHUTDOWN 关断\" |\r\n| 忙等延时阻塞系统 | 原 `MOTOR_DELAY_Us` 轮询延时 | 改用 `rt_thread_mdelay`，将 CPU 让给低优先级线程 |\r\n| 电位器零位噪声导致电机乱转 | 旋钮机械噪声经 ADC 放大 | 加入 30‰ 死区 + 4 次平均滤波 |\r\n| 启动时偶尔失败 | 霍尔状态无效（0x00\/0x07） | 启动前校验霍尔 1~6，无效则拒绝启动并打印原因 |\r\n| 换相瞬间电流波形异常 | 占空比更新时刻不一致 | 全部占空比写入后经影子寄存器统一更新（`MOTOR_PWM_UpdateAll`） |\r\n\r\n### 7.4 测试结论\r\n\r\n- 电机可正常启动、稳定运行，正反转切换可靠；\r\n- 电位器调速平滑，占空比 10%~100% 范围内响应实时；\r\n- 三相电流波形符合六步换相预期，换相点电流换向平滑；\r\n- 系统连续运行稳定，1ms 电机控制线程无阻塞，调试\/波形线程正常输出；\r\n- 驱动板过流保护链路（硬件锁存 + 软件复位）验证有效。\r\n\r\n---\r\n\r\n## 八、演示视频\r\n\r\n\r\n[BLCD电机控制演示.mp4](https:\/\/club.rt-thread.org\/file_download\/23121d55537ae64b)\r\n\r\n## 九、开源代码地址\r\n\r\nhttps:\/\/github.com\/Zttlab\/2026-RT-Thread-.git\r\n\r\n---\r\n\r\n## 十、总结与展望\r\n\r\n### 10.1 项目总结\r\n\r\n本项目基于 **GD32H759 + RT-Thread Nano** 完成了 57 机座无刷直流电机的霍尔六步换相控制，形成了从\"驱动板选型 → 引脚映射 → PWM 生成 → 换相逻辑 → 采集监控\"的完整闭环。项目的核心价值在于：\r\n\r\n1. **工程化**：将 BLDC 驱动涉及的时序、死区、保护、滤波等工程细节落实到可复用的软件模块；\r\n2. **实时性**：RT-Thread Nano 以 1ms 周期稳定调度电机控制线程，多任务解耦而不互相阻塞；\r\n3. **可观测**：FinSH + 调试打印 + VOFA 波形三位一体的调试链路，大幅缩短调机周期；\r\n4. **可扩展**：模块化分层架构为后续功能升级预留了清晰接口。\r\n\r\n### 10.2 未来展望\r\n\r\n- **FOC 磁场定向控制**：在现有霍尔位置基础上加入 Clarke\/Park 变换与 SVPWM，实现正弦驱动，进一步降低噪声与转矩脉动；\r\n- **速度\/电流双闭环**：利用霍尔信号估算转速，加入 PI 闭环实现恒速控制；\r\n- **无感控制**：利用驱动板过零检测电路（JP3 切换）实现无感六步换相，降低成本；\r\n- **通信扩展**：增加 CAN\/RS485\/EtherCAT 总线接口，支持多电机组网控制，贴近工业应用；\r\n---","updatetime":"2026-10-08 08:36:20","author":"挣点元子"}}