laibawangzi 发表于 2012-1-2 16:03

帮忙解读一下TI svpwm 两电平的svgen_dq 的问题

#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
                                                                                                                                       
// Inverse clarke transformation
    Va = v->Ubeta;
    Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha);// 0.8660254 = sqrt(3)/2
    Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha);// 0.8660254 = sqrt(3)/2

// 60 degree Sector determination
    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) calculations
    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 = Vc
   
    if (Sector==0)// Sector 0: this is special case for (Ualpha,Ubeta) = (0,0)
    {
       v->Ta = _IQ(0.5);
       v->Tb = _IQ(0.5);
       v->Tc = _IQ(0.5);
    }
    if (Sector==1)// Sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc)
    {
       t1 = Vc;
       t2 = Vb;
       v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      // tbon = (1-t1-t2)/2
       v->Ta = v->Tb+t1;                           // taon = tbon+t1
       v->Tc = v->Ta+t2;                           // tcon = taon+t2
    }
    else if (Sector==2)// Sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb)
    {
       t1 = Vb;
       t2 = -Va;
       v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      // taon = (1-t1-t2)/2
       v->Tc = v->Ta+t1;                           // tcon = taon+t1
       v->Tb = v->Tc+t2;                           // tbon = tcon+t2
    }      
    else if (Sector==3)// Sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc)
    {
       t1 = -Vc;
       t2 = Va;
       v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      // taon = (1-t1-t2)/2
       v->Tb = v->Ta+t1;                           // tbon = taon+t1
       v->Tc = v->Tb+t2;                           // tcon = tbon+t2
    }   
    else if (Sector==4)// Sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta)
    {
       t1 = -Va;
       t2 = Vc;
       v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      // tcon = (1-t1-t2)/2
       v->Tb = v->Tc+t1;                           // tbon = tcon+t1
       v->Ta = v->Tb+t2;                           // taon = tbon+t2
    }   
    else if (Sector==5)// Sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta)
    {
       t1 = Va;
       t2 = -Vb;
       v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      // tbon = (1-t1-t2)/2
       v->Tc = v->Tb+t1;                           // tcon = tbon+t1
       v->Ta = v->Tc+t2;                           // taon = tcon+t2
    }   
    else if (Sector==6)// Sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb)
    {
       t1 = -Vb;
       t2 = -Vc;
       v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      // tcon = (1-t1-t2)/2
       v->Ta = v->Tc+t1;                           // taon = tcon+t1
       v->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)));      

}

park反变换的用来扇区判断的Va Vb Vc 与下面的 (Va Vb Vc )X Y Z 有冲突吗? 个人感觉不是同一个量,所以给改了         _iq Va1,Vb1,Vc1,Va,Vb,Vc,t1,t2;
        Uint32 Sector = 0;                                        
// Inverse clarke transformation
    Va1 = v->Ubeta;
    Vb1 = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha);// 0.8660254 = sqrt(3)/2
    Vc1 = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha);//
程序最后的限幅把Ta Tb Tc限制在(-1,1),T能是负的吗?直接乘2可以吗?

626306788 发表于 2012-1-3 18:56

新手{:1_432:}帮顶一下

yunqian09 发表于 2012-1-5 13:17

ti有文档的,这些程序和文档是一一对应的

laibawangzi 发表于 2012-1-7 09:26

回复 3# yunqian09


    文档看了,只是有一部分,最下面的这个程序没有,还有的都错了。

laibawangzi 发表于 2012-1-7 09:33

回复 3# yunqian09


    文档看了,只是有一部分,最下面的这个程序没有,还有的都错了。

laibawangzi 发表于 2012-1-7 09:33

回复 3# yunqian09


    文档看了,只是有一部分,最下面的这个程序没有,还有的都错了。

小桐 发表于 2012-6-4 20:13

回复 1# laibawangzi
请问楼主,现在这段程序看懂了吗?我最近也在看TI的PMSM程序,我也存在疑惑,求指点

绿皮青蛙 发表于 2012-6-5 13:48

这个东西我自己推导了一次,TI是用的恒幅值变换,你可以把那些三相,两相用三角函数表示出来,然后把那些公式自己推一次,我之前推出来的和TI的不一样,可后来才明白他的U0是VW->U而我的是U->VW,其他的U1 U2 U3 U4 U5 U6也都反了。我之前把推导的内容都贴出来了,结果没有一个人回答,不晓得是大家都没推导过还是高手没出现。后来还是自己把自己的推导跑出程序来了,验证是正确的自己解决的。建议还是自己推导。很难有人能帮助到你。不用回复我了。

gouyouwen1 发表于 2012-6-6 22:51

能不能把你的推导给我发一份谢谢,182387632@qq.com
页: [1]
查看完整版本: 帮忙解读一下TI svpwm 两电平的svgen_dq 的问题