矢量控制入门 PMSM的3闭环FOC程序,位置传感器采用多对极旋变,基于F28335,采用串口...
矢量控制入门 如果你买了一堆学习资料,学习半年甚至更久了,还不会写FOC,那不妨看看这里。 首先声明,非开发版赠送的那类代码。 程序全自主编写,结构清晰严谨,代码工整清爽,无任何穴余代码,无封包库,无TI宏模块,不使用IQmath库,注释率高,学会后,移植方便。 另外,代码在产品上验证过,质量可靠 foc看着简单,但理论和实践的差距还是很大的,对于新手来说,系统的、手把手的指导非常重要,所以本人花了很多精力,从新手角度,编写了非常详细程序说明、foc调参步骤、调参过程中问题定位分析、每个模块理论分析到实验时的验证情况等资料,还设计了配套的上位机,可实现在线调整pid参数,在线查看电机各种波形的功能,非常有助于开发者直观了解参数对电机性能的影响。 侧重于程序架构与算法在实现时的原理及注意事项,讲解针对工业实现,而非通电看电机转一转的,目的是让大家通过这个程序的学习,基本可以亲自编写矢量控制程序,独立完成每个模块的实验验证,独立调整电流环、速度环、位置环参数,最终实现自己电机的最优运行。 介绍下程序:PMSM的3闭环FOC程序,位置传感器采用多对极旋变,基于F28335,采用串口和can通信,运行于ccs5及以上平台。 提供程序配套的驱动板和控制板原理图(AD格式),要PCB文件的价格另议(均为4层板,量产方案)。 总结下清单: 1、程序源码一套; 2、上位机; 3、MATLAB仿真; 4、硬件原理图(AD格式); 5、程序设计文档, 6、通信协议解读文档, 7、上位机操作指导文档, 8、FOC及SVPWM原理文档, 9、FOC调试步骤及实验指导文档, (赠送svpwm详细资料) 声明:程序中有CAN通信代码,新手可以不用理会,独立模块,只使用串口即可; 建议按以下流程进行学习,会的跳过即可。 学习流程: 1、先看《01手把手教你学FOC与SVPWM技术》,对FOC整个框架有一定了解,能看懂PMSM调速系统框图; 2、再看程序,参考《02代码流程解读》文档中的流程图,把代码中每个功能模块和PMSM调速系统的框架去对应, 切不可纠结个别寄存器怎么配置的,个别函数怎么实现的,只需要理解其作用和在调速系统中的地位即可; 3、代码框架熟悉后,着手针对每个模块,结合《02代码流程解读》,进行深入研究。 比如:PWM频率、互补波形、死区、中断机制、采样机制、速度解算、位置反馈解算、指令规划…… 同时理解,反馈回路的数据整个生命周期经过哪些环节了,指令数据经过哪些环节了…… 慢慢将程序的各个模块,串联起来理解。 4、接下来,就可以在原代码框架的基础上,根据自己的硬件,改代码了。 甚至于替换一些功能模块,实现别的控制方式,比如更换编码器类型,无位置控制等等。 5、代码部分完成后,根据《03矢量控制调试流程》,调试程序,先完成各模块配置验证、标校, 再逐步调节电流环、速度环、位置环的参数,完成实验,加深对FOC的理解。 调试过程中,参考《04上位机操作说明》使用上位机,将过程数据保存,然后用Matlab画图,通过分析数据, 比如超调量、上升时间等指标来评判系统。 串口发送数据有限,需要发别的数据的,可以参考《05串口通信协议解读》,简单改下即可。
永磁同步电机(PMSM)FOC 矢量控制软件
代码功能说明书(V1.0)
——基于 TMS320F28335 的“三闭环”全链路实现
--------------------------------------------------------------------
一、文档定位
--------------------------------------------------------------------
本文面向“要在真实硬件上跑通 FOC”的开发者,提供一份“从复位到转子转起来”的完整地图。
既讲清“每一行 C 代码到底在算什么”,也给出了“先调哪个模块、后调哪个模块、波形长什么样算过关”的实验级指引。
阅读前,请先行浏览《01 手把手教你学 FOC 与 SVPWM 技术》原理文档,对 Clark/Park/SVPWM 有概念即可。

