SVPWM算法程序

合集下载

SVPWM的实现过程(附C代码)

SVPWM的实现过程(附C代码)

SVPWM 算法的实现过程1、算法的输入与输出输入u s α、u s β 输出:三个比较寄存器的值CompA 、CompB 、CompC根据给定的二相静止坐标系中两个电压分量u s α、u s β,根据电压矢量所在的扇区选择相邻的两个的电压矢量,并计算相邻两个电压矢量的作用时间,按照7段式SVPWM 对CompA 、CompB 、CompC 进行赋值,算法的流程如下:2、扇区计算空间矢量调制的第一步是判断由u s α、u s β所决定的空间电压矢(U ref )量所处的扇区。

假定合成的电压矢量落在第 I 扇区,可知其等价条件如下:0<arctan(u s β/u s α)<60 º 以上等价条件再结合矢量图几何关系分析,可以判断出合成电压矢量。

落在第N 扇区的充分必要条件,得出下表1-1:ref s β 3u s α-u s β 、− 3u s α-u s β 三式决定,因此令:1232222U U U U U U ββαβα⎧=⎪⎪⎪=-⎨⎪⎪=--⎪⎩再定义,若U 1>0 ,则 A=1,否则 A=0; 若U 2>0 ,则 B=1,否则 B=0;若U 3>0 ,则 C=1,否则 C=0。

可以看出 A ,B ,C 之间共有八种组合,但由判断扇区的公式可知 A ,B ,C 不会同时为 1 或同时为 0,所以实际的组合是六种,A ,B ,C 组合取不同的值对 应着不同的扇区,并且是一一对应的,因此完全可以由 A ,B ,C 的组合判断所在的扇区。

为区别六种状态,令 X=4*C+2*B+A ,则可以通过下表计算参考电压 矢量 U ref 所在的扇区。

表 1-2 X 值与扇区对应关系采用上述方法,只需经过简单的加减及逻辑运算即可确定所在的扇区,对于提高系统的响应速度和进行仿真都是很有意义的。

3、扇区相邻电压矢量的作用时间计算当电压矢量位于第一扇区时,欲用 U 4、U 6、U 0 及 U 7 合成,用平均值等效可得:4466ref S U T U T U T *=*+*因为 |U 4|=|U 6|=2U dc /3 ,所以可以得到各矢量的状态保持时间为: T 6=3T s U dc u s βT 4=Ts U dc(32u s α−32u s β)当电压矢量位于其他扇区时同理可算出相邻电压的作用时间: 第二扇区:T 6=T s U dc(32u s α+32u s β) T 2=T s U dc(−32u s α+32u s β) 第三扇区:T 2= 3T sUdcu s βT 3=−T s U dc(32u s α+32u s β) 第四扇区:T 1=−3T s U dcu s β T 3=T s U dc(−32u s α+32u s β)第五扇区:T1=−T sU dc (32u sα+32u sβ)T5=T sU dc(32u sα−32u sβ)第六扇区:T5=−3T sU dc u sβT4=T sU dc(32u sα+32u sβ)令x=3T sU dc u sβ,y=T sU dc(32u sα+32u sβ),z=T sU dc(32u sα−32u sβ),则在每个扇区相邻的两电压矢量的作用时间如下表所示:4、计算比较寄存器的值通过上面的计算,已经的到了电压矢量所在的扇区以及相邻电压矢量的作用时间,接下来的问题是如何根据上面的结果来计算寄存器的值,使得DSP的ePWM模块发出正确的脉冲信号控制三相电桥。

SVPWM的原理和法则推导和控制算法详细讲解

SVPWM的原理和法则推导和控制算法详细讲解

SVPWM的原理和法则推导和控制算法详细讲解SVPWM(Space Vector Pulse Width Modulation)是一种三相不对称多电平PWM调制技术。

其原理是将三相电压转换为空间矢量信号,通过调制的方式控制逆变器输出电压,以实现对三相电机的控制。

下面将详细介绍SVPWM的原理、法则推导以及控制算法。

