社区导航

 

搜索
楼主: 瓜弟
打印 上一主题 下一主题

[原创] SVPWM原理、实现、仿真分析

[复制链接]

24

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

跳转到指定楼层
楼主
发表于 2019-12-26 12:02 | 只看该作者 |倒序浏览 |阅读模式
本帖最后由 瓜弟 于 2019-12-27 19:18 编辑

    本贴主要介绍SVPWM的实现与仿真分析。

    在电机控制中,我们希望使用一个特定的空间磁场向量,来“拉”动转子,SVPWM技术使我们可以得到一个相对圆滑的旋转磁场向量。

    在I区,由基本向量合成目标向量如下图所示:

T_{S}为PWM的周期,T_{4}T_{6}分别为两个基础向量的作用时间,根据正弦定理可得:

\frac{U_{OUT}\ast T_{s}}{sin\left ( 2\pi /3 \right )}= \frac{U_{4}\ast T_{4}}{\sin \left ( \pi /3-\theta \right )}= \frac{U_{6}\ast T_{6}}{\sin \theta }

 

其中,U_{4}= U_{6}=\frac{2}{3}U_{DC} , U_{OUT}为目标向量的幅值,\theta为目标向量与基础向量的夹角,将上式化简后,得到:

\frac{T_{4}}{T_{s}}= \sqrt{3}\frac{U_{OUT}}{U_{DC}}\sin \left ( \pi /3-\theta \right )

 

\frac{T_{6}}{T_{s}}= \sqrt{3}\frac{U_{OUT}}{U_{DC}}\sin \left (\theta \right )

 

在八个基础向量中,还有两个零向量,合理分配两个零向量,使MOS桥上下桥臂负载均衡:

\frac{T_{0}}{T_{s}}=\frac{T_{7}}{T_{s}}=\left ( 1-\frac{T_{4}}{T_{s}}-\frac{T_{6}}{T_{s}} \right )/2

   

    通过以上推导,我们得到基本的占空比信号,但这并不能直接用于PWM信号生成,如下图所示,

在我们得到各个占空比后,在生成PWM时,我们需要关注这四个占空比信号与逆变桥的的PWM信号之间的关系,则:

逆变桥A相上半桥的占空比信号为t_{1}=\frac{T_{7}+T_{6}+T_{4}}{T_{s}}

逆变桥B相上半桥的占空比信号为t_{2}=\frac{T_{7}+T_{6}}{T_{s}}

逆变桥C相上半桥的占空比信号为t_{3}=\frac{T_{7}}{T_{s}}

 

    通过上述推导,我们得到了空间向量的模、角度与逆变器的PWM之间的关系,下面则是代码实现:

#include "SVPWM_generator.h"
#include "math.h"


#ifdef _USE_SIMULINK
long int Timer;
#endif

float PWM_Table[6];	//Atop,Abot,Btop,Bbot,Ctop,Cbot

/*
      Btop  Cbot
         \  /
    Abot------Atop
         /  \
      Ctop  Bbot
*/