--------------------------------------------------------------------
二、总体架构
--------------------------------------------------------------------
- 硬件层
TMS320F28335 + 三相逆变板(IR2136 驱动) + 相电流 Shunt 采样(双电阻) + 旋变 AD2S1210(14-bit) + RS422 上位机
- 软件层
主循环(1 ms 节拍)+ 单一中断(PWM1 下溢中断,125 µs)
中断内按“时间片”完成 电流环(125 µs) → 速度环(1 ms) → 位置环(2 ms)
通信层 1 ms 查询方式上行下发,协议帧头 AA/BB/55
- 控制链
位置 → 速度 → 电流 → SVPWM → 三相逆变 → 电机
电流环最内环,带宽 800 Hz;速度环 100 Hz;位置环 50 Hz
--------------------------------------------------------------------
三、源码目录树(关键文件)
--------------------------------------------------------------------
FOC_PMSM/
├─ main.c // 主循环、状态机、上位机命令解析
├─ isr.c // EPWM1 中断服务函数,三闭环入口
├─ foc.c // Clark/Park/反 Park/SVPWM 核心算法
├─ pi.c // 通用 PI 控制器(带抗积分饱和)

├─ adc.c // 双通道电流 + 母线电压采样,偏置自校准
├─ resolver.c // AD2S1210 角度解算、电角度换算、零位补偿
├─ speed.c // 角度差分→转速 + 一阶低通滤波
├─ sci.c // 460 800 bps 全双工协议打包/解包
├─ pwm.c // 6 路 PWM 配置,死区 2 µs,AHC/ALC 模式
└─ parameter.h // 所有 PI 限幅、标幺基值、时间片宏
--------------------------------------------------------------------
四、标幺与单位系统
--------------------------------------------------------------------
| 物理量 | 基值选取 | 标幺值范围 |
|---|---|---|
| 电流 | I_base = 25 A(电机峰值) | ±1.0 |
| 电压 | U_base = 28 V(母线) | 0~1.0 |
| 速度 | N_base = 3 000 rpm | ±1.0 |
| 角度 | 2π rad | 0~2π |
| PWM 占空比 | 周期寄存器 TBPRD = 9 375 | 0~9 375 |
所有 PI 运算在标幺域完成,输出再折算到寄存器值。
--------------------------------------------------------------------

五、中断时序图(125 µs 时间片)
--------------------------------------------------------------------
PWM1 下溢 →
① 采样 ADC(Iu, Iv, Udc) →
② 角度获取(resolver_getAngle) →
③ 电流标幺、Clark → Park →
④ 电流 PI(Id,Iq) → 反 Park → SVPWM →
⑤ 更新 CMPA/CMPB 寄存器 →
⑥ 速度/位置环计数器累加 →
⑦ 1 ms/2 ms 标志位置位 → 退出中断

worst-case 实测 92 µs(CPU 73 % 负载)
--------------------------------------------------------------------
六、关键模块分述
--------------------------------------------------------------------
6.1 相电流采样
- 双 Shunt 电阻 10 mΩ,放大 20 倍,ADC 12-bit,零偏 2048 LSB
- 上电自动校准:200 次平均→保存 Iuoffset、Ivoffset
- 第三相 Iw = –(Iu+Iv) 软件重构,节省一路 ADC
- 一阶 IIR 滤波 fc = 2 kHz,消除 MOS 开关毛刺
6.2 角度与转速
- 旋变 12 位无符号 → 机械角 0~2π
- 电机极对数 5,旋变极对数 1 → 电角度 = 5 × 机械角 + zeroOffset
- zeroOffset 校准办法:开环给定 Vd = 0.1 pu,Vq = 0,角度自增,待转子锁轴后读取电角度,取反即为补偿值
- 转速计算:Δθ/Δt,每 1 ms 计算一次,32768 边界跳变自动处理
6.3 电流环 PI
- 离散型:u[k] = u[k-1] + Kp·(e[k]-e[k-1]) + Ki·e[k]
- 积分分离:|e| > 0.2 pu 时 Ki = 0,抑制大阶跃超调
- 输出限幅 ±0.95 pu,防止过调制
- 带宽整定:Kp = Ls·ωc / Ubase,Ki = Rs·ωc / Ubase
实验结果:Kp = 15,Ki = 0.4,阶跃 2.5 A 上升时间 5 ms,超调 < 5 %
6.4 速度环 PI
- 带宽 1/10 电流环,Kp = 0.23,Ki = 0.001
- 加速度前馈 Acc = 0.03 pu,减小启动滞后
- 输出限幅 0.22 pu(≈ 5.5 A),保护电机与驱动
6.5 SVPWM 实现
- 输入:Uα、Uβ(已标幺)
- 扇区判断→作用时间 T1/T2→七段式对称调制→CMP 值直接写入
- 自动插入零矢量 000/111,降低开关损耗
- 寄存器级联:ePWM1 主时基,ePWM2/3 同步,保证三相同一时刻更新
6.6 故障保护(在中断内 5 µs 内完成)
- 硬件过流:CBC(Cycle-by-Cycle)限流,TZ1/TZ2 触发,PWM 立即高阻
- 软件过流:I_inst > 1.2 pu,连续 3 次才关管,防止误触发
- 母线过压/欠压:Udc > 30 V 或 < 20 V,停机并上报 0x02/0x03 故障码
- 通信失联:500 ms 未收到正确帧,自动停机
--------------------------------------------------------------------
七、状态机与上位机命令
--------------------------------------------------------------------
主循环状态机:
IDLE → ENABLE → RUN → FAULT → IDLE
仅 RUN 态中断才使能 PWM;任何故障立即进入 FAULT,PWM 高阻。

