矢量控制入门 如果你买了一堆学习资料,学习半年甚至更久了,还不会写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 有概念即可。

--------------------------------------------------------------------

二、总体架构

--------------------------------------------------------------------

  1. 硬件层
    TMS320F28335 + 三相逆变板(IR2136 驱动) + 相电流 Shunt 采样(双电阻) + 旋变 AD2S1210(14-bit) + RS422 上位机
  1. 软件层
    主循环(1 ms 节拍)+ 单一中断(PWM1 下溢中断,125 µs)
    中断内按“时间片”完成 电流环(125 µs) → 速度环(1 ms) → 位置环(2 ms)
    通信层 1 ms 查询方式上行下发,协议帧头 AA/BB/55
  1. 控制链
    位置 → 速度 → 电流 → 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 %(含驱动板损耗)

--------------------------------------------------------------------

十一、如何从本代码继续迭代

--------------------------------------------------------------------

  1. 弱磁控制:在 Id 环增加负向前馈,电压闭环输出 Id_ref
  2. 无感 FOC:用滑模观测器或 PLL 估算角度,替换 resolver.c
  3. 伺服脉冲/方向接口:把位置环入口改为外部脉冲计数
  4. 双电机并联:中断里再复制一套结构体,用同一颗 28335 双通道控制
  5. 功能安全:加入 CRC 校验、冗余采样、PWM 自检、STO(Safe Torque Off)

--------------------------------------------------------------------

十二、结语

--------------------------------------------------------------------

整套代码把“学术级 FOC”拆成了“工程级积木”:

ADC→Clark→Park→PI→反 Park→SVPWM→PWM,每一步都对应一个 C 函数、一个标幺单位、一个示波器测试点。

只要按本文的时序图和调试流程,逐段验证波形,就能在 1~2 天内把电机转起来,并拿到一套可量产的 PI 参数。

后续无论想增加弱磁、无感还是功能安全,都只需替换/扩展相应“积木”,无需推翻重来。祝调试顺利,转子早日“丝般顺滑”地转起来!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