
先把结论放在前面这个开源项目最值得看的不是“初中生”这个标签而是它用一块十几块钱的 STM32F103C8T6 最小系统板把本来需要专用驱动芯片或更高端 MCU 才能做的 FOC 控制器做出来了而且还把控制对象选成了洗衣机里的永磁同步电机。FOC 这个东西很多人一听就觉得是电机控制里的高阶玩法要么觉得硬件贵要么觉得算法难。但这个项目用极坐标思路简化了部分处理流程配合开源资料确实是一条适合从零开始学 FOC 的路线。这篇文章我会按实际落地顺序来拆先讲这个项目解决什么问题、硬件条件怎么准备再讲怎么把程序跑起来、电流采样和极坐标 FOC 的核心参数怎么处理然后讲单电机调试步骤、常见故障排查最后聊一聊从“能转”到“转得稳”要补哪些功课。如果你手里正好有一块 STM32F103C8T6 最小系统板或者想把手头报废洗衣机里的电机利用起来这篇文章应该能帮你少走不少弯路。1. 先确认它到底解决的是“能转”还是“转得稳”FOC 控制全称是磁场定向控制它的核心目标不是简单让电机转起来而是让电机的定子电流始终处于一个可控的矢量状态从而获得平稳的转矩和平滑的转速。和方波驱动、六步换向相比FOC 的优势是噪音低、效率高、动态响应快。但 FOC 的难点也很明显需要采集电机相电流需要知道转子位置需要把三相静止坐标系里的电流转换到旋转坐标系里做 PI 调节需要输出很好的 PWM 波形来控制三相桥臂这个项目叫“简易极坐标 FOC”意思是在算法实现上做了一些简化。极坐标在这里主要指的是把电流矢量从直角坐标的 d-q 分量变成了幅值和角度的表达方式让部分控制逻辑更直观也对初学者更友好。不过需要泼一盆冷水这个项目的定位不是“高性能伺服驱动器”而是“能跑通、能看明白、能低成本复现”的学习型控制器。它更适合用来验证 FOC 的基本流程、理解电流环和速度环的关系、熟悉 SVPWM 和电流采样。如果你的目标是把电机调到像伺服那样高响应、零抖动那需要补的东西还很多这一点后面会展开。1.1 洗衣机电机为什么是个好选择洗衣机里的永磁同步电机通常是指 BLDC 或 PMSM。这两种电机本质上都是永磁同步电机家族只是反电动势波形和设计侧重点有差别。拿洗衣机电机做实验有几个好处便宜二手拆机件几十块钱就能拿到转速不高功率不大用常见的 IR2104 加 MOS 管驱动板就能推动极对数固定霍尔或反电动势过零特征比航模电机更清晰结构相对标准三相线顺序明确不容易接错但要注意洗衣机电机的额定转速一般在几百到一千多转不是航模电机那种几万转的高速电机所以调试时的 PWM 频率、PI 参数、滤波时间常数都要按低速电机来配。1.2 这个项目最值得复现的三个点我建议你把注意力放在下面三块极坐标形式的 FOC 算法结构。很多教材讲的都是 Clarke 变换、Park 变换、PID 调节、逆 Park、SVPWM 这条路线极坐标版本在电流环输出时用幅值和角度来组织更容易理解“电流矢量”到底是怎么工作的。低成本电流采样方案。项目如果用的是采样电阻加运放放大那这套电路对布线和采样时序要求很高调试时能学到很多东西。从开环到闭环的平滑切换。很多新手一上来就期望转起来直接带负载实际上 FOC 调试第一步永远是开环输出确定相序和编码器方向之后才敢切闭环。2. 低配硬件能不能玩先看这几件东西够不够这个项目最吸引人的一点是主控只需要 STM32F103C8T6。它是一颗 Cortex-M3 内核、主频 72MHz、64KB Flash、20KB RAM 的芯片。放在今天看配置不高但跑一个学习型 FOC 控制器是足够的。不过“主控低配”不代表“整个系统低配”。你至少还要准备下面这些东西。2.1 硬件物料清单这张表是通用配置具体以你手里的模块为准部件建议规格用途预算参考主控板STM32F103C8T6 最小系统板运行 FOC 算法和生成 PWM10-20 元电机驱动模块基于 IR2104 或 EG2134 的三相全桥驱动功率放大把 PWM 变成电机端电压20-50 元电机洗衣机拆机永磁同步电机或常见 BLDC被控对象30-80 元电源24V 或 48V 直流电源电流能力 5A 以上给功率板和电机供电50-100 元电流采样采样电阻 运放放大电路或者 ACS712 模块获取相电流数值10-40 元位置传感器霍尔传感器如果电机自带或编码器模块获取转子位置10-80 元调试工具ST-Link V2、USB-TTL 串口模块下载程序、输出日志20-40 元隔离/降压DC-DC 降压模块输出 5V 或 3.3V给 MCU 供电避免主控和功率板共地干扰10 元左右这里最容易忽略的是电流采样。FOC 不是只靠电压就能把电机控好电流环需要每一相或至少两相的电流数据。很多新手把程序烧进去电机不转或者一启动就过流保护问题基本都是出在电流采样上。2.2 为什么主控板供电要隔离或者至少分开STM32F103C8T6 是 3.3V 供电电机驱动板是 12V 到 48V 供电。两者共地是必须的因为单片机输出 PWM 时要有同一个参考地但“共地”不代表“共用一组电源”。如果直接用一个大功率电源同时给电机和主控板供电电机启动瞬间电流冲击会导致电源电压跌落单片机很容易复位。更稳妥的做法是功率部分单独用主电源控制部分用小功率 DC-DC 或 3.3V LDO 单独供电两边的地线在采样点附近单点连接这在项目里看起来是小事实际上决定了调试时是稳定运行还是疯狂重启。2.3 是 STM32F103 的国产替代也可以热搜词里出现的“STM32F103C8T6 国产替代”值得说一句。因为这个项目是开源的所以只要引脚兼容、外设库一致类似型号的国产芯片一般也能跑例如常见的 APM32F103、MM32F103、GD32F103 系列。但要注意国产替代芯片的 ADC 采样时序、Flash 等待周期可能不同部分型号的 TIM1 互补 PWM 输出要和原厂手册再核对如果工程里用了标准库或 HAL 库需要确认对应复杂设备的头文件是否一致如果用国产芯片跑这个项目我建议先直接用原版 STM32 调试好算法再换芯片验证兼容性。不要一上来就混用。3. 程序初始化顺序最影响成功率的环境准备FOC 这种项目跑起来之前的环境配置比代码本身更劝退新人。因为报错通常不是一句清晰的提示而是“电机不转”“电流波形乱”“PWM 输出为零”。我建议第一次测试按下面的顺序来准备环境。3.1 第一步先点灯、再点电机不要直接烧 FOC 程序。先把 STM32F103C8T6 的最小系统工程建好用 ST-Link 下载一个流水灯程序确认三件事下载器驱动正常能识别芯片GPIO 输出正常调试器能在线单步这步大概花半小时但能排除很多基础问题。比如时钟不对、调试口占用、Flash 读保护没解除这些问题一旦混在 FOC 里会让人误以为算法写错了。3.2 第二步确认 TIM1 的 PWM 通道和工作频率FOC 控制电机PWM 生成通常用高级定时器 TIM1 或 TIM8。STM32F103C8T6 只有 TIM1 是高级定时器能输出带死区控制的互补 PWM。先确认这几项PWM 频率。常见配置是 10kHz 到 20kHz洗衣机电机一般选 10kHz 左右比较合适。死区时间。要大于 MOS 管或 IGBT 的关断延迟不然直通短路。IR2104 驱动方案一般设 0.5us 到 2us。互补输出是否使能。如果你的驱动板需要高侧和低侧分别输入就必须打开互补输出。刹车输入和故障引脚。如果驱动板有过流保护反馈要接到 STM32 的刹车输入而不是普通 GPIO。这一步最容易出的问题是用普通定时器替代高级定时器。普通定时器也有 PWM 输出但没有硬件死区直接驱动上下桥臂很容易炸管。3.3 第三步ADC 采样通道分配FOC 电流采样有两种常见方式三电阻采样在电机三相下桥臂分别接采样电阻需要三个 ADC 通道单电阻或双电阻采样用相电流重建第三相电流节省 ADC 通道但对采样窗口要求更严对这个项目来说双电阻或三电阻更稳妥因为洗衣机电机属于中低转速对电流重建的实时性要求没那么极端。ADC 配置时注意采样时间不要太短。如果电机电流变化快采样窗口太窄会采到尖峰噪声。采样触发可以使用定时器触发而不是软件连续采样。这样 PWM 周期和电流采样时刻是严格对齐的更符合 FOC 时序。多通道采样可以用 DMA避免 CPU 频繁进入中断。3.4 第四步串口日志一定要加FOC 程序调试过程极其依赖数据观测。我建议在程序里至少打印下面几类信息当前状态开环模式还是闭环模式目标速度和反馈速度母线电压电流采样原始值当前角度或霍尔状态用串口助手或者简单的上位机查看日志很多时候比看示波器更快定位问题。调试步数先慢后快比如速度从低速开始每次只增加一点不要一步到位。4. 极坐标 FOC 参数从“能转”到“转得稳”的关键调整这个项目的核心是极坐标形式的 FOC。我先用大白话讲一下它和标准 FOC 差异在哪里。标准 FOC 流程大致是采集三相电流Clarke 变换把三相 a-b-c 变成两相静止坐标系 α-βPark 变换根据转子角度把 α-β 变成旋转坐标系 d-q分别对 d 轴和 q 轴电流做 PI 调节逆 Park 变换得到 α-β 电压用 SVPWM 输出到三相桥极坐标 FOC 不直接对 d-q 电流分别调 PI而是把电流矢量用幅值 I 和角度 θ 来表示这样可以更直观地控制“电流多大、方向在哪”。但不管怎么变核心没变都需要准确的转子角度都需要把输出落回三相 PWM。4.1 电流环 PI 参数怎么给第一次调 PI 时不要追求参数最优。建议按这个顺序来先把 d 轴目标电流设为 0q 轴电流给一个很小的值比如 0.5A看电机是否有一个稳定力矩观察电流波形是否收敛如果电流波形发散说明反馈方向反了或角度补偿错误如果电流到达目标值很慢适当增大比例系数如果电流在目标值附近高频振荡减小比例或增大积分限幅一个常见原则是“先比例后积分”并且积分项要加限幅。不然启动瞬间积分饱和输出直接打满电机就像被猛踢了一脚。4.2 角度是最核心的变量FOC 里几乎所有问题最后都会归结到角度上。如果你是带霍尔传感器的电机霍尔信号直接给出 60 度或 120 度电角度区间如果你用的是编码器角度连续但需要考虑初始绝对位置。调角度时注意确认电角度和机械角度的关系。洗衣机电机极对数可能是 4 到 5 对也就是机械转一圈对应 4 到 5 圈电角度。霍尔换向顺序和电机相序一定要匹配。如果不匹配FOC 会让电机产生错误的转矩方向轻则不转重则电流爆表。如果要切无感 FOC即无位置传感器控制通常用反电动势观测器比如滑模观测器 SMO 或龙贝格观测器。这个项目如果只是入门先不要碰无感把传感器版本跑稳定再尝试。4.3 电压限制和母线电压的关系电机能跑多快取决于母线电压。FOC 输出的是三相正弦电压幅值不能超过母线电压允许范围。常说的 SVPWM 最大输出相电压幅值是半母线电压除以根号三不同调制策略略有差别。如果程序里发现速度拉到一定值就上不去或者电流突然增大先看是不是到了电压极限。调低目标速度再看波形是否恢复正常。很多时候不是算法不对而是电机在这个电压下就只能跑这么快。5. 实测调试链路按顺序查不要瞎调参数我自己调试 FOC 类项目时会固定一个排查顺序因为 FOC 涉及的变量太多如果乱调参数很容易把问题从“能查出来”变成“完全摸不着头脑”。5.1 现象一电机完全不转按这个顺序查主控是否进入了闭环模式。很多程序默认停在开环或待机状态需要串口指令或按键触发。PWM 是否有输出。用示波器或逻辑分析仪看 TIM1 通道如果 PWM 全为低或全为高说明定时器配置有问题。驱动板供电是否正常。看看驱动芯片 VCC、电机母线电压、自举电容两端电压。电机三根线是否都接上了。缺相会让电机抖动但不转或者电流很小。霍尔或编码器反馈是否更新。角度如果一直是同一个值FOC 就无法持续输出力矩。5.2 现象二电机抖动或异响这种问题最折磨人因为它说明电机有电流但力矩方向不对或力矩不稳定。优先排查霍尔信号是否按正确顺序跳变电流采样方向和真实电流方向是否一致电角度补偿是否准。霍尔版本常见问题是霍尔角度表对应了错误的扇区。PWM 频率是否落在可听到的音频范围内如果太低电机会发出明显噪音5.3 现象三电流突然过大或过流保护第一件事不是把 PI 参数下调而是先断开功率电源只给控制板供电检查程序是不是在无电机状态编译运行。确认程序本身正常后再按下面排查采样电阻和运放电路是否有偏置问题。如果是单电源运放通常需要一个电压偏置让正负电流都落在 ADC 量程内。采样点和 PWM 定时是否对齐。如果在 PWM 开关瞬间采样会采到强烈的开关噪声。驱动板死区时间是否太小。太小会导致上下桥直通大电流直接炸管。5.4 留下日志和现场数据调试 FOC 时最忌讳的是“刚才还能转改了一下参数就不转了但是不知道改了什么”。我建议每次只改一个参数把参数值、电机状态、电流波形截图、串口日志一起保存启动前记录母线电压和环境温度这样做的好处是当天查不出问题还可以事后复盘。很多 FOC 问题都是间歇性出现不记录现场下次遇到还是一头雾水。6. 从学习板到工程板还要补哪些课如果你只是想把项目跑起来看完上面的内容已经够了。但如果想做成一款能长时间稳定运行的小设备比如做一个自己的风机、水泵或者电动工具控制器下面几个问题必须提前想清楚。6.1 批量任务和连续运行稳定性电机控制和学习 Demo 最大的区别不是能不能转而是能不能连续运行几十小时不失控。需要考虑温度MOS 管和主控芯片的温升过流保护不能只靠软件限幅硬件比较器或运放直接触发刹车更重要失速保护电机堵转时要能快速降功率否则会烧线包通信异常如果用串口或 CAN 控制通信中断时有安全默认值6.2 极坐标 FOC 的局限极坐标 FOC 好处是直观但做高性能控制时标准 d-q 轴 PI 控制更容易加入弱磁、MTPA、死区补偿等功能。如果你继续往前走建议学完这个项目后再回到标准 FOC对比两者的差异。特别是弱磁控制需要在 d 轴注入负电流极坐标表达不够直观参数辨识和自适应控制在 d-q 轴更成熟工业伺服项目几乎都是直接 d-q 轴控制6.3 资料和社区配合搜索这个项目相关的关键词比较集中去搜索时可以用“STM32F103C8T6 FOC”“极坐标 FOC”“PMSM FOC 开源”等组合。遇到不懂的概念优先看电机控制教材里面关于坐标变换和 SVPWM 的章节不要只看网络零散文章。如果你英文阅读没压力Texas Instruments 的 InstaSPIN 文档和 ST 官网的 MC SDK 里关于观测器和电流环的说明也很值得看。这些资料主要用来补原理和这个开源项目的代码风格未必一致。7. 开源项目的生命周期学习价值远大于成品价值最后想说一个观点。这种由个人开发者发布的“初中生手搓”项目最大的价值不在代码本身有多规范而在于它证明了“一件事可以从零开始用低成本硬件做成”。所以在看项目时建议你用“学路线”而不是“用产品”的眼光来对待看它怎么分配中断和 ADC 采样时序看它怎么处理霍尔信号看它怎么输出调试信息看它在极坐标变换里做了哪些取舍看它在失败和重启时做了什么处理这些细节比“电机是否转得完美”更能决定你能从中学到多少。踩过几次之后我发现很多问题最终不是 FOC 算法本身难而是前置环境和输入材料没有处理干净。电机相线接反、霍尔信号错乱、电流采样偏置不对、死区时间不够都会让算法看起来像是写错了。所以我的建议是先确认硬件链路再碰算法参数先把开环跑通再切闭环先把低速跑稳再拉高速。能做到这三步这个项目就算真正入门了。