void SVPWM_generator(float TargetPhaseAngle, float TargetPhaseMoldRate)	//
{
	float t1,t2;
#ifdef _USE_SIMULINK
	Timer ++;
	if(Timer >= _SIMULIN_DIVIDE_COUNTER_THREHOLD)
	{
		Timer = 0;
#endif

		if(( TargetPhaseAngle>=0 )&&(TargetPhaseAngle < 60))
		{
			TargetPhaseAngle = TargetPhaseAngle - 0;
			t1 = 1.732 * TargetPhaseMoldRate * sin((60-TargetPhaseAngle)*PI/180);
			t2 = 1.732 * TargetPhaseMoldRate * sin(TargetPhaseAngle*PI/180);
			PWM_Table[0] = (1+t1+t2)/2;
			PWM_Table[2] = (1-t1+t2)/2;
			PWM_Table[4] = (1-t1-t2)/2;
		}
		else if(( TargetPhaseAngle>=60 )&&(TargetPhaseAngle < 120))
		{
			TargetPhaseAngle = TargetPhaseAngle - 60;
			t1 = 1.732 * TargetPhaseMoldRate * sin((60-TargetPhaseAngle)*PI/180);
			t2 = 1.732 * TargetPhaseMoldRate * sin(TargetPhaseAngle*PI/180);
			PWM_Table[0] = (1+t1-t2)/2;
			PWM_Table[2] = (1+t1+t2)/2;
			PWM_Table[4] = (1-t1-t2)/2;
		}
		else if(( TargetPhaseAngle>=120 )&&(TargetPhaseAngle < 180))
		{
			TargetPhaseAngle = TargetPhaseAngle - 120;
			t1 = 1.732 * TargetPhaseMoldRate * sin((60-TargetPhaseAngle)*PI/180);
			t2 = 1.732 * TargetPhaseMoldRate * sin(TargetPhaseAngle*PI/180);
			PWM_Table[0] = (1-t1-t2)/2;
			PWM_Table[2] = (1+t1+t2)/2;
			PWM_Table[4] = (1-t1+t2)/2;
		}
		else if(( TargetPhaseAngle>=180 )&&(TargetPhaseAngle < 240))
		{
			TargetPhaseAngle = TargetPhaseAngle - 180;
			t1 = 1.732 * TargetPhaseMoldRate * sin((60-TargetPhaseAngle)*PI/180);
			t2 = 1.732 * TargetPhaseMoldRate * sin(TargetPhaseAngle*PI/180);
			PWM_Table[0] = (1-t1-t2)/2;
			PWM_Table[2] = (1+t1-t2)/2;
			PWM_Table[4] = (1+t1+t2)/2;
		}
		else if(( TargetPhaseAngle>=240 )&&(TargetPhaseAngle < 300))
		{
			TargetPhaseAngle = TargetPhaseAngle - 240;
			t1 = 1.732 * TargetPhaseMoldRate * sin((60-TargetPhaseAngle)*PI/180);
			t2 = 1.732 * TargetPhaseMoldRate * sin(TargetPhaseAngle*PI/180);
			PWM_Table[0] = (1-t1+t2)/2;
			PWM_Table[2] = (1-t1-t2)/2;
			PWM_Table[4] = (1+t1+t2)/2;
		}
		else if(( TargetPhaseAngle>=300 )&&(TargetPhaseAngle < 360))
		{
			TargetPhaseAngle = TargetPhaseAngle - 300;
			t1 = 1.732 * TargetPhaseMoldRate * sin((60-TargetPhaseAngle)*PI/180);
			t2 = 1.732 * TargetPhaseMoldRate * sin(TargetPhaseAngle*PI/180);
			PWM_Table[0] = (1+t1+t2)/2;
			PWM_Table[2] = (1-t1-t2)/2;
			PWM_Table[4] = (1+t1-t2)/2;
		}
		
		PWM_Table[0] = (PWM_Table[0] >= 0)? PWM_Table[0] : 0;
		PWM_Table[2] = (PWM_Table[2] >= 0)? PWM_Table[2] : 0;
		PWM_Table[4] = (PWM_Table[4] >= 0)? PWM_Table[4] : 0;
	
		PWM_Table[0] = (PWM_Table[0] <= 1)? PWM_Table[0] : 1;
		PWM_Table[2] = (PWM_Table[2] <= 1)? PWM_Table[2] : 1;
		PWM_Table[4] = (PWM_Table[4] <= 1)? PWM_Table[4] : 1;
		
#ifdef _USE_SIMULINK
	}
#endif

}

在SVPWM_generator.h文件中,主要定义了仿真步长、频率等参数,如下:

#ifndef __SVPWM_GENERATOR_H
#define __SVPWM_GENERATOR_H

#define _USE_SIMULINK

#ifdef _USE_SIMULINK
#define _SIMULIN_FREQUENCE 1000000	//Hz
#define _SIMULIN_SVPWM_CALCULATE_FREQUENCE 10000	//Hz
#define _SIMULIN_DIVIDE_COUNTER_THREHOLD  (_SIMULIN_FREQUENCE / _SIMULIN_SVPWM_CALCULATE_FREQUENCE)
#endif

#define PI 3.1415926

extern float PWM_Table[6];
void SVPWM_generator(float TargetPhaseAngle, float TargetPhaseMoldRate);

