SVPWM原理及编程实现(Ti的库)

这篇文章中介绍到的符号及其含义参考:

永磁同步电机SVPWM技术参考

1. 标幺值

标幺值是相对于某一基准值而言的,同一有名值,当基准值选取不同时,其标幺值也不同。

标幺值 = 某物理量的实际值/该物理量的基准值

2. 标幺化处理

2.1 电压幅值进行标幺(归一)化处理

线电压最大值为U_{dc},q轴电压最大值的绝对值为U_{dc}/\sqrt{3},选择U_{dc}/\sqrt{3}为基(准)值,则有:

U_{4}=U_{6}=\frac{2}{3}U_{dc} ,其标幺值  为\frac{2}{\sqrt{3}}U_{dc}被标幺化之后,其值为\sqrt{3}。注意一点,U_{dc}标幺化意味着跟电压相关的量都进行了处理

2.2 对矢量作用时间进行标幺化

根据参考文章,可知U_{4}U_{6}的作用时间为:

 这里的U_{dc}=\sqrt{3},然后式(2-20)可以写成

T_{4}=\frac{T_{s}}{2}(\sqrt{3}u_{\alpha }-u_{\beta }) ,T_{6}=\frac{T_{s}}{2}u_{\beta }

对时间进行归一化处理:以载波周期T为基准值,则有:

T_{4}=\frac{1}{2}(\sqrt{3}u_{\alpha }-u_{\beta }),T_{6}=\frac{1}{2}u_{\beta }

同理可以得出其他扇区各矢量的作用时间。令

 也就是

 因为涉及到多个扇区,因此制定下面一个标准

扇区U4和U6U2和U6U2和U3U1和U3U1和U5U4和U5
t1-ZZX-X-YY
t2X   Y-YZ-Z-X

   

扇区123456
t1对应矢量U4U2U2U1U1U4
t2对应矢量U6U6U3U3U5U5

那么N与作用时间的关系为,其中T4=T1,T6=T2

 采用七段式SVPWM调制,每个载波周期中依次有:1个开关导通-->2个开关导通-->3个开关导通-->2个开关导通-->1个开关导通

3. 硬件实现SVPWM流程

1. 确定扇区(还有N),注意一点N和扇区不是一个东西;参考文章

2. 计算X、Y、Z,进而计算t1,t2;

3. 确定taon、tbon、tcon赋值给Ta、Tb、Tc;这一步也参考 参考文章中的表2-2,很容易推出各个开关管的开启关断时间。

4. 把Ta、Tb、Tc赋给CMPRx。   

下面是Ti的代码,注意一点Sector表示的是N的值,其他很简单。

/* =================================================================================
File name:       SVGEN_DQ.H  (IQ version)                    
                    
Originator:	Digital Control Systems Group
			Texas Instruments

Description: 
Header file containing constants, data type, and macro  definitions for the SVGEN_DQ module .
=====================================================================================
 History:
-------------------------------------------------------------------------------------
 4-15-2010	Version 1.1                                                 
------------------------------------------------------------------------------*/
#ifndef __SVGEN_DQ_H__
#define __SVGEN_DQ_H__



typedef struct 	{ _iq  Ualpha; 			// Input: reference alpha-axis phase voltage 
				  _iq  Ubeta;			// Input: reference beta-axis phase voltage 
				  _iq  Ta;				// Output: reference phase-a switching function		
				  _iq  Tb;				// Output: reference phase-b switching function 
				  _iq  Tc;				// Output: reference phase-c switching function
				  Uint16 N;
				} SVGENDQ;
																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																				
typedef SVGENDQ *SVGENDQ_handle;
/*-----------------------------------------------------------------------------
Default initalizer for the SVGENDQ object.
-----------------------------------------------------------------------------*/                     
#define SVGENDQ_DEFAULTS { 0,0,0,0,0,0 }

/*------------------------------------------------------------------------------
	Space Vector PWM Generator (SVGEN_DQ) Macro Definition
------------------------------------------------------------------------------*/


_iq Va,Vb,Vc,t1,t2,temp_sv1,temp_sv2;
Uint16 Sector = 0;  // Sector is treated as Q0 - independently with global Q

#define SVGEN_MACRO(v)															\
																				\
	Sector = 0;																	\
	temp_sv1=_IQdiv2(v.Ubeta); 					/*divide by 2*/					\
	temp_sv2=_IQmpy(_IQ(0.8660254),v.Ualpha);	/* 0.8660254 = sqrt(3)/2*/		\
																				\
