- 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)
-
- }