公司动态
基于DSP28335的三电平SVPWM算法实现与调试
简介本资源是面向电机控制工程师与电力电子方向嵌入式开发者的三电平空间矢量脉宽调制SVPWM算法工程实现专为TI TMS320F28335 DSP平台设计解决三相三电平逆变器在高效率、低谐波、强实时性场景下的PWM波形生成与硬件协同控制问题。压缩包共183个文件971KB涵盖核心算法源码26个.c文件含vsvpwm.c等关键模块、底层驱动与启动代码35个.h头文件、30个.obj目标文件、6个.asm汇编文件、工程构建配置16个.mk、4个.cmd链接命令、1个.project及ccsproject等IDE工程文件以及调试支持文件xml、map、out、ccxml等结构完整可直接在CCS6及以上版本中导入编译运行。已有140人学习下载提供从理论到落地的全链路参考包含DSP28335特有的EPWM模块配置、ADC采样同步、中断服务调度、SVPWM扇区判断与矢量作用时间计算等关键实现细节助力开发者快速掌握三电平SVPWM在高性能电机驱动中的工程化部署方法。 做三电平逆变器这件事说难不难说简单也真不简单。我前前后后做了两版样机第一版用STM32调了两个月波形总是差口气第二版换到DSP28335把三电平SVPWM算法完整跑通才算把线电压五电平、相电压三电平的波形稳稳调出来。今天就把这套基于DSP28335的三电平SVPWM算法实现全过程写出来从原理到代码、从仿真到上板调试能帮一个算一个。这篇文章适合正在做三电平逆变器、PWM整流器、或者大功率电机驱动的朋友尤其是手里有T型三电平主电路、准备用C2000系列DSP承载SVPWM算法的人。文章不会只堆公式更多是讲清楚算法怎么落到DSP里以及我在实际调试中踩过的坑和排查思路。1. 三电平SVPWM的底层逻辑从两电平到三电平为什么值得做1.1 两电平SVPWM复习本质是伏秒平衡要讲清楚三电平SVPWM得先花两分钟把两电平SVPWM的原理解透因为三电平的扇区判断、矢量作用时间计算本质上都是两电平思路的扩展。两电平三相桥每个桥臂输出两种电平三相一共8种开关状态对应8个空间电压矢量其中6个有效矢量、2个零矢量。SVPWM的核心思想很简单在一个开关周期内用相邻的两个有效矢量和零矢量去合成你想要的参考电压矢量三个矢量各自作用一段时间时间的分配满足伏秒平衡。用大白话说就是你在矢量图里画一个目标矢量它落在哪两个大矢量夹的区域里就用这两个大矢量各扛一部分时间剩下时间用零矢量填满。作用时间算完之后再映射成三相PWM的占空比这就是整个SVPWM的全部秘密。两电平SVPWM做三电平的基础在于它验证了一件事用有限的开关状态组合可以在一个周期内近似出任意方向、任意大小的电压矢量只要调制比在线性区内。三电平只是把这个矢量空间从正方形中心的一个六边形扩展成更大、更细的六边形可用矢量更多选择更灵活波形自然也更好。1.2 三电平带来的变化T型拓扑、27个矢量、三个电平三电平逆变器每相能输出正母线、中点、负母线三种电平对应到开关状态就是P、O、N。我用的主电路是T型三电平拓扑每相四个IGBT其中S1和S3构成一个桥臂输出P和NS2和S4背靠背接到直流母线中点负责输出O电平。这里有个关键点三相三电平一共有3的3次方等于27种开关状态但映射到空间矢量后去重之后大概只有19个独立矢量。这些矢量按长度分四类零矢量、小矢量、中矢量、大矢量。空间矢量长度这个事我一开始也经常搞混后来自己推导了一遍才彻底清楚。以直流母线电压Vdc的一半作为基值做归一化三相合成矢量按照 ( V \frac{2}{3}(V_a V_b e^{j120^\circ} V_c e^{j240^\circ}) ) 计算结果是这样的零矢量OOO、PPP、NNN长度0小矢量如POO、ONN长度2/3中矢量如PON长度2/√3大矢量如PNN、PPN长度4/3三电平SVPWM比两电平复杂的地方不只是电平数变多更重要的是有了冗余的小矢量。每个小矢量都有P型和N型两种状态比如POO和ONN它们对应的输出电压矢量相同但对直流母线中点电流的影响正好相反。这个特性是中点电位平衡控制的抓手后面会详细讲。1.3 为什么选择DSP28335而不是STM32或FPGA选DSP28335做三电平SVPWM不是因为它最新而是因为它最合适。第一28335是浮点DSP主频150MHz做SVPWM这种带三角函数、带坐标变换、带伏秒平衡运算的算法写代码不用像2812那样整天想着定点标幺直接float算开发效率高很多。实测下来10kHz的中断里跑完电流环加SVPWM全部浮点运算也就十几微秒对150MHz主频来说余量很足。第二28335的ePWM模块是真的为电机控制和电源控制设计的。6个ePWM模块、12路PWM输出刚好够三电平三相用每个模块内部自带死区产生、相位同步、故障保护TZ不需要外挂CPLD去做逻辑和死区硬件设计省了一大块。第三ADC和PWM的联动方式很成熟。ePWM模块的事件触发器可以直接触发ADC采样ADC转换完成又可以触发PWM中断采样点和PWM载波峰谷对齐这个事儿在硬件层面就解决了不需要软件去卡定时器。用FPGA做当然也行但FPGA强项在并行PWM生成和硬件保护控制算法用Verilog写实在太痛苦而且改动参数要重新综合。用STM32做也不是不行但STM32的高级定时器在死区互补、故障保护、PWM触发ADC这些细节上跟C2000比还是要绕一些。所以如果项目以控制算法为主、不需要超高开关频率DSP28335是目前很稳妥的选择。2. 控制算法拆解扇区判断、矢量作用时间与中点平衡2.1 扇区与小三角形区域划分三电平SVPWM的第一个难点就是扇区判断。参考电压矢量在αβ平面转一圈是360度按60度一个扇区分成6个大扇区这个和两电平一样。区别在于每个大扇区内部不再是简单的一个三角形区域而是被小矢量、中矢量、大矢量切割成4个小三角形区域。以第一扇区0到60度为例四个小三角形的顶点分别是小三角形顶点矢量区域①零矢量OOO、小矢量V1POO/ONN、小矢量V2PPO/OON区域②小矢量V1、V2、中矢量V3PON区域③小矢量V2、中矢量V3、大矢量V4PPN区域④小矢量V1、中矢量V3、大矢量V5PNN判断落在哪个小三角形我用的方法是先把参考电压矢量归一化即 ( V_a V_\alpha / (V_{dc}/2) )( V_b V_\beta / (V_{dc}/2) )然后根据第一扇区内的几何位置来判断。这里有一个很实用的判断逻辑在0到60度第一扇区内如果 ( V_a V_b / \sqrt{3} \leq 2/3 )矢量落在中心小三角区域①如果投影值大于2/3再看它在30度中矢量射线的哪一侧结合小矢量到中矢量的连线位置就能区分区域②、区域③、区域④。这一段是算法里最绕的部分也是网上讨论最多的地方。实际工程里大部分代码会先把参考矢量通过坐标旋转统一映射到第一扇区再套用固定公式这样就本文还有配套的精品资源点击获取