上位机帧格式(14 B,1 ms 周期)
矢量控制入门 如果你买了一堆学习资料,学习半年甚至更久了,还不会写FOC,那不妨看看这里。 首先声明,非开发版赠送的那类代码。 程序全自主编写,结构清晰严谨,代码工整清爽,无任何穴余代码,无封包库,无TI宏模块,不使用IQmath库,注释率高,学会后,移植方便。 另外,代码在产品上验证过,质量可靠 foc看着简单,但理论和实践的差距还是很大的,对于新手来说,系统的、手把手的指导非常重要,所以本人花了很多精力,从新手角度,编写了非常详细程序说明、foc调参步骤、调参过程中问题定位分析、每个模块理论分析到实验时的验证情况等资料,还设计了配套的上位机,可实现在线调整pid参数,在线查看电机各种波形的功能,非常有助于开发者直观了解参数对电机性能的影响。 侧重于程序架构与算法在实现时的原理及注意事项,讲解针对工业实现,而非通电看电机转一转的,目的是让大家通过这个程序的学习,基本可以亲自编写矢量控制程序,独立完成每个模块的实验验证,独立调整电流环、速度环、位置环参数,最终实现自己电机的最优运行。 介绍下程序:PMSM的3闭环FOC程序,位置传感器采用多对极旋变,基于F28335,采用串口和can通信,运行于ccs5及以上平台。 提供程序配套的驱动板和控制板原理图(AD格式),要PCB文件的价格另议(均为4层板,量产方案)。 总结下清单: 1、程序源码一套; 2、上位机; 3、MATLAB仿真; 4、硬件原理图(AD格式); 5、程序设计文档, 6、通信协议解读文档, 7、上位机操作指导文档, 8、FOC及SVPWM原理文档, 9、FOC调试步骤及实验指导文档, (赠送svpwm详细资料) 声明:程序中有CAN通信代码,新手可以不用理会,独立模块,只使用串口即可; 建议按以下流程进行学习,会的跳过即可。 学习流程: 1、先看《01手把手教你学FOC与SVPWM技术》,对FOC整个框架有一定了解,能看懂PMSM调速系统框图; 2、再看程序,参考《02代码流程解读》文档中的流程图,把代码中每个功能模块和PMSM调速系统的框架去对应, 切不可纠结个别寄存器怎么配置的,个别函数怎么实现的,只需要理解其作用和在调速系统中的地位即可; 3、代码框架熟悉后,着手针对每个模块,结合《02代码流程解读》,进行深入研究。 比如:PWM频率、互补波形、死区、中断机制、采样机制、速度解算、位置反馈解算、指令规划…… 同时理解,反馈回路的数据整个生命周期经过哪些环节了,指令数据经过哪些环节了…… 慢慢将程序的各个模块,串联起来理解。 4、接下来,就可以在原代码框架的基础上,根据自己的硬件,改代码了。 甚至于替换一些功能模块,实现别的控制方式,比如更换编码器类型,无位置控制等等。 5、代码部分完成后,根据《03矢量控制调试流程》,调试程序,先完成各模块配置验证、标校, 再逐步调节电流环、速度环、位置环的参数,完成实验,加深对FOC的理解。 调试过程中,参考《04上位机操作说明》使用上位机,将过程数据保存,然后用Matlab画图,通过分析数据, 比如超调量、上升时间等指标来评判系统。 串口发送数据有限,需要发别的数据的,可以参考《05串口通信协议解读》,简单改下即可。
[Head|Cmd|Data0 3B|Data1 3B|Data2 3B|Chk]
Head = 0xAA/0x55/0xBB
Cmd:0 电流环,1 速度环,2 位置环,3 停机,4 调参
Data1 为标幺指令,Data0/2/3 任意观测点(角度、转速、Iq、占空比等)
--------------------------------------------------------------------
八、初次上电调试流程(Step-by-Step)
--------------------------------------------------------------------
Step 0 接线检查

