数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 5078|回复: 58

[综合] 从零开始,一文教你快速实现数字化SPWM纯正弦波逆变器/变频电源 基于stm32

    [复制链接]
发表于 2020-3-19 18:46:06 | 显示全部楼层 |阅读模式

马上注册,认识更多玩家好友,查阅更多资源,享有更多功能

您需要 登录 才可以下载或查看,没有帐号?立即注册 微信登录

x
前言:本文约两千字,需要读者具备基础的高数、模电、单片机知识,不会的话可以网课学习,希望就本文为有志于逆变技术的入门者提供一点微小的帮助。

一、理论基础

所谓SPWM,就是通过只有开关两个状态(离散,数字的)的PWM序列产生正弦波(连续,模拟的)的方法。其理论基础一句话就能说明白:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。用人话类比就是五张一块和一张五块一样有价值。
1.png

从调制的角度可以理解为低频的50hz正弦信号作为调制波,高频的方波作为载波,调制方法是占空比调制,在经过全桥放大信号之后,通过低通滤波器就能还原出大功率的50hz正弦信号。


二、调制方法

常见的调制方法包括单极性PWM、双极性PWM、单极性倍频PWM。单双极性是以半个开关周期内负载上电压变化情况来分的。
单极性PWM调制在上半个正弦周期内一桥臂A两只功率管以较高的开关频率互补开关,另一桥臂B只开下管,这时负载上的电压在正电源电压和0V之间切换;在下半个周期则A桥臂只开下管,B桥臂高频互补开关,这时负载上的电压在负电源电压和0V之间切换,就产生了两个方向上的电压。半个周期内只有一侧桥臂受控。优点是开关损耗小,缺点是生成的正弦波在过零点会产生失真、控制复杂、而且MOS发热不均匀。

其负载上的波形图如下。
2.jpg

而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。半个周期内两侧桥臂都受控。优点是控制简单、波形失真度小,缺点是管子开关损耗大,发热比较高。

其负载上的波形图如下:
3.png

倍频调制则是上两种控制方法的结合,半个周期内两侧桥臂都受控,但负载在半个周期内只在一种电压与0V之间切换,要么正要么负。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。缺点就是控制麻烦。

4.png


三、占空比序列生成

这一部分的作用是控制管子什么时候开,什么时候关。控制的方法有两大流派:模拟和数字。模拟的方法很简单,生成正弦波和三角波,直接输入比较器,产生高低电平控制管子开关。这个没啥好说的,搭电路的事。数字则也分两大流派,模拟模拟方法(两个模拟不同意思)的有自然采样法、规则采样法、不对称规则采样法。自然采样法是通过计算高频三角载波与正弦调制波的交点来确定开关切换点,以求出相应的脉冲宽度,而生成 SPWM波形的。本质上还是模拟那一套,不过由于脉宽计算公式是一个超越方程,采样点不能预先确定,只能通过数值迭代求解,所以用的很少。规则采样法是对其的简化,只在三角波的顶点或底点位置对正弦波采样而形成阶梯波,计算简单,但是波形没那么像正弦波(谐波含量高)。

5.png

不对称规则采样法是规则采样法的优化,在每个载波周期采样两次, 即在三角波的顶点位置采样, 又在三角波的底点位置采样, 这样形成的阶梯波与正弦波的逼近程度会大大提高(谐波含量低了一点),但是计算量是规则采样法两倍。

6.png

数字实现的另一种流派则是等面积法,这是纯数学的,和模拟已经没关系了,还记得冲量相等而形状不同的窄脉冲吗?冲量在电路中就是伏秒积,在图中表现为面积,这个方法将正弦波等分,用等面积的PWM波代替,可以计算出来占空比。这种方法生成的正弦波精度是最高的。
图为我写的PY程序,计算得到的结果,调制深度为1,半个周期分16段。PWM幅度等于正弦波最大值,图中灰色部分是高电平时间。积分求面积,PWM波和正弦波的面积是相等的。
7.png


四、代码

最简单实现的SPWM我觉得是双极性调制。全程只需要控制一个PWM的占空比。代码包括两部分,生成SPWM占空比序列的py程序和基于hal库和STM32cubeMX的单片机程序。因为我用的是F030F4,这玩意两块多一片,只有16kRAM和4k运存,所以实时计算是没戏了,只能预先计算好占空比序列,用查表法实现。生成SPWM占空比序列的py程序有两个,分别是单极性和双极性。先从单极性开始吧。
8.png

