xiaoqiang010203 发表于 2011-6-24 13:39

求助2812矢量控制原程序区间判断说明

void svgendq_calc(SVGENDQ *v)
{      

      _iq Va,Vb,Vc,t1,t2;
      _iq 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->Ualfa);/* 0.8660254 = sqrt(3)/2 */
    Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualfa);/* 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->Ualfa);   /* Y = Vb */
    Vc = _IQmpy(_IQ(0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualfa);   /* Z = Vc */
      
    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 */
    }
      
    v->Ta = _IQmpy(_IQ(2),(v->Ta- _IQ(0.5)));//_IQ(0.5)
    v->Tb = _IQmpy(_IQ(2),(v->Tb- _IQ(0.5)));//_IQ(0.5)
    v->Tc = _IQmpy(_IQ(2),(v->Tc- _IQ(0.5))); //_IQ(0.5)      

}
程序判断区间克拉克逆变换时使用_IQ(-0.5),但是后来计算导通时间时使用_IQ(0.5),为什么?

我认为这个程序首先进行了两相坐标到三相坐标的变化后,根据三相坐标中Va、Vb、Vc的值来判断电压矢量在哪个区间。但是区间判断的过程及IGBT的导通时间确定没有看懂,请各位老师指教。谢谢!

olaole 发表于 2011-6-24 14:39

这是TI官网上面的吗?可以把官网的这个文档传上来可以么

xiaoqiang010203 发表于 2011-6-24 16:08

回复 2# olaole
以上两个分别为区间判断、IGBT导通时间计算程序,一个是头文件。

xiaoqiang010203 发表于 2011-6-24 16:09

回复 2# olaole

xiaoqiang010203 发表于 2011-6-24 16:09

附件传不上去啊

olaole 发表于 2011-6-24 22:16

你告诉我个网址我去下,或者你把他们先弄成压缩包

amazinghit 发表于 2011-6-25 10:41

判断扇区的时候系数就是负的,IQ(A,B)是乘法。
你是想知道怎么推出来的为什么是-0.5?
如果换个角度,你自己随便搞几个矢量,然后按这个计算方法顺着算一下,然后你发现是对的。

6楼可以自己去TI的网站找,有PMSM_X,X有若个个数值,针对不同电机、不同位置传感器的程序。不过好像都是定点运算的程序。

pluto 发表于 2012-2-26 19:46

请参阅《TMS320*281*DSP应用系统设计》一书 P239

yunqian09 发表于 2012-2-27 09:09

百度搜索 svgen_dq.pdf
页: [1]
查看完整版本: 求助2812矢量控制原程序区间判断说明