一、原理:SVPWM的原理在于将三相电压分解为两相,即垂直于矢量且相互垂直的两个分量,直流坐标分量和交流坐标分量。

其中,直流坐标分量用于产生直流电压,交流坐标分量用于产生交流电压。

通过对直流和交流坐标的调制,可以生成所需的输出电压。

二、法则推导:1.将三相电压写成直流坐标系下的矢量形式:V_dc = V_d - 0.5 * V_a - 0.5 * V_bV_ac = sqrt(3) * (0.5 * V_a - 0.5 * V_b)2. 空间矢量信号通过电源电压和载波进行调制来生成输出电压。

其中,电源电压表示为空间矢量V。

根据配比原则,V_dc和V_ac分别表示空间矢量V沿直流和交流坐标的分量。

V = V_dc + V_ac3.根据法则推导,导出SVPWM的输出电压:V_u = 1/3 * (2 * V_dc + V_ac)V_v = 1/3 * (-V_dc + V_ac)V_w = 1/3 * (-V_dc - V_ac)三、控制算法:1. 设定目标矢量Vs,将其转换为直流坐标系分量V_dc和交流坐标系分量V_ac。

2.计算空间矢量的模长:V_m = sqrt(V_dc^2 + V_ac^2)3.计算空间矢量与各相电压矢量之间的夹角θ:θ = arctan(V_ac / V_dc)4.计算换向周期T和换相周期T1:T=(2*π*N)/ω_eT1=T/6其中,N为极对数,ω_e为电机的角速度。

5.根据目标矢量和夹角θ,确定目标矢量对应的扇区。

6.根据目标矢量和目标矢量对应的扇区,计算SVPWM的换相角度β和占空比:β=(2*π*N*θ)/3D_u = (V_m * cos(β) / V_dc) + 0.5D_v = (V_m * cos(β - (2 * π / 3)) / V_dc) + 0.5D_w=1-D_u-D_v以上步骤即为SVPWM的控制算法。

SVPWM算法设计_

SVPWM算法设计_

SVPWM 算法设计一 算法原理:1,逆PARK 变换(InversePark()),旋转坐标系到静止坐标系的变换由于矢量控制算法是在旋转坐标系d-q 坐标系中完成的,当给定量(Vd, Vq )计算出来后,需要转换成静止坐标系,最终转化成对定子交流量的控制。

逆PARK 变换公式如下:⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡q d V V V V θθθθβαcos sin sin cos (θ为电角度,d 轴与α轴的夹角)2,SVPWM 算法(Svpwm())1) 计算扇区N从电压空间矢量图可以看出,当Vref 在0 - 60度时,位于IV 扇区;在60 – 120度时,位于VI 扇区;在120 – 180度时,位于II 扇区;在180 – 240度时,位于III 扇区;在240-300度时,位于I 扇区;在300 – 360图1 SVPWM 在中断服务程序中的位置度时,位于V 扇区。

令:)3(2/1)3(2/1βαβαβV V V V V V V V c b a --=-==(逆CLARK 变换2/3)这三个电压值的正负决定了电压矢量所属的扇区。

总结规律,扇区的计算可表示为:if(Va>0) a=0; else a=1; if(Vb>0) b=0; else b=1; if(Vc>0) c=0; else c=1; N=a+2*b+4*c;2) 计算矢量作用时间t start ,t end 与t Z对一个给定的矢量V ref,可以用相邻的两个非零矢量与两个零矢量(V 0,V 7)根据平均值等效的原则得到。