核心思想是分段,求正弦波的积分,除PWM周期长度,结果就是PWM占空比。结果是对称的,负半周就换个桥臂。很简单的数学,不详细分析了。
双极性也差不多,不过需要做出更改。正弦波的积分除2倍的PWM周期长度,结果再加50%才是PWM占空比。占空比50%时等效0v输出,100%时等效+vcc,0%等效-vcc。

9.png

调制深度大致等于直流母线电压利用率,受到mos自举驱动器和mos的限制,高侧mos不可能持续导通,也就是说占空比不可能高到100%,90%算保守值,因此调制深度最好不大于90%。最后输出的正弦波的有效值=直流母线电压*调制深度/根号2,输入24vDC,调制深度0.90时可以输出有效值15.28vAC。改变调制深度就能改变正弦波电压。点一下运行,py会以双精度计算占空比,对于单片机11位的定时器精度绝对是大大超过了。

至于STM32,使用两个定时器,TIM1使用CH3互补输出48K的PWM,作为载波,TIM17作为中断时基,中断频率12.8khz(基波50Hz X 调制比256)。
10.png

生成好长度为256的占空比序列,存成数组。

11.png
12.png

重写TIM17中断回调函数,每次中断更新TIM1->CCR3的值,PWM占空比就会以12.8khz的刷新率改变。

13.png

到此为止SPWM逆变器的软件就完成了。只要正确连接硬件就能输出SPWM波。只要改变TIM17ARR值就能改变占空比刷新频率,实现变频。


五、硬件设计

硬件上需要一个全桥,全桥PCBlayout和选型看我之前的帖子:
https://www.mydigit.cn/forum.php?mod=viewthread&tid=75138
懒得搞的话,我也有一个现成的全桥模块我发布在立创的开源平台上了,已经打样验证过实物。
https://oshwhub.com/hbozyq/Full_Bridge_Module_v1
记得点赞收藏评论三连哦(笑)
这还懒得搞的话请拿钱砸我。

硬件上短接L1和H2,短接L2和H1,任意连接单片机的pwm和互补pwm到两个输入端,小心不要接错。在全桥输出端接上LC滤波器,上电开机就能看到正弦波了。
将这个正弦波接到变比合适的工频变压器上就可以升压到220v。我手头上没有合适的变压器就不测了。不过比较常规的方案是先升压到400v直流在输入高压全桥逆变成交流电,这样体积可以做的比较小两路相差180度正弦波能驱动步进电机,三路依次相差120度的正弦波就是三相逆变器

上两张测试图吧
900153758.jpg
DSView-200318-175410.png

next

打赏

参与人数 22M币 +403 收起 理由
naisongshuai + 20 技术贴必顶
qianjiakun + 10 膜拜大神。
869294732 + 12 原創內容
wcg720405 + 20 謝謝分享
heiketiguo + 21 優秀文章
腾龙科技 + 20 厉害,这种纯技术性的文章太棒了,感谢分享.
雨纷飞 + 20 優秀文章
wq1310699368 + 20 技术贴顶一下
liyuqing0318 + 20 很多年以前也碰到个计算正弦波与占空比的数.
MO_OM + 5

查看全部打赏

 楼主| 发表于 2020-3-19 18:46:48 | 显示全部楼层
本帖最后由 hbozyq 于 2020-3-19 19:04 编辑

资料下载: 代码和工程.7z (5.12 MB, 下载次数: 30)
回复 支持 2 反对 0

使用道具 举报

发表于 2020-3-19 19:49:56 | 显示全部楼层
纯理论纯支持了
回复 支持 反对

使用道具 举报

发表于 2020-3-19 22:20:04 来自手机浏览器 | 显示全部楼层
不错的帖子,慢慢嚼
回复 支持 反对

使用道具 举报

发表于 2020-3-20 09:02:14 | 显示全部楼层
谢谢分享。。。。。又对脑子充了下电。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2020-3-20 09:04:26 | 显示全部楼层
打赏、评论、收藏、点赞,已经超3连指标了。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2020-3-20 10:14:39 | 显示全部楼层
我做的220V输入的变频逆变电源,使用双极性调制,3相半桥驱动,调制时混入15%的三次谐波,载波频率15kHz,死区时间2us,空载时输出电压可以达到AC220V,带载的时候(5A电流),直流母线电压从DC325V降到DC295V(整流管压降,其余可能是由于直流母线电压脉动造成的),输出电压也比理论值偏低十几V,不知道是为什么????
死区时间会影响一部分电压利用率,输入滤波电容将近2000uF,一直找不到原因。
回复 支持 反对