#endif

    在 SVPWM_generator(float TargetPhaseAngle, float TargetPhaseMoldRate) 中,TargetPhaseAngle为目标向量的相对于A相坐标轴的角度,单位为°, TargetPhaseMoldRate为目标向量的幅值与直流母线的电压的比值,根据SVPWM可知,当TargetPhaseMoldRate < \sqrt{3} / 3时,即目标向量的轨迹圆内切于六个基本向量所组成的正六边形,合成矢量的调制为线性调制。

 

    利用Simulink下的S-Function可以实现对以C语言实现的算法进行仿真分析,仿真框图如下图所示:

逆变桥与负载、测量

 

 

SVPWM、PWM信号生成

    在由SVPWM信号生成PWM信号过程中,需要注意:三项逆变桥的六个PWM波必须是中心对称的。

 

    如何验证算法的正确?SVPWM的目标是生成一个在空间中匀速旋转的矢量,我们可将SVPWM信号进行ABC坐标系到Alpha-Beta坐标系的转换,并用x-y示波器显示出来,检查目标向量轨迹是否为圆。同理,我们也可以将逆变桥的输出电压进行上述变换,检查其输出向量的轨迹。

    

    当TargetPhaseMoldRate = \sqrt{3} / 3时,仿真图形如下:

 

    1、SVPWM输出的马鞍波:

    2、SVPWM的输出经过坐标变换得到的圆:


    3、逆变桥的输出电压波形

    4、逆变桥的输出的电压经过坐标变换得到的目标向量轨迹:

 

  
此内容由EEWORLD论坛网友瓜弟原创,如需转载或用于商业用途需征得作者同意并注明出处

author:nblianyan@qq.com

image.png (43.34 KB, 下载次数: 1)

image.png

评分

1

查看全部评分

0


259

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

沙发
发表于 2019-12-29 22:35 | 只看该作者

matlab也可以共享出来让大伙学习学习



5719

TA的帖子

207

TA的资源

版主

Rank: 6Rank: 6

板凳
发表于 2019-12-29 23:42 | 只看该作者

写的太好了,学习了!

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵



1948

TA的帖子

1

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

4
发表于 2020-1-9 17:28 | 只看该作者

卧槽,瓜弟弟,大作。完全看不懂,有没有办法5分钟精通的?

人已离开,无事别找,找也找不到。


24

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

5
 楼主| 发表于 2020-1-15 18:38 | 只看该作者
freebsder 发表于 2020-1-9 17:28 卧槽,瓜弟弟,大作。完全看不懂,有没有办法5分钟精通的?

今晚来我房间?我手把手教你?

点评

学知识如何能挑剔时间地点?来吧现在的,露天的,把你的知识注入给我。。。  详情 回复 发表于 2020-1-16 17:58


24

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

6
 楼主| 发表于 2020-1-16 17:33 | 只看该作者
hotsauce1861 发表于 2019-12-29 22:35 matlab也可以共享出来让大伙学习学习

见附件

ErLevel_SanPhase_InverterBridge_Simulink.zip

398。79 KB, 下载次数: 102

点评

赞  详情 回复 发表于 2020-1-17 07:59


1948

TA的帖子

1

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

7
发表于 2020-1-16 17:58 | 只看该作者
瓜弟 发表于 2020-1-15 18:38 今晚来我房间?我手把手教你?

学知识如何能挑剔时间地点?来吧现在的,露天的,把你的知识注入给我。。。

人已离开,无事别找,找也找不到。


259

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

8
发表于 2020-1-17 07:59 | 只看该作者



1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

9
发表于 2020-1-19 12:49 | 只看该作者

大赞,感谢楼主分享干货资料



46

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

10
发表于 2020-2-10 22:18 | 只看该作者

大赞,必须竖大拇指,厉害了!



24

TA的帖子

2

TA的资源

一粒金砂(初级)

Rank: 1

11
发表于 2020-3-30 17:25 | 只看该作者

谢谢楼主分享!



您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( )

GMT+8, 2020-4-8 17:13 , Processed in 0.351854 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表
快3娱乐平台 快乐飞艇免费计划app 快乐赛车快乐飞艇是哪里开的 快乐飞艇怎么玩能赢 快乐赛车怎么看走势图 快乐赛车代理怎么做的 快乐赛车代理资源怎么找 快乐飞艇免费计划app 快乐飞艇怎么充值 快乐飞艇统一开奖吗