当V ref 在IV 扇区时,计算公式如下:ZZ Zt t t t V t V t V T ++⨯+⨯+⨯=⨯646644从而得到, 6464)/3()3(2/1)/3(t t T t V V T t V V V T t Z DC a DC --=⨯=-⨯=ββ类似的,当V ref 在VI 区时,6226)3(2/1)/3()3(2/1)/3(t t T t V V V T t V V V T t Z DC DC --=+-⨯=+⨯=βαβα当V ref 在II 区时,3232)3(2/1)/3()/3(t t T t V V V T t V V T t Z DC DC --=--⨯=⨯=βαβ总结规律如下表(令DC V T K /3=)以上是在电压矢量逆时针旋转时的规律,t start 、t end 是顺着电压矢量旋转方向前后两相邻矢量的作用时间。

SVPWM算法实现

SVPWM算法实现

SVPWM 算法分析Vicho_HU交流电机输入三相正弦电流的最终目的是在电机气隙中形成圆形旋转磁场,以产生恒定的转矩。

SVPWM 调制方法把逆变器与交流电机视为一体,按照跟踪圆形磁场来驱动逆变器以实现对电机的控制。

图3.1给出了三相VSI-交流电机调速系统主电路原理图。

令S a 、S b 、S c 为VSI 三相桥臂的开关状态量,S j(j=a,b,c)=1表示上桥臂VT j(j=1,3,5)开关管导通;S j(j=a,b,c)=0表示下桥臂VT j(j=4,6,2)开关管导通。

a bcVT 1VT 4VT 3VT 6VT 5VT 2U dc图3.1 三相VSI-交流电机调速系统主电路原理图三相两电平电压源型逆变器(VSI)通过六个开关管的通断形成八个空间电压矢量U i (i=0~7),其中U 0与U 7为零矢量。

在一个周期内,六个空间电压矢量(U i (i=1~6))所形成的磁链轨迹是正六边形。

若要磁链形成圆形轨迹,可以采用相邻的两个空间电压矢量U i 和U i+x 进行时间上的线性合成以形成圆形磁链的空间电压矢量U s 来实现SVPWM 控制。

图3.2给出了SVPWM 的向量图。

实现SVPWM 模块可以分为以下几个步骤:(1) 确定合成给定空间电压矢量U s 的电压矢量U i 和U i+x ; (2) 确定电压矢量U i 和U i+x 的作用时间T 1和T 2; (3) 确定空间电压矢量的切换点。

图3.2 SVPWM向量图要实现步骤(1),必须借助一个中间变量即扇区S ector,扇区是电压矢量(U i(i=1~6))将空间划分成六个区域即图3.2中的S(1)~S(6)。

每个扇区所对应的电压矢量U i和U i+x是不相同的,表3.1给出了扇区S(1)~S(6)与空间电压矢量U i和U i+x 对应关系。

表3.1扇区S(1)~ S(6)的空间电压矢量U i和U i+x对应关系表在确定扇区与与空间电压矢量U i和U i+x的对应关系的基础上,只要确定了空间电压矢量U s的扇区即可确定合成给定空间电压矢量U s的电压矢量U i和U i+x。

svpwm的原理及法则推导和控制算法详解

svpwm的原理及法则推导和控制算法详解

svpwm的原理及法则推导和控制算法详解SVPWM是一种空间矢量脉宽调制技术,常应用于交流电机的无传感器矢量控制方案中。

SVPWM的原理及法则推导涉及到三相交流电机理论、空间矢量分析以及脉宽调制等内容。

下面将对SVPWM的原理、法则推导和控制算法进行详解。

1.SVPWM原理SVPWM的原理是基于交流电机的三相正弦波电流与空间矢量之间的转换关系。

交流电机的电流空间矢量可以表示为一个复数形式,即电流空间矢量(ia, ib, ic) = ia + jib。

空间矢量在空间中对应一个电机角度θ。

SVPWM的目标是控制交流电机的三相正弦波电流,使其与预期空间矢量一致,从而控制电机输出力矩和转速。

SVPWM首先对预期空间矢量进行空间矢量分解,将其分解为两个基本矢量Va和Vb。

然后根据电机角度θ和两个基本矢量的大小比例,计算出三相正弦波电流的幅值和相位。

2.SVPWM法则推导SVPWM的法则推导是为了实现精确控制电机的输出力矩和转速。

在法则推导中,首先需要建立电流与电压之间的关系,然后计算出三相正弦波电流的幅值和相位。

最后根据幅值和相位生成PWM波形,控制交流电机的动作。

具体推导过程如下:-步骤1:计算Va和Vb的大小比例,根据预期空间矢量和电机角度θ,可以通过三角函数计算出Va和Vb的幅值。

-步骤2:计算Vc,由于交流电机为三相对称系统,Vc的幅值等于Va和Vb的和,相位等于Va相位加120度。

-步骤3:计算三相正弦波电流的幅值和相位,幅值可以通过输入电压和阻抗模型计算得到。

-步骤4:根据幅值和相位生成PWM波形。

3.SVPWM控制算法SVPWM控制算法实现了对交流电机输出力矩和转速的精确控制。

- 步骤1:通过位置传感器或者传感器less技术获取电机角度θ。

-步骤2:根据预期输出力矩和转速,计算出预期空间矢量。

-步骤3:根据电机角度θ和预期空间矢量,计算出Va和Vb的幅值。

-步骤4:根据Va和Vb的大小比例和Vc的相位,生成PWM波形。

SVPWM控制算法

SVPWM控制算法

精心整理电力电子课程作业量PWMSVPWMSVPWM第二章 SVPWM 分析2.1 SVPWM 算法指令是矢量控制系统给出的矢量信号ref U ,它以某一角频率θτω=在空间逆时针旋转,当它旋转到矢量图的某个060扇区中时,系统选中该区间的所需的基本电压空间矢量,并以此矢量所对应的状态去驱动功率开关元件动作。

当控制矢量在空间旋转0360后,逆变器就能输出一个周期的正弦波电压。

在高性能的交流调速及三相逆变系统中,通常采用三相轴系到βα-坐标系的变换。

闭环控制系统中,参考电压矢量的βα-分量αU 和βU 通过闭环控制器的输出很容易获得;开环控制系统中,将期望输出的电压映射到βα-坐2.2 3/2变换然而,旋转磁动势并不一定非要三相不可,除单相以外,二相、三相、四相……等任意对称的多相绕组,通入平衡的多相电流,都能产生旋转磁动势,当然以两相最为简单。

图2-4中绘出了两相静止绕组α和β,它们在空间互差900,通入时间上互差900的两相平衡交流电流,也能产生旋转磁动势F。

当图2-4a和b的两个旋转磁动势大小和转速都相等时,即认为图2-4b 的两相绕组与图2-4a的三相绕组等效。

再看图2-4c中的两个匝数相等且互相垂直的绕组d和q,其中分别通过现在先考虑上述的第一种坐标变换——在三相静止绕组A、B、C和两相静止绕组α、β之间的变换,或称三相静止坐标系和两相静止坐标系间的变换,简称3s/2s变换。

图2-5中绘出了A、B、C和α、β两个坐标系,为方便起见,取A轴和α轴重合。

设三相绕组每项有效匝数为N3,两相绕组每相有效匝数位N2,各相磁动势为有效匝数与电流的乘积,其空间矢量均位于有关相的坐标轴上。

量分别为u和i,在行新的坐标系下,电压和电流向量变成u'和i',其中[][][]121212T n T n T n u u u u i i i i u u u u ⎧=⎪⎪=⎪⎨''''=⎪……… (2-4)其中E 为单位矩阵。

svpwm代码算法加注释

svpwm代码算法加注释

svpwm代码算法加注释SVPWM (Space Vector Pulse Width Modulation) 是一种常用于电机控制的PWM方法。

以下是一个简单的SVPWM算法的Python实现,并附有注释:```pythonimport numpy as np定义扇区数目N = 3定义与扇区数目对应的角度Sector_angle = ([0, 60, 120, 180, 240, 300])定义一个周期内的脉冲时间数组T1 = (N)T2 = (N)T0 = (N)SVPWM算法def svpwm(Vd, Vq):global N, Sector_angle计算矢量在dq轴上的分量并归一化d = Vd / (Vd2 + Vq2)q = Vq / (Vd2 + Vq2)计算当前矢量所在的扇区sector = (60 q) + 1计算当前矢量在扇区内的偏移角度theta = (60 q - Sector_angle[sector - 1]) % 60根据偏移角度计算T1和T2的长度T1[sector - 1] = d (theta) + q (theta)T2[sector - 1] = d (theta) - q (theta)T0的长度由剩下的时间决定,一个周期为1T0[sector - 1] = 1 - T1[sector - 1] - T2[sector - 1]返回T1, T2和T0的时间数组return T1, T2, T0```这个代码首先定义了扇区的数量(N=3)和每个扇区的角度。

然后,它定义了在一个PWM周期内,T1、T2和T0的初始长度都为0。

最后,`svpwm`函数接收两个输入:Vd和Vq,分别表示在d轴和q轴上的电压分量。

函数首先计算这两个分量的归一化长度,然后确定当前的扇区和偏移角度。

根据这些信息,函数计算出T1和T2的长度,然后计算出T0的长度(在一个PWM周期内剩下的时间)。

SVPWM程序流程

SVPWM程序流程

SVPWM程序流程SVPWM(Space Vector Pulse Width Modulation,空间矢量脉宽调制)是一种针对三相电力变频器的调制算法,用于控制电机的速度和位置。

它向电机提供的是一个平滑的、恒定的输出,根据需要,还可以提供更高的效率和低噪声。

下面是SVPWM的程序流程。

1.首先,设定一个控制周期Tp,通常为几微秒至几毫秒。

控制周期是指电机控制器对电机进行一次新的计算和控制的时间。

2.初始化参数。

在每个控制周期开始时,需要初始化一些参数,例如注入的电流、电压、电机状态参数等。

3.设置参考矢量。

根据所需的电机速度和位置,设置参考矢量。

这些参考矢量确定了电机所需的电流矢量。

4.计算矢量时序。

根据设置的参考矢量,计算出每个矢量的持续时间。

每个电流矢量会在一段时间内保持不变。

5.计算电流波形。

通过电流矢量的持续时间和幅值,计算出每个电流矢量的波形。

波形通常是一个三相正弦波形。

6.选择最佳矢量。

根据所计算出的电流波形和每个矢量的持续时间,选择最佳的电机矢量。

最佳矢量是指使电流矢量与参考矢量尽可能接近的矢量。

7.计算PWM信号。

根据选择的最佳矢量,计算出每个相位的PWM信号。

PWM信号通常是一个方波信号,其占空比由最佳矢量的持续时间决定。

8.更新电机状态。

根据计算出的PWM信号,更新电机状态参数,例如电机速度、位置、电流等。

9.输出PWM信号。

将计算出的PWM信号输出到电机驱动器中,驱动器通过PWM信号控制电机转速和位置。

10.延时一段时间。

由于控制循环是一个周期性的过程,为了控制的稳定性和准确性,需要在每个控制周期之间延时一段时间。

11.重复上述步骤。

循环执行上述步骤,直到需要改变电机速度和位置或停止电机工作。

总结:SVPWM程序流程是一个经典的控制算法流程,通过对电机的控制周期内参数的初始化、参考矢量的设置、计算矢量时序和波形、选择最佳矢量、计算PWM信号、更新电机状态等一系列步骤,最终实现对电机速度和位置的控制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章空间矢量脉宽调制技术例1、CLARK变换的DSP实现图CLARK变换实现波形图/*---------------------------------------------------------------------------------------------------------------------------------------- CLARKE变换相关变量定义----------------------------------------------------------------------------------------------------------------------------------------*/ typedef struct { float32 As; // 输入:A相定子电流float32 Bs; // 输入:B相定子电流float32 Alpha; // 输出:静止坐标系d轴定子电流float32 Beta; // 输出:静止坐标系q轴定子电流void (*calc)(); // 计算函数指针} CLARKE;typedef CLARKE *CLARKE_handle;/*---------------------------------------------------------------------------------------------------------------------------------------- 定义CLARKE变换初始化参数----------------------------------------------------------------------------------------------------------------------------------------*/ #define CLARKE_DEFAULTS { 0, \0, \0, \0, \(void (*)(Uint32))clarke_calc }/*---------------------------------------------------------------------------------------------------------------------------------------- CLARKE变换函数原型CLARKE.C----------------------------------------------------------------------------------------------------------------------------------------*/ void clarke_calc(CLARKE_handle);#include "dmctype.h"#include "clarke.h"void clarke_calc(CLARKE *v){v->Alpha = v->As;v->Beta = (v->As + 2*v->Bs)*0.57735026918963; // 1/sqrt(3) = 0.57735026918963}例2、PARK变换的DSP实现图PARK变换DSP实现坐标映射/*---------------------------------------------------------------------------------------------------------------------------------------- PARK变换相关变量定义----------------------------------------------------------------------------------------------------------------------------------------*/ typedef struct { float32 Alpha; // 输入:静止坐标系d轴定子变量loat32 Beta; // 输入:静止坐标系q轴定子变量float32 Angle; // 输入:转子角度(弧度)float32 Ds; // 输出:旋转d轴定子变量(M轴)float32 Qs; // 输出:旋转q轴定子变量(T轴)void (*calc)(); // 函数指针} PARK;typedef PARK *PARK_handle;/*---------------------------------------------------------------------------------------------------------------------------------------- PARK变换变量初始化参数----------------------------------------------------------------------------------------------------------------------------------------*/ #define PARK_DEFAULTS { 0, \0, \0, \0, \0, \(void (*)(Uint32))park_calc }/*---------------------------------------------------------------------------------------------------------------------------------------- PARK函数原型----------------------------------------------------------------------------------------------------------------------------------------*/ void park_calc(PARK_handle);#include "dmctype.h"#include "park.h"extern float32 sin_tab[];void park_calc(PARK *v){float32 Cosine,Sine;// 采用查表法// (PI/2)/(2*PI) = 0.25// ((PI/2)/(2*PI))*256 = 0.25*256 = 64// ((PI/2)-2*PI)/(2*PI) = -0.75// (((PI/2)-2*PI)/(2*PI))*256 = -0.75*256 = -192// 查表发求解正弦if (v->Angle+0.25 > 1.0){Sine = sin_tab[(int16)(v->Angle*256)];Cosine = sin_tab[(int16)(v->Angle*256) - 192];}else{Sine = sin_tab[(int16)(v->Angle*256)];Cosine = sin_tab[(int16)(v->Angle*256) + 64];}v->Ds = v->Alpha*Cosine + v->Beta*Sine;v->Qs = v->Beta*Cosine - v->Alpha*Sine;}图6.7 PARK变换坐标映射图/*---------------------------------------------------------------------------------------------------------------------------------------- PARK逆变换参数定义----------------------------------------------------------------------------------------------------------------------------------------*/ typedef struct { float ds; /* 输出:定子参考坐标系d-轴变量*/float qs; /* 输出:定子参考坐标系q-轴变量*/float ang; /* 输入:转子转动角度(rad) */float de; /* 输入:旋转d-轴定子变量*/float qe; /* 输入:旋转q-轴定子变量*/void (*calc)(); /* 计算函数指针*/} IPARK;typedef IPARK *IPARK_handle;/*---------------------------------------------------------------------------------------------------------------------------------------- Default initalizer for the IPARK object.----------------------------------------------------------------------------------------------------------------------------------------*/ #define IPARK_DEFAULTS { 0, \0, \0, \0, \0, \(void (*)(long))ipark_calc }/*---------------------------------------------------------------------------------------------------------------------------------------- 逆变换函数IPARK.C----------------------------------------------------------------------------------------------------------------------------------------*/ void ipark_calc(IPARK_handle);/*----------------------------------------------------------------------------------------------------------------------------------------文件名称:: IPARK.C----------------------------------------------------------------------------------------------------------------------------------------*/ #include "ipark.h"extern float sin_tab[];void ipark_calc(IPARK *v){float cos_ang,sin_ang;/*采用查表法计算正弦角度*//* (PI/2)/(2*PI) = 0.25 *//* ((PI/2)/(2*PI))*256 = 0.25*256 = 64 *//* ((PI/2)-2*PI)/(2*PI) = -0.75 *//* (((PI/2)-2*PI)/(2*PI))*256 = -0.75*256 = -192 */if (v->ang+0.25 > 1){sin_ang = sin_tab[(int)(v->ang*256)];cos_ang = sin_tab[(int)(v->ang*256) - 192];}else{sin_ang = sin_tab[(int)(v->ang*256)];cos_ang = sin_tab[(int)(v->ang*256) + 64];}v->ds = v->de*cos_ang - v->qe*sin_ang;v->qs = v->qe*cos_ang + v->de*sin_ang;}例3、空间矢量的算法程序/*----------------------------------------------------------------------------------------------------------------------------------------空间矢量的产生: SVGEN_DQ.C (IQ version)----------------------------------------------------------------------------------------------------------------------------------------*/ #include "IQmathLib.h" // Include header for IQmath library// Don't forget to set a proper GLOBAL_Q in "IQmathLib.h" file#include "dmctype.h"#include "svgen_dq.h"void svgendq_calc(SVGENDQ *v){_iq Va,Vb,Vc,t1,t2;Uint32 Sector = 0; // Sector is treated as Q0 - independently with global Q// CLARKE 逆变换 Va = v->Ubeta;Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha); Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha);// 0.8660254 = sqrt(3)/2// 60o 扇区确定 if (Va>_IQ(0)) Sector = 1; if (Vb>_IQ(0)) Sector = Sector + 2; if (Vc>_IQ(0)) Sector = Sector + 4;// X,Y,Z (Va,Vb,Vc) 计算Va = v->Ubeta; // X = Va Vb = _IQmpy(_IQ(0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha); // Y = Vb Vc = _IQmpy(_IQ(0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha); // Z = Vcif (Sector==0) // Sector 0: 当(αU ,βU ) = (0,0) {v->Ta = _IQ(0.5); v->Tb = _IQ(0.5); v->Tc = _IQ(0.5); }if (Sector==1) // Sector 1: t1=Z 和 t2=Y (abc ---> Tb,Ta,Tc) {t1 = Vc;v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tbon = (1-t1-t2)/2v->Ta = v->Tb+t1; // taon = tbon+t1v->Tc = v->Ta+t2; // tcon = taon+t2 }else if (Sector==2) // Sector 2: t1=Y和t2=-X (abc ---> Ta,Tc,Tb) {t1 = Vb;t2 = -Va;v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // taon = (1-t1-t2)/2v->Tc = v->Ta+t1; // tcon = taon+t1v->Tb = v->Tc+t2; // tbon = tcon+t2 }else if (Sector==3) // Sector 3: t1=-Z和t2=X (abc ---> Ta,Tb,Tc) {t1 = -Vc;t2 = Va;v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // taon = (1-t1-t2)/2v->Tb = v->Ta+t1; // tbon = taon+t1v->Tc = v->Tb+t2; // tcon = tbon+t2 }else if (Sector==4) // Sector 4: t1=-X和t2=Z (abc ---> Tc,Tb,Ta) {t1 = -Va;t2 = Vc;v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tcon = (1-t1-t2)/2v->Tb = v->Tc+t1; // tbon = tcon+t1v->Ta = v->Tb+t2; // taon = tbon+t2 }else if (Sector==5) // Sector 5: t1=X和t2=-Y (abc ---> Tb,Tc,Ta) {t1 = Va;v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tbon = (1-t1-t2)/2v->Tc = v->Tb+t1; // tcon = tbon+t1v->Ta = v->Tc+t2; // taon = tcon+t2 }else if (Sector==6) // Sector 6: t1=-Y和t2=-Z (abc ---> Tc,Ta,Tb){t1 = -Vb;t2 = -Vc;v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tcon = (1-t1-t2)/2v->Ta = v->Tc+t1; // taon = tcon+t1v->Tb = v->Ta+t2; // tbon = taon+t2 }// Convert the unsigned GLOBAL_Q format (ranged (0,1))// -> signed GLOBAL_Q format (ranged (-1,1))v->Ta = _IQmpy(_IQ(2.0),(v->Ta-_IQ(0.5)));v->Tb = _IQmpy(_IQ(2.0),(v->Tb-_IQ(0.5)));v->Tc = _IQmpy(_IQ(2.0),(v->Tc-_IQ(0.5)));}。

相关文档
最新文档