使用道具 举报

发表于 2020-3-20 10:25:11 | 显示全部楼层
谢谢楼主,学习了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 12:35:27 | 显示全部楼层
chengyabcd 发表于 2020-3-20 10:14
我做的220V输入的变频逆变电源,使用双极性调制,3相半桥驱动,调制时混入15%的三次谐波,载波频率15kHz, ...

交流直接整流滤波出来的直流母线空载电压是虚的 空载电压等于交流电峰值大概311v 带载肯定会跌落
此外现实中的元器件都不是理想元器件,MOS通态电阻、电感内阻都会吃掉一部分电压
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-21 22:01:43 | 显示全部楼层
没人顶一下技术贴吗
回复 支持 反对

使用道具 举报

发表于 2020-3-22 06:44:23 | 显示全部楼层
求教C语言编程
回复 支持 反对

使用道具 举报

发表于 2020-3-22 17:26:53 | 显示全部楼层
chengyabcd 发表于 2020-3-20 10:14
我做的220V输入的变频逆变电源,使用双极性调制,3相半桥驱动,调制时混入15%的三次谐波,载波频率15kHz, ...

调制时为什么要加15%的三次谐波?难道是为了模仿SVPWM的波形吗?

SVPWM算法生成的开关时序,其功率管输出电压波形是马鞍形.这种调制方式,直流母线利用率高,调制度可以超过1.

如果是SPWM算法,叠加上一部分三次谐波,功率管输出波形也像马鞍形,但调制比还是低于1.这只是模仿了SVPWM的波形外观,并不具备SVPWM的直流总线高利用率,降低功率管开关次数的特性.
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-22 19:55:33 | 显示全部楼层
顶技术贴.有技术理论基础且能成型样品的人,不多,能成型出样机的人,更少.

这个逆变器,我有几个自己观点,与楼主探讨.
1.PWM Reload,一定是逐波更改脉冲宽度.程序中TIM17我觉得是多余的.如果PWM输出2个相同脉宽,才按SPWM等面积算法表更改一次,输出的就不再是正弦波.
2.调制度的更改,应该是在逐波更改脉宽的进程中实时做乘法运算,否则无法控制输出电压.
3.载波频率,不应该是固定的.比如功率输出部分,从45.0Hz-55.0Hz以0.1HZ步进时,应该保持载波比恒定.载波比不是整数的时候,功率输出部分会相当麻烦.
回复 支持 0 反对 1

使用道具 举报

发表于 2020-3-23 00:04:14 | 显示全部楼层
17年国赛就是一个逆变,比赛前用单片机实现了单相逆变,哪知道比赛要求三相,只能用淘宝的成品板子了,记得好像是eg8010
回复 支持 反对

使用道具 举报

发表于 2020-3-23 01:06:09 | 显示全部楼层
楼主不是说半桥驱动每臂的占空比不能大于50%吗?一般45%左右
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-23 10:43:12 | 显示全部楼层
简燕 发表于 2020-3-22 19:55
顶技术贴.有技术理论基础且能成型样品的人,不多,能成型出样机的人,更少.

这个逆变器,我有几个自己观点,与 ...

1:其实这是一个缩放的问题,只要SPWM占空比表中的每个数据对应相同数量的实际PWM周期,就还能输出正弦波
2:这个确实 这个帖子里的示例是开环的,没有实现交流稳压。要稳压的话加采样反馈,把“小数表示的占空比xARR寄存器值x调制深度=CCR寄存器值”这个过程放到循环中处理就能实现稳压
3:你说的那种控制策略叫同步调制,还有种方法叫做异步调制,也就是我的方法。在载波比较高的时候问题都不大
回复 支持 反对

使用道具 举报

发表于 2020-3-23 19:07:37 | 显示全部楼层
顶一下技术贴。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

Archiver|手机版|小黑屋|关于我们|联系我们|网站条款|数码之家 ( 闽ICP备05031405号 )

GMT+8, 2020-5-28 09:32 , Processed in 0.156000 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表