母线 28 V,相线、旋变、串口线正确;示波器探头差分测量 U、V、W
Step 1 裸 PWM 验证
断开电机,占空比 0 %/50 %/97 %,万用表量输出 ≈ 0/14/27 V
示波器看互补波形,死区 2 µs,无直通
Step 2 电流零点校准
电机不转,连续采样 1 s,Iu/Iv 波动 < ±3 LSB(≈ 0.01 pu)
Step 3 角度验证
手转转子,上位机“角度”条 0~6.28 连续,无 2π 跳变;zeroOffset 记录
Step 4 开环强拖
Vd = 0,Vq = 0.1 pu,角度自增 0.5 Hz,电机应缓慢正转;反转同理

母线电流 < 0.3 A,无剧烈抖动→证明硬件、角度、相序正确
Step 5 电流环闭环
给定 Iqref = 0.1 pu(2.5 A),Idref = 0
示波器看相电流正弦,THD < 5 %;阶跃响应 5 ms 内进入 ±5 % 误差带
记录 PI 参数(Kp=15, Ki=0.4)
Step 6 速度环闭环
速度指令 60 rpm → 实际 60 ±2 rpm,上升时间 < 100 ms
正反转对称,母线电流差 < 5 %
Step 7 位置环(可选)
给定 1 圈,定位误差 < 0.05 rad(≈ 3°),无抖动

--------------------------------------------------------------------
九、常见异常与排查
--------------------------------------------------------------------
现象 1:电机高频啸叫
→ 电流采样毛刺大,检查 Shunt 走线 Kelvin 接法;提高 ADC 采样点与 PWM 中心对齐
现象 2:零速抖动
→ 速度滤波截止频率太低,或电流环 Ki 过大;先降 Ki,再适当加 1~2 ms 速度平滑
现象 3:正反转电流不对称
→ 检查 zeroOffset 补偿方向;确认旋变励磁/反馈线序;查看 SVPWM 扇区时间是否饱和
现象 4:上位机无数据

→ 串口共地;确认 DSP 端 SCI FIFO 深度=1;帧头用 0x55 测试最简单
--------------------------------------------------------------------
十、性能基准(实测)
--------------------------------------------------------------------
- 空载 0→3 000 rpm 加速时间 180 ms,电流峰值 8 A
- 额定负载 1 Nm,稳速误差 < ±2 rpm
- 电流环带宽 800 Hz,相位裕度 55°
- 母线电压 28 V 时,系统效率 88 %(含驱动板损耗)
--------------------------------------------------------------------
十一、如何从本代码继续迭代
--------------------------------------------------------------------
- 弱磁控制:在 Id 环增加负向前馈,电压闭环输出 Id_ref
- 无感 FOC:用滑模观测器或 PLL 估算角度,替换 resolver.c
- 伺服脉冲/方向接口:把位置环入口改为外部脉冲计数
- 双电机并联:中断里再复制一套结构体,用同一颗 28335 双通道控制
- 功能安全:加入 CRC 校验、冗余采样、PWM 自检、STO(Safe Torque Off)
--------------------------------------------------------------------
十二、结语
--------------------------------------------------------------------
整套代码把“学术级 FOC”拆成了“工程级积木”:
ADC→Clark→Park→PI→反 Park→SVPWM→PWM,每一步都对应一个 C 函数、一个标幺单位、一个示波器测试点。

只要按本文的时序图和调试流程,逐段验证波形,就能在 1~2 天内把电机转起来,并拿到一套可量产的 PI 参数。
后续无论想增加弱磁、无感还是功能安全,都只需替换/扩展相应“积木”,无需推翻重来。祝调试顺利,转子早日“丝般顺滑”地转起来!
更多推荐
所有评论(0)