FOC的PI调节和SVPWM

void PI_Process(void)                   //一阶滤波函数
{
    ialfa=ia;
    ibeta=_IQmpy(ia,_IQ(0.57735026918963))+_IQmpy(ib,_IQ(1.15470053837926));   //3/2变换

    id = _IQmpy(ialfa,Cosine) +_IQmpy(ibeta,Sine);
    iq = _IQmpy(ibeta,Cosine)- _IQmpy(ialfa,Sine) ;            //2/2变换
//======================================================================================================
//IQ电流PID调节控制
//======================================================================================================
    IQ_Ref=_IQdiv(_IQ(IQref),_IQ(E_Ding_DianLiu));//IQref为摇杆反馈的值,比上额定电流值变成标幺值,IQ_Ref为标幺值

    IQ_Ref_fil=_IQmpy(_IQ(0.2),IQ_Ref_fil)+_IQmpy(_IQ(0.8),IQ_Ref);         //目标值
    IQ_Fdb_fil=_IQmpy(_IQ(0.2),IQ_Fdb_fil)+_IQmpy(_IQ(0.8),iq);             //实际反馈值
    IQ_read=_IQmpy(IQ_Fdb_fil,_IQ(E_Ding_DianLiu));
    IQ_read=_IQmpy(IQ_read,_IQ(0.70721356));


    IQ_Error=IQ_Ref_fil - IQ_Fdb_fil;                                       //本次误差
    IQ_Error_read=_IQmpy(IQ_Error,_IQ(E_Ding_DianLiu));
    IQ_Error_error=IQ_Error - IQ_Error_before;                              //误差积分

    IQ_Up=_IQmpy(IQ_Kp,IQ_Error_error);
    IQ_Ui=_IQmpy(IQ_Ki,IQ_Error);
    IQ_Out_deta=IQ_Up  + IQ_Ui;

    IQ_Out=IQ_Out_before + IQ_Out_deta;

    IQ_OutMax=_IQ(2.8);        //电流限幅  原值3.0 限幅值0.3
    IQ_OutMin=_IQ(-2.8);

    if(IQ_Out>IQ_OutMax)     //正相限幅
    {
        IQ_Out=IQ_OutMax;
    }

    else if(IQ_Out<IQ_OutMin)      //反相限幅
    {
        IQ_Out=IQ_OutMin;
    }

    else
    {
        IQ_Out=IQ_Out;
    }


    IQ_Out_before=IQ_Out;
    IQ_Error_before=IQ_Error;
    IQ_Fdb_fil_before=IQ_Fdb_fil;
    Uq=IQ_Out;

//======================================================================================================
//ID电流PID调节控制
//======================================================================================================
    ID_Ref=_IQ(0.00);

    ID_Ref_fil=_IQmpy(_IQ(0.2),ID_Ref_fil)+_IQmpy(_IQ(0.8),ID_Ref);
    ID_Fdb_fil=_IQmpy(_IQ(0.2),ID_Fdb_fil)+_IQmpy(_IQ(0.8),id);
    ID_Fdb=id;
    ID_read=_IQmpy(ID_Fdb_fil,_IQ(E_Ding_DianLiu));
    ID_read=_IQmpy(ID_read,_IQ(0.70721356));
    ID_Error=ID_Ref_fil - ID_Fdb_fil ;
    ID_Error_read=_IQmpy(ID_Error,_IQ(4.2));
    ID_Error_error=ID_Error - ID_Error_before;    //误差积分

    ID_Up=_IQmpy(ID_Kp,ID_Error_error);
    ID_Ui=_IQmpy(ID_Ki,ID_Error);
    ID_Out_deta=ID_Up  + ID_Ui;
    ID_Out=ID_Out_before + ID_Out_deta;

    ID_OutMax=_IQ(2.5);
    ID_OutMin=_IQ(-2.5);

    if(ID_Out>ID_OutMax)        //正相限幅
    {
        ID_Out=ID_OutMax;
    }

    else if(ID_Out<ID_OutMin)    //反相限幅
    {
        ID_Out=ID_OutMin;
    }

    else
    {
        ID_Out=ID_Out;
    }


    ID_Out_before=ID_Out;
    ID_Error_before=ID_Error;
    ID_Fdb_old=ID_Fdb_fil;

    Ud=ID_Out;
/***PI滤波数据观测****/
    if(PI_Times<=200)
    {
        IQ_REF_WATCH[PI_Times]=IQ_Ref_fil;           //观测反馈的实际电流值数组
        IQ_OUT_WATCH[PI_Times]=IQ_Fdb_fil;             //观测目标电流值数组
        PI_Times++;
    }
    else PI_Times=0;
/***************************/
}