/* Inverse clarke transformation */												\
	Va = v.Ubeta;																\
	Vb = -temp_sv1 + temp_sv2;													\
	Vc = -temp_sv1 - temp_sv2;													\
/* 60 degree Sector determination */											\
	if (Va>_IQ(0)) Sector = 1;													\
	if (Vb>_IQ(0)) Sector = Sector+2;											\
	if (Vc>_IQ(0)) Sector = Sector+4;											\
	v.N = Sector;                                                               \
/* X,Y,Z (Va,Vb,Vc) calculations X = Va, Y = Vb, Z = Vc */						\
	Va = v.Ubeta;																\
	Vb = temp_sv1 + temp_sv2;													\
	Vc = temp_sv1 - temp_sv2;													\
/* Sector 0: this is special case for (Ualpha,Ubeta) = (0,0)*/					\
switch(Sector)																	\
{																				\
	case 0:																		\
	v.Ta = _IQ(0.5);															\
	v.Tb = _IQ(0.5);															\
	v.Tc = _IQ(0.5);															\
	break;																		\
	case 1:   /*Sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc)*/					\
	t1 = Vc;																	\
	t2 = Vb;																	\
	v.Tb=_IQdiv2((_IQ(1)-t1-t2)); 												\
	v.Ta = v.Tb+t1;			 	/* taon = tbon+t1		*/						\
	v.Tc = v.Ta+t2;			  	/* tcon = taon+t2		*/						\
	break;																		\
	case 2:	  /* Sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb)*/ 				\
	t1 = Vb;																	\
	t2 = -Va;																	\
	v.Ta=_IQdiv2((_IQ(1)-t1-t2)); 												\
	v.Tc = v.Ta+t1;				/*  tcon = taon+t1		*/						\
	v.Tb = v.Tc+t2;				/*  tbon = tcon+t2		*/						\
	break;																		\
	case 3:	  /* Sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc)*/					\
	t1 = -Vc;																	\
	t2 = Va;																	\
	v.Ta=_IQdiv2((_IQ(1)-t1-t2)); 												\
	v.Tb = v.Ta+t1;				/*	tbon = taon+t1		*/						\
	v.Tc = v.Tb+t2;				/*	tcon = tbon+t2		*/						\
	break;																		\
	case 4:	  /* Sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta)*/					\
	t1 = -Va;																	\
	t2 = Vc;																	\
	v.Tc=_IQdiv2((_IQ(1)-t1-t2)); 												\
	v.Tb = v.Tc+t1;				/*	tbon = tcon+t1		*/						\
	v.Ta = v.Tb+t2;				/*	taon = tbon+t2		*/						\
	break;																		\
	case 5:	  /* Sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta)*/					\
	t1 = Va;																	\
	t2 = -Vb;					/*	tbon = (1-t1-t2)/2	*/						\
	v.Tb=_IQdiv2((_IQ(1)-t1-t2)); 												\
	v.Tc = v.Tb+t1;				/*	taon = tcon+t2		*/						\
	v.Ta = v.Tc+t2;																\
	break;																		\
	case 6:	  /* Sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb)*/				\
	t1 = -Vb;																	\
	t2 = -Vc;																	\
	v.Tc=_IQdiv2((_IQ(1)-t1-t2)); 												\
	v.Ta = v.Tc+t1;				/*	taon = tcon+t1		*/						\
	v.Tb = v.Ta+t2;				/*	tbon = taon+t2		*/						\
	break;																		\
}																				\
/*  Convert the unsigned GLOBAL_Q format (ranged (0,1)) ->.. */					\
/* 	..signed GLOBAL_Q format (ranged (-1,1))*/									\
v.Ta = _IQmpy2(v.Ta-_IQ(0.5));													\
v.Tb = _IQmpy2(v.Tb-_IQ(0.5));													\
v.Tc = _IQmpy2(v.Tc-_IQ(0.5));													\

#endif // __SVGEN_DQ_H__

    Ts(时基周期寄存器的值)=2* v.HalfPerMax,v.MfuncC1,v.MfuncC2,v.MfuncC2,分别等于v.Ta,v.Tb,v.Tc。

#define PWM_MACRO(ch1,ch2,ch3,v)													\
																					\
