Q格式的SVPWM的马鞍波形

#define IPARK(v)                                        \
                                                            \
v.Valpha = _IQmpy(v.VdRef,v.Cos) - _IQmpy(v.VqRef,v.Sin);        \
v.Vbeta  = _IQmpy(v.VqRef,v.Cos) + _IQmpy(v.VdRef,v.Sin);


#define SVPWM(v)                                                            \
                                                                                \
    v.sector = 0;                                                                    \
    v.temp_sv1=_IQdiv2(v.Vbeta);                     /*divide by 2*/                    \
    v.temp_sv2=_IQmpy(_IQ(0.8660254),v.Valpha);    /* 0.8660254 = sqrt(3)/2*/        \
                                                                                \
/* Inverse clarke transformation */                                                \
    v.Va = v.Vbeta;                                                                \
    v.Vb = -v.temp_sv1 + v.temp_sv2;                                                    \
    v.Vc = -v.temp_sv1 - v.temp_sv2;                                                    \
/* 60 degree Sector determination */                                            \
    if (v.Va>_IQ(0)) v.sector = 1;                                                    \
    if (v.Vb>_IQ(0)) v.sector = v.sector+2;                                            \
    if (v.Vc>_IQ(0)) v.sector = v.sector+4;                                            \
/* X,Y,Z (Va,Vb,Vc) calculations X = Va, Y = Vb, Z = Vc */                        \
    v.Va = v.Vbeta;                                                                \
    v.Vb = v.temp_sv1 + v.temp_sv2;                                                    \
    v.Vc = v.temp_sv1 - v.temp_sv2;                                                    \
/* Sector 0: this is special case for (Ualpha,Ubeta) = (0,0)*/                    \
switch(v.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)*/                    \
        v.t1 = v.Vc;                                                                    \
        v.t2 = v.Vb;                                                                    \
        v.Tb=_IQdiv2((_IQ(1)-v.t1-v.t2));                                                 \
        v.Ta = v.Tb+v.t1;                 /* taon = tbon+t1        */                        \
        v.Tc = v.Ta+v.t2;                  /* tcon = taon+t2        */                        \
    break;                                                                        \
    case 2:      /* Sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb)*/                 \
        v.t1 = v.Vb;                                                                    \
        v.t2 = -v.Va;                                                                    \
        v.Ta=_IQdiv2((_IQ(1)-v.t1-v.t2));                                                 \
        v.Tc = v.Ta+v.t1;                /*  tcon = taon+t1        */                        \
        v.Tb = v.Tc+v.t2;                /*  tbon = tcon+t2        */                        \
    break;                                                                        \
    case 3:      /* Sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc)*/                    \
        v.t1 = -v.Vc;                                                                    \
        v.t2 = v.Va;                                                                    \
        v.Ta=_IQdiv2((_IQ(1)-v.t1-v.t2));                                                 \
        v.Tb = v.Ta+v.t1;                /*    tbon = taon+t1        */                        \
        v.Tc = v.Tb+v.t2;                /*    tcon = tbon+t2        */                        \
    break;                                                                        \
    case 4:      /* Sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta)*/                    \
        v.t1 = -v.Va;                                                                    \
        v.t2 = v.Vc;                                                                    \
        v.Tc=_IQdiv2((_IQ(1)-v.t1-v.t2));                                                 \
        v.Tb = v.Tc+v.t1;                /*    tbon = tcon+t1        */                        \
        v.Ta = v.Tb+v.t2;                /*    taon = tbon+t2        */                        \
    break;                                                                        \
    case 5:      /* Sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta)*/                    \
        v.t1 = v.Va;                                                                    \
        v.t2 = -v.Vb;                    /*    tbon = (1-t1-t2)/2    */                        \
        v.Tb=_IQdiv2((_IQ(1)-v.t1-v.t2));                                                 \
        v.Tc = v.Tb+v.t1;                /*    taon = tcon+t2        */                        \
        v.Ta = v.Tc+v.t2;                                                                \
    break;                                                                        \
    case 6:      /* Sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb)*/                \
        v.t1 = -v.Vb;                                                                    \
        v.t2 = -v.Vc;                                                                    \
        v.Tc=_IQdiv2((_IQ(1)-v.t1-v.t2));                                                 \
        v.Ta = v.Tc+v.t1;                /*    taon = tcon+t1        */                        \
        v.Tb = v.Ta+v.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));

EPwm1Regs.CMPA.half.CMPA= _IQmpy(HalfPWM_TB_PERIOD,myFoc.Ta)+HalfPWM_TB_PERIOD;
            EPwm2Regs.CMPA.half.CMPA= _IQmpy(HalfPWM_TB_PERIOD,myFoc.Tb)+HalfPWM_TB_PERIOD;
            EPwm3Regs.CMPA.half.CMPA= _IQmpy(HalfPWM_TB_PERIOD,myFoc.Tc)+HalfPWM_TB_PERIOD;

通过按键产生一个事件,printf数据CMPA,把串口接收到的数据复制到excel,绘制出马鞍波波形。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值