void SVPWM(void)      //SVPWM函数
{
    _iq t_01,t_02;
    //======================================================================================================
    //IPark变换aa
    //======================================================================================================
            Ualfa = _IQmpy(Ud,Cosine) - _IQmpy(Uq,Sine);
            Ubeta = _IQmpy(Uq,Cosine) + _IQmpy(Ud,Sine);

    //======================================================================================================
    //SVPWM实现
    //======================================================================================================
            B0=Ubeta;
            B1=_IQmpy(_IQ(0.8660254),Ualfa)- _IQmpy(_IQ(0.5),Ubeta);  // 0.8660254 = sqrt(3)/2
            B2=_IQmpy(_IQ(-0.8660254),Ualfa)- _IQmpy(_IQ(0.5),Ubeta); // 0.8660254 = sqrt(3)/2

            Sector=0;                //扇区判断
            if(B0>_IQ(0))
            {
                Sector =1;
            }

            if(B1>_IQ(0))
            {
                Sector =Sector +2;
            }

            if(B2>_IQ(0))
            {
                Sector =Sector +4;
            }


            X=Ubeta;//va
            Y=_IQmpy(_IQ(0.8660254),Ualfa)+ _IQmpy(_IQ(0.5),Ubeta);  // 0.8660254 = sqrt(3)/2 vb
            Z=_IQmpy(_IQ(-0.8660254),Ualfa)+ _IQmpy(_IQ(0.5),Ubeta); // 0.8660254 = sqrt(3)/2 vc


            if(Sector==1)
            {
                t_01=Z;
                t_02=Y;

                if((t_01+t_02)>_IQ(1))
                {
                    t1=_IQmpy(_IQdiv(t_01, (t_01+t_02)),_IQ(1));
                    t2=_IQmpy(_IQdiv(t_02, (t_01+t_02)),_IQ(1));
                }
                else
                {
                    t1=t_01;
                    t2=t_02;
                }
                Tb=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));
                Ta=Tb+t1;
                Tc=Ta+t2;
            }
            else if(Sector==2)
            {
                t_01=Y;
                t_02=-X;

                 if((t_01+t_02)>_IQ(1))
                {
                    t1=_IQmpy(_IQdiv(t_01, (t_01+t_02)),_IQ(1));
                    t2=_IQmpy(_IQdiv(t_02, (t_01+t_02)),_IQ(1));
                }
                else
                {
                    t1=t_01;
                    t2=t_02;
                }
                Ta=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));
                Tc=Ta+t1;
                Tb=Tc+t2;
            }
            else if(Sector==3)
            {
                t_01=-Z;
                t_02=X;

                 if((t_01+t_02)>_IQ(1))
                {
                    t1=_IQmpy(_IQdiv(t_01, (t_01+t_02)),_IQ(1));
                    t2=_IQmpy(_IQdiv(t_02, (t_01+t_02)),_IQ(1));
                }
                else
                {
                    t1=t_01;
                    t2=t_02;
                }
                Ta=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));
                Tb=Ta+t1;
                Tc=Tb+t2;
            }
            else if(Sector==4)
            {
                t_01=-X;
                t_02=Z;
                 if((t_01+t_02)>_IQ(1))
                {
                    t1=_IQmpy(_IQdiv(t_01, (t_01+t_02)),_IQ(1));
                    t2=_IQmpy(_IQdiv(t_02, (t_01+t_02)),_IQ(1));
                }
                else
                {
                    t1=t_01;
                    t2=t_02;
                }
                Tc=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));
                Tb=Tc+t1;
                Ta=Tb+t2;
            }
            else if(Sector==5)
            {
                t_01=X;
                t_02=-Y;
                 if((t_01+t_02)>_IQ(1))
                {
                    t1=_IQmpy(_IQdiv(t_01, (t_01+t_02)),_IQ(1));
                    t2=_IQmpy(_IQdiv(t_02, (t_01+t_02)),_IQ(1));
                }
                else
                {
                    t1=t_01;
                    t2=t_02;
                }
                Tb=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));
                Tc=Tb+t1;
                Ta=Tc+t2;
            }
            else if(Sector==6)
            {
                t_01=-Y;
                t_02=-Z;
                 if((t_01+t_02)>_IQ(1))
                {
                    t1=_IQmpy(_IQdiv(t_01, (t_01+t_02)),_IQ(1));
                    t2=_IQmpy(_IQdiv(t_02, (t_01+t_02)),_IQ(1));
                }
                else
                {
                    t1=t_01;
                    t2=t_02;
                }
                Tc=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));
                Ta=Tc+t1;
                Tb=Ta+t2;
            }

            MfuncD1=_IQmpy(_IQ(2),(_IQ(0.5)-Ta));//倒三角计算
            MfuncD2=_IQmpy(_IQ(2),(_IQ(0.5)-Tb));
            MfuncD3=_IQmpy(_IQ(2),(_IQ(0.5)-Tc));
    //======================================================================================================
    //EVA全比较器参数赋值,用于驱动电机
    //======================================================================================================
            MPeriod = (int16)(T1Period * Modulation);/*MPeriod = 3750 * 1 =3750 */
