TI中文支持网
TI专业的中文技术问题搜集分享网站

28377s一个例程中的svgen.h文件判断扇区的逻辑不太懂

大家好:

        最近在做交流电机控制的时候,发现svgen.h里判断扇区,及对Ta,Tb,Tc的赋值部分不太懂,希望懂的朋友们能帮忙分析下:之前看过28335中的相关部分程序,感觉逻辑思路很容易就看懂了,下面分别发下两个程序:

svgen.h,这个不太看得懂;

#define SVGENDQ_MACRO(v)                                                        \
    v.tmp1= v.Ubeta;                                                            \
    v.tmp2= _IQdiv2(v.Ubeta) + (_IQmpy(_IQ(0.8660254),v.Ualpha));                    \
    v.tmp3= v.tmp2 – v.tmp1;                                                    \
                                                                                \
    v.VecSector=3;                                                                \
    v.VecSector=(v.tmp2> 0)?( v.VecSector-1):v.VecSector;                        \
    v.VecSector=(v.tmp3> 0)?( v.VecSector-1):v.VecSector;                        \
    v.VecSector=(v.tmp1< 0)?(7-v.VecSector) :v.VecSector;                        \
                                                                                \
    if     (v.VecSector==1 || v.VecSector==4)                                   \
      {     v.Ta= v.tmp2;                                                         \
              v.Tb= v.tmp1-v.tmp3;                                                 \
              v.Tc=-v.tmp2;                                                        \
      }                                                                            \
                                                                                   \
    else if(v.VecSector==2 || v.VecSector==5)                                   \
      {     v.Ta= v.tmp3+v.tmp2;                                                 \
              v.Tb= v.tmp1;                                                         \
              v.Tc=-v.tmp1;                                                        \
      }                                                                               \
                                                                                   \
    else                                                                        \
      {     v.Ta= v.tmp3;                                                         \
              v.Tb=-v.tmp3;                                                         \
              v.Tc=-(v.tmp1+v.tmp2);                                                \
      }                                                                               \
                                                                                \

#endif // __SVGEN_H__

svgendq.h

void svgendq_calc(SVGENDQ *v)
{    

    float Va,Vb,Vc,t1,t2;
    unsigned int Sector = 0;        // Inverse clarke transformation  clark反变换将Ualpha.Ubeta->Ua Ub Uc
    Va = v->Ubeta;
    Vb = -0.5 * v->Ubeta + 0.8660254 * v->Ualpha;        // 0.8660254 = sqrt(3)/2
    Vc = -0.5 * v->Ubeta – 0.8660254 * v->Ualpha;        // 0.8660254 = sqrt(3)/2

// 60 degree Sector determination
//  (1)确定合成矢量 所在扇区。参考基于TMS320F28335的五段式和七段式SVPWM实现方法_郭寅远
    if (Va>0)
        Sector = 1;    if (Vb>0)
        Sector = Sector + 2;
    if (Vc>0)   
        Sector = Sector + 4;
       
// X,Y,Z (Va,Vb,Vc) calculations
    Va = v->Ubeta;                                        // X = Va    Vb = 0.5 * v->Ubeta + 0.8660254 * v->Ualpha;        // Y = Vb    Vc = 0.5 * v->Ubeta – 0.8660254 * v->Ualpha;        // Z = Vc
    
    if (Sector==0)  // Sector 0: this is special case for (Ualpha,Ubeta) = (0,0)
    {
        v->Ta = 0.5;
        v->Tb = 0.5;
        v->Tc = 0.5;
    }
    else if (Sector==1)  // Sector 1: t1=Z and t2=Y (abc —> Tb,Ta,Tc),U60,U120
    {
        t1 = Vc;
        t2 = Vb;
        if(t1+t2 > 1)
        {
            t1 = t1/(t1+t2);
            t2 = 1-t1;                
        }        
        v->Tb = 0.5*(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),U300,U0
    {
        t1 = Vb;
        t2 = -Va;
        if(t1+t2 > 1)
        {
            t1 = t1/(t1+t2);
            t2 = 1-t1;                
        }           
       v->Ta = 0.5*(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),U0,U60
    {
        t1 = -Vc;
        t2 = Va;
        if(t1+t2 > 1)
        {
            t1 = t1/(t1+t2);
            t2 = 1-t1;                
        }        
        v->Ta = 0.5*(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),U180,U240
    {
        t1 = -Va;
        t2 = Vc;
        if(t1+t2 > 1)
        {
            t1 = t1/(t1+t2);
            t2 = 1-t1;                
        }        
        v->Tc = 0.5*(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),U120,U180
    {
        t1 = Va;
        t2 = -Vb;
        if(t1+t2 > 1)
        {
            t1 = t1/(t1+t2);
            t2 = 1-t1;                
        }       
        v->Tb = 0.5*(1-t1-t2);            // tbon = (1-t1-t2)/2
        v->Tc = v->Tb+t1;                // tcon = tbon+t1
        v->Ta = v->Tc+t2;                // taon = tcon+t2

//        v->Tc = 0.5*(1-t1-t2);            // tcon = (1-t1-t2)/2
//        v->Ta = v->Tc+t1;                // taon = tcon+t1
//        v->Tb = v->Ta+t2;                // tbon = taon+t2

    }   
    else if (Sector==6)  // Sector 6: t1=-Y and t2=-Z (abc —> Tc,Ta,Tb),U0,U60
    {
        t1 = -Vb;
        t2 = -Vc;
        if(t1+t2 > 1)
        {
            t1 = t1/(t1+t2);
            t2 = 1-t1;                
        }           
        v->Tc = 0.5*(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->Tb = 0.5*(1-t1-t2);            // tbon = (1-t1-t2)/2
//        v->Tc = v->Tb+t1;                // tcon = tbon+t1
//        v->Ta = v->Tc+t2;                // taon = tcon+t2
    }
    
// Convert the unsigned format (ranged (0,1)) -> signed format (ranged (-1,1))
//    v->Ta = 2 * (v->Ta – 0.5);
//    v->Tb = 2 * (v->Tb – 0.5);
//    v->Tc = 2 * (v->Tc – 0.5);
}

这个是一个一个判断然后赋值的就比较容易懂;

赞(0)
未经允许不得转载:TI中文支持网 » 28377s一个例程中的svgen.h文件判断扇区的逻辑不太懂
分享到: 更多 (0)