
电机驱动开发学习19. 霍尔 BLDC 三段式 FOC 启动算法一、为什么需要三段式 FOC 启动1.1 三段式启动是什么1.2 与六步「三段启动」的区别二、实验简介2.1 本章目标2.2 硬件三、程序设计3.1 目录结构相对 lesson18 新增/变更3.2 状态机流程阶段 1定位Align阶段 2拖转Drag阶段 3运行Run3.3 关键代码四、调参与串口命令4.1 串口与 lesson18 相同启动自动化4.2 FreeMASTER 建议通道4.3 现场整定参数与 bsp_foc_boot.c 一致五、实验现象5.1 预期波形5.2 VOFA 三通道六、本章小结一、为什么需要三段式 FOC 启动lesson17/18 已实现速度外环 DQ 电流内环 SVPWM电角度 θ 来自霍尔 6 态 TIM5 扇区内插值。但在转子静止或极低速时存在两个根本矛盾问题原因后果θ 不更新霍尔只在转子转过 60° 电角度时才跳变Park 变换用的 θ 与实际转子位置脱节无法直接闭环电流环需要准确 θ 才能解耦 Id/Iq一上电就s 1/w 1电机抖动、堵转或倒转lesson16 已说明不是 PI 公式错而是零速时霍尔给不了连续 θ。本章在 lesson18 工程基础上增加工业界常用的三段式启动解决「从静止到稳定闭环」的衔接。硬件输出Align/Drag 与 Run 均走六步桥单占空比接口 2SVPWM 仅在 Run 中作 FreeMASTER 扇区监视不驱动三相 CCR。1.1 三段式启动是什么借鉴无感 BLDC「预定位 → 外同步加速 → 自同步切换」思路结合霍尔 FOC特点本章划分为阶段英文名θ 来源执行方式目标1 定位Align当前霍尔扇区中心六步固定占空比lesson4 开环不用 FOC转子对齐到已知扇区2 拖转Drag软件插值 θ扇区中心 步内比例六步定时/边沿换相 duty 斜坡加速到霍尔边沿可靠3 运行Run霍尔 TIM5 插值lesson17FOC 速度/电流双环 |V|→单占空比六步板稳定闭环调速说明Align/Drag 在野火六步桥上刻意不用 InvPark/SVPWM与真实导通相不匹配Run 阶段才是完整 FOC 双环。SVPWM 模块仍参与扇区监视FreeMASTER硬件输出走 lesson17 的 |V| 映射——与 lesson11 同级 PWM 利用率1.2 与六步「三段启动」的区别野火官方六步换相例程也有「定位 → 升频换相 → 霍尔闭环」本章在此基础上叠加FOC 运行阶段Align/Drag与 lesson4 相同六步开环定位 duty 拖转换相序但维护开环 θ供监视与交接Drag期间motor_set_openloop_comm()强制换相步霍尔已跟上时可提前对齐Runθ 切回霍尔插值启用速度→Iq→电流 PI→InvPark双环输出|V|→单占空比切换条件bsp_foc_boot.c拖转满FOC_BOOT_DRAG_MIN_MS600后满足任一霍尔边沿 ≥2且 RPM ∈ [60, target120]下限至少到 200或强拖步数 ≥18且边沿 ≥2且 RPM 同上。二、实验简介2.1 本章目标在 lesson18 工程基础上新增bsp_foc_boot.c三段式启动状态机w 1/s 1时自动执行 Align → Drag → Run无需手动开环v命令FreeMASTER 监视g_fm_boot_stage0 idle / 1 align / 2 drag / 3 run / 4 fail拖转失败10 s超时触发 fault3 并关断运行阶段保留 lesson17速度环 DQ 电流环六步板上 Run 输出为 |V|→单占空比lesson18 SVPWM 作扇区监视。2.2 硬件与 lesson4~18 相同野火骄阳 F407无刷驱动板霍尔 BLDC「无刷电机驱动接口2」排线。三、程序设计3.1 目录结构相对 lesson18 新增/变更User/ ├── foc/ │ ├── bsp_foc_boot.c/h ★ 三段式启动状态机本章核心 │ ├── bsp_foc.c/h ★ θ 在 Align/Drag 改读开环角 │ └── bsp_svpwm.c/h lesson18 沿用Run 仅监视 ├── pid/ │ └── bsp_pid_app.c/h ★ 启停时触发 foc_boot_request()Run 用 |V|→duty ├── tim/ │ └── bsp_motor_tim.c/h ★ motor_set_openloop_comm() 强制换相 └── main.c3.2 状态机流程w1 / s1500msedges2 且 RPM60 或 steps1810s 超时s0 / 故障关断复位s0 / 故障s0 / 故障IDLEALIGNDRAGRUNFAIL阶段 1定位Align读当前霍尔态motor_set_openloop_comm(1, hall)强制该步六步换相施加固定占空比FOC_BOOT_ALIGN_DUTY1200不用 FOC / 不用 Vd约FOC_BOOT_ALIGN_MS500ms。阶段 2拖转Drag按霍尔正转序1→3→2→6→4→5→1定时换相速率 4→22 Hz 斜坡占空比 1200→4000每周期 80若下一霍尔态已到位则提前同步强制换相步转子跟上时不再盲拖切换条件见1.2最短拖转 600 ms超时10 s→ fail3。Run 阶段才启用 FOC 双闭环Clark/Park → PI → InvPark → |V|→duty。阶段 3运行Runfoc_get_electrical_theta()Align/Drag 读foc_boot_get_theta()Run/Idle 恢复霍尔 TIM5 插值foc_spd_poll速度环 →g_fm_target_iqdq_curr_poll电流环 → Vd/Vq → InvPark →dq_apply_vmag_sixstep_output()六步板svpwm_calc()仅更新g_fm_svpwm_sector等监视量不set三相独立 CCR 驱动桥臂。3.3 关键代码启动请求bsp_foc_boot.c/** * brief FOC三段式启动启动请求触发函数 * note 当系统收到电机启动指令时调用进入三段式启动流程第一阶段【转子定位Align】 * 适用带霍尔传感器BLDC/内置霍尔PMSM霍尔原始扇区作为初始位置依据 * 三段式启动流程ALIGN定位 → DRAG开环拖转 → RUN霍尔闭环FOC */voidfoc_boot_request(void){// 1. 实时读取当前霍尔电平获取霍尔原始扇区编号(0~5 六扇区)hallmotor_hall_read_now();// 2. 将开环换相步长初始化为当前霍尔扇区// 开环拖转阶段会基于该变量持续递增实现强制换相s_openloop_stephall;// 3. 根据当前霍尔扇区计算该扇区中心点电角度// 目的定位阶段向中心点角度施加恒定电压把转子牢牢吸附到该角度s_thetafoc_boot_hall_center_theta(hall);// 4. 启动状态机切换至【转子对齐阶段 ALIGN】(三段式第1阶段)s_stageFOC_BOOT_ALIGN;// 5. 配置开环换相模式参数1使能开环hall初始霍尔扇区基准motor_set_openloop_comm(1U,hall);// 6. 施加对齐占空比输出恒定矢量电压执行转子定位// 持续通电一段时间(例500ms)保证转子机械角度收敛到目标角度foc_boot_apply_duty(FOC_BOOT_ALIGN_DUTY);// ...后续省略对齐阶段定时计时、超时后自动跳入开环拖转DRAG阶段}拖转阶段 θ 插值与切换bsp_foc_boot.c/* 扇区中心 步内比例供 foc_get_electrical_theta() 在 Drag 期间读取 */s_thetafoc_boot_hall_center_theta(s_openloop_step);s_theta(sub_ratio-0.5f)*(FOC_PI/3.0f);/* 切换边沿≥2 且 RPM≥60或强拖步数≥18 且边沿≥2 */if(s_hall_edgesFOC_BOOT_HANDOVER_EDGESrpmFOC_BOOT_HANDOVER_RPM)foc_boot_enter_run();θ 来源切换bsp_foc.cfloatfoc_get_electrical_theta(void){if(foc_boot_is_active())/* Align / Drag */returnfoc_boot_get_theta();/* 霍尔 TIM5 插值 ... */}开环强制换相bsp_motor_tim.cif(s_openloop_comm)bldcm_commutate(s_openloop_step);elsebldcm_commutate(get_hall_state());模块lesson11lesson17lesson18lesson19本章速度外环✓ 直出 PWM✓→Iq✓✓Run 阶段输出映射PWM 0~5500|V|→单占空比七段 SVPWMRun|V|→单占空比六步板SVPWM——✓仅 FreeMASTER 扇区监视电角度霍尔换相霍尔中心霍尔插值拖转开环 θ 运行霍尔启动无无无三段式状态机四、调参与串口命令4.1 串口与 lesson18 相同启动自动化命令含义t 500目标 RPM 500w 1开速度环自动三段式启动 → 闭环s 1仅电流环同样走三段式启动s 0关断并重校电流零偏pid打印状态含 boot_stage?帮助推荐首次上电流程上电等待cal1电流零偏完成t 500→w 1观察串口FOC boot start→align done - drag→FOC boot handoverFreeMASTER 看g_fm_boot_stage从 1→2→34.2 FreeMASTER 建议通道变量含义g_fm_boot_stage0 idle / 1 align / 2 drag / 3 run / 4 failg_fm_boot_theta_deg开环/运行电角度g_fm_boot_omega拖转等效电角速度由换相频率换算g_fm_boot_hall_edges拖转阶段霍尔边沿计数g_fm_target_rpm/g_fm_actual_rpm速度环Run 后g_fm_iq_actual拖转/运行 Iq 反馈4.3 现场整定参数与bsp_foc_boot.c一致宏默认值说明FOC_BOOT_ALIGN_MS500定位时间 (ms)FOC_BOOT_ALIGN_DUTY1200定位六步占空比不是VdFOC_BOOT_DRAG_DUTY_MAX4000拖转占空比上限FOC_BOOT_DRAG_DUTY_RAMP80拖转每周期 duty 增量FOC_BOOT_DRAG_RATE_INIT_HZ4拖转换相初频 (Hz)FOC_BOOT_DRAG_RATE_MAX_HZ22拖转换相最高频FOC_BOOT_DRAG_MIN_MS600允许切换前最短拖转时间FOC_BOOT_HANDOVER_RPM60切换最低 RPMFOC_BOOT_HANDOVER_EDGES2切换最少霍尔边沿FOC_BOOT_HANDOVER_STEPS18强拖步数备选切换条件FOC_BOOT_DRAG_TIMEOUT_MS10000拖转超时 (ms)FOC_BOOT_RUN_STALL_GRACE_MS4000Run 交接后堵转保护放宽README 旧稿中的FOC_BOOT_ALIGN_VD_V/FOC_BOOT_DRAG_IQ_MA/FOC_BOOT_OMEGA_MAX在本工程中不存在Align/Drag 不走 Vd/Iq FOC。常见问题拖转超时 fail3提高FOC_BOOT_DRAG_DUTY_MAX/ 加快FOC_BOOT_DRAG_RATE_*或略降FOC_BOOT_HANDOVER_RPMRun 后转速卡在 ~350、改 t 无效确认 Run 走的是dq_apply_vmag_sixstep_output|V|不是三相 SVPWM 直驱可t 700再w 1复测仍低于 lesson11FOC 双环有电流限幅属正常可略增FOC_SPD_IQ_FF_PER_RPM或速度环kp转一点就停 / 彻底不转先s 0再t 600w 1查看是否 Stall交接后4 s内堵转保护放宽定位时反转检查霍尔线序与MOTOR_FWD方向五、实验现象5.1 预期波形Align~500 msθ 恒定六步duty1200转子轻微锁定Drag0.5数 sθ 随换相步进爬升g_fm_boot_omega随换相频率上升霍尔边沿计数递增Rung_fm_boot_stage3RPM 跟踪g_fm_target_rpmIq 由电流环调节。5.2 VOFA 三通道速度模式RPM_SP / RPM_ACT / Iq电流模式Iq_SP / Iq_ACT / PWM六、本章小结要点内容问题零速时霍尔 θ 不更新无法直接 FOC 闭环方案Align 六步定位 → Drag 六步开环拖转 → Run 霍尔 FOC|V|→duty新增文件bsp_foc_boot.c/h改动点bsp_foc.cθ 切换、bsp_motor_tim.c开环换相、bsp_pid_app.c启停挂钩与 |V| 输出下一章lesson20迁到接口 1Align/Drag/Run 全程真 SVPWM不是无感观测器至此野火霍尔 BLDC接口 2上的FOC 双闭环 可靠三段启动链路已完整。。