/*  Mfuncx range is (-1,1)														*/	\
/*  The code below changes PeriodMax*Mfuncx range ....  						*/	\
/*  from (-PeriodMax,PeriodMax) to (0,PeriodMax) where HalfPerMax=PeriodMax/2	*/	\
																					\
	(*ePWM[ch1]).CMPA.half.CMPA = _IQmpy(v.HalfPerMax,v.MfuncC1)+ v.HalfPerMax;		\
	(*ePWM[ch2]).CMPA.half.CMPA = _IQmpy(v.HalfPerMax,v.MfuncC2)+ v.HalfPerMax;		\
	(*ePWM[ch3]).CMPA.half.CMPA = _IQmpy(v.HalfPerMax,v.MfuncC3)+ v.HalfPerMax;		\

           

### 回答1: SVPWM全称为“空间矢量脉宽调制”,是一种矢量控制技术,可用于三相电力逆变器,使其产生高质量的交流电信号。该算法的原理是基于三相电力逆变器的控制需求,将三个电压向量(也称为空间矢量)的大小和相位优化组合,以达到输出所需频率和幅值的目的。 该算法基于两个主要概念:矢量合成和脉宽调制。首先,它将所需输出电压(通常是正弦波)转换为空间矢量,即在三相电压平面上的三个向量之和,这些向量的大小和相位角需满足所需输出电压的频率和幅值。然后,逆变器将这些向量转换为电压波形,通过逐步改变电压信号的占空比,形成一个类似于正弦波的输出波形。脉宽调制方法通过精确控制脉冲宽度来实现最终电压信号的输出。 SVPWM算法是一种高效且精密的控制技术,能够产生高质量的交流信号。该算法的主要优点是具有高效性和精密性,能够实现高质量、高效率的逆变器控制,可用于多种工业应用领域,如电机控制、太阳能光伏系统等。 ### 回答2: SVPWM(Space Vector Pulse Width Modulation)算法是一种常用的调制技术,用于三相电压源逆变器的输出控制。它是在矢量控制的基础上发展起来的一种高级调制技术。 SVPWM算法的原理是将电压矢量按照不同的位置分为两类,一类为主矢量,另一类为辅助矢量。在每个电周期内,通过控制主矢量和辅助矢量的占空比比例,达到所需要输出波形的目的。其核心思想是将三相电压转换为空间矢量的形式,在空间中进行合理的输出调制。 具体的实现步骤为:首先确定矢量的幅值和方向,计算出相应的占空比;然后根据所得到的占空比,在每个时刻选择相应的主矢量和辅助矢量;最后,按照选定的主矢量和辅助矢量的占空比比例,通过一系列复杂的计算,得到输出波形。 SVPWM算法具有高精度、高效率、低谐波等优点,在众多应用领域中得到了广泛的应用。同时,这一算法的实现也存在一定的难度,需要深入了解和掌握三相电路的原理以及信号处理、控制算法等相关知识。 ### 回答3: SVPWM算法即空间矢量调制算法,是一种广泛应用于交流电机驱动器中的PWM技术。它的原理是将三相电压分解为两个正交矢量,然后通过改变这两个矢量的大小和相位来控制输出的电压大小和相位。其优点在于输出电压的质量高,效率高,噪音小,且适用于各种负载情况。 SVPWM算法的实现需要对矢量的大小和相位进行精确计算和控制,因此需要一定的数学基础和控制理论。其主要过程可以分为以下几步: 1. 将输入的三相电压转化为两个正交的矢量,即α轴和β轴矢量。 2. 根据控制目标,计算出所需输出的矢量,即在αβ坐标系中所需的目标矢量。 3. 通过计算目标矢量与参考矢量的误差,得到需要纠正的矢量调制量,即dq轴电压。 4. 根据dq轴电压的大小和方向调节输出电压的大小和相位,达到控制目标。 5. 在输出电压周期内不断重复以上步骤,实现电机转速控制。 总的来说,SVPWM算法是一种高效、精确、稳定的PWM技术,适用于各种负载情况。但需要注意的是,SVPWM算法的实现过程较为复杂,需要较高的计算和控制能力,因此需要专门的控制芯片或计算机系统进行实现。同时,其在实际应用中也需要考虑到电流和电压的限制、控制误差等因素,以确保系统运行的稳定性和安全性。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值