/*PWM1 占空比的赋值*/
            Tmp = (int32)MPeriod * MfuncD1;/*Tmp -3750~3750 */
            Tmp = (Tmp>>16) + (T1Period>>1);/*Tmp  -1875~1875 + 3750/2 = 0~3750*/
            /* PWM周期MPeriod 乘以 其占空比MfuncD1,得到比较寄存器的值,
             * 但因为此时的占空比经过范围变换处理,所以还不是真正的比较寄存器的值
             * Tmp 除以2,实现占空比由(-1,1)到(-0.5,0,5)的还原,
             * 然后右移15位,也就是取整,将该数从Q15格式转换成Q0格式,综合起来就是(Tmp>>16)
             * 然后加上0.5(对应MPeriod>>1)的偏移,把占空比还原到(0,1),此时的结果就是比较寄存器的值*/

            /*
            if(Tmp >MPeriod - 500)
                Tmp = MPeriod - 500;
            if(Tmp < 100) Tmp = 100;
            */

            EPwm1Regs.CMPA.half.CMPA = (int16)(Tmp) ;//>>16) + (int16)(T1Period>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)
/*PWM2 占空比的赋值*/
            Tmp = (int32)MPeriod * MfuncD2;                    // Q15 = Q0*Q15,计算全比较器CMPR2赋值      MduncD2去掉(int32)
            Tmp = (Tmp>>16) + (T1Period>>1);
            /*
            if(Tmp >MPeriod - 500)
                Tmp = MPeriod - 500;
            if(Tmp < 100) Tmp = 100;
            */
            EPwm2Regs.CMPA.half.CMPA = (int16)(Tmp);//>>16) + (int16)(T1Period>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)
/*PWM3 占空比的赋值*/
            Tmp = (int32)MPeriod * MfuncD3;                    // Q15 = Q0*Q15,计算全比较器CMPR3赋值     MduncD3去掉(int32)
            Tmp = (Tmp>>16) + (T1Period>>1);
            /*
            if(Tmp >MPeriod - 500)
                Tmp = MPeriod - 500;
            if(Tmp < 100) Tmp = 100;
            */
            EPwm3Regs.CMPA.half.CMPA = (int16)(Tmp);//>>16) + (int16)(T1Period>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值