将此时的AD值作为三相电压的ADC采集硬件偏移。
//50%PWM
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD/2;
EPwm2Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD/2;
EPwm3Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD/2;
#define V_A_offset (0.1637)
#define V_B_offset (0.166)
#define V_C_offset (0.1637)
对控制器的硬件偏移量进行补偿。
_iq value = (_iq)AdcResult.ADCRESULT4;
Vars.VoltU = _IQ12mpy(value,_IQ(USER_VOLTAGE_SF)) - _IQ(V_A_offset); // divide by 2^numAdcBits = 2^12
value = (_iq)AdcResult.ADCRESULT5;
Vars.VoltV = _IQ12mpy(value,_IQ(USER_VOLTAGE_SF)) - _IQ(V_B_offset);
value = (_iq)AdcResult.ADCRESULT6;
Vars.VoltW = _IQ12mpy(value,_IQ(USER_VOLTAGE_SF)) - _IQ(V_C_offset);
进而输出频率为277Hz的高频电流信号。
if(Parameterstudy.hf == 1)
{
Gamma += 10;//(360/K_HIGHFREQ)=360/33.33;//300Hz的频率每100us角度增加
if(Gamma >= 360) Gamma -= 360;
Vars.AngleE = _IQdiv(Gamma,360);
Vars.wt = Vars.AngleE;
Vars.AngleE1 = Vars.AngleE;
}
输入电机电流角度
if(Parameterstudy.Lhfstarflg == 1)
{
//Lhf学习
Vars.IdRef = Vars.IsRefFil;
Vars.IqRef = 0;
}
并计算出复阻抗,进而计算出电机等效电感。
if(LsTime > 80000) //大于8s 电流电压趋于稳定
{
Parameterstudy.MotState = 2; //开始计算
Parameterstudy.U_fai = atan(abs(Parameterstudy.fft_b) /abs( Parameterstudy.fft_a)); //高频电压角度值
Parameterstudy.C_fai = atan(Parameterstudy.fft_b_c/ Parameterstudy.fft_a_c); //高频电流角度值
Parameterstudy.fai = (Parameterstudy.U_fai*1000 - Parameterstudy.C_fai*1000 + 370.0)/1000.0; //0.244 14du (14+10)/360*2PAI 角度
Parameterstudy.Z = (Parameterstudy.fft_v*1000/Parameterstudy.fft_v_c)/1000.0*53.33*0.8; //800/15 = 53.33 复阻抗
if(zfaicnt < 1500 && zfai_once == 0)
{
faiFil += Parameterstudy.fai;
ZFil += Parameterstudy.Z;
zfaicnt++;
}
else
{
zfaicnt = 0;
zfai_once = 1;
Parameterstudy.faiFil = faiFil /1500.0;
Parameterstudy.ZFil = ZFil/1500.0;
Parameterstudy.sin_fai = sin(Parameterstudy.faiFil);
Parameterstudy.cos_fai = cos(Parameterstudy.faiFil);
Parameterstudy.Lhf = abs(Parameterstudy.ZFil*Parameterstudy.sin_fai*574); //574=1/(2pai*277)*1000 000 uH
Parameterstudy.Rhf = abs(Parameterstudy.ZFil*Parameterstudy.cos_fai*1000); //
Parameterstudy.LhfFil = Parameterstudy.Lhf;
}
}
4.2.3 定子电阻辨识
Vars.AngleE = 0;
Vars.AngleE1 = (Vars.AngleE + _IQmpy(Vars.N, Vars.KiParkComp))& 0xffffff;//加角度补偿
Vars.AngleE1 = 0;
else if(Parameterstudy.Rstarflg == 1)
{
// Rs学习
Vars.IdRef = - Vars.IsRefFil;
Vars.IqRef = 0;
}
对电机定子电阻进行计算。
if(Parameterstudy.Rstarflg == 1)//R辨识
{
RsTime++;
if(FFTCount < 20000)
{
FFTCount++;
}
else if(FFTCount <35000 )
{
voltu = Vars.VoltU>>12;
voltu1 = (float)voltu/15000.0;
VoltU += voltu1;
FFTCount++;
}
else
{
Parameterstudy.fft_Ru = VoltU/4096.0*800.0;
VoltU = 0;
FFTCount = 0;
}
}
计算反馈电压
if(RsTime > 40000)//大于2S
{
Parameterstudy.MotState = 2; //开始计算
Parameterstudy.fft_dertV = Parameterstudy.fft_Ru;
Parameterstudy.fft_Rs = Parameterstudy.fft_dertV/2.0*1000;//*1000/2121.0/2.0*24.4 = 5.752 mΩ
Macro_LPF(Parameterstudy.fft_Rs,Parameterstudy.fft_RsFil,0.02);
if(RsTime > 50000)//大于3S
{
Parameterstudy.MotState = 3; //开始判断
if(Parameterstudy.fft_Rs/Parameterstudy.fft_RsFil > 0.9 && Parameterstudy.fft_Rs/Parameterstudy.fft_RsFil < 1.1)
{
Parameterstudy.MotState = 4; //开始赋值
if(Parameterstudy.RsWriteFlg == 1)
{
UserParm.Var.Rs = abs(Parameterstudy.fft_RsFil);//
UserParm.Sts.Rs = PARM_WRITING;
if(RsTime > 70000)//大于3S
{
PWMONFirst = 1;
OutOff();
RsTime = 0;
Parameterstudy.Rsoverflg = 1;
Parameterstudy.RsWriteFlg = 0;
KpKiStudy();
}
}
}
}
对电机的转子磁链进行计算。
case 3:
{
Parameterstudy.MotState = 3;//等待2S 记下Vq1
if(StudyTimerCnt < 5000)//T=200us==>2s
{
StudyTimerCnt++;
}
else
{
StudyTimerCnt = 0;
Parameterstudy.Vq1 = _IQmpy(Vars.VqRef,UNORMAL);
Parameterstudy.Wmg1 = (float)UserParm.Var.MotPolePairs*Parameterstudy.Speed1*0.10497;// W = 2πφ 2*3.1415/60 = 0.10497
Parameterstudy.FluxLink = (Parameterstudy.Vq1)/Parameterstudy.Wmg1/10.0/1.732;
if (Parameterstudy.FluxLink != UserParm.Var.FluxLink)
{
UserParm.Var.FluxLink = Parameterstudy.FluxLink*10000;//
UserParm.Sts.FluxLink = PARM_WRITING;
}
RotLnfStudyStep = 6;
}
break;
}
将五次辨识结果取均值,写入数据中。¬
case 1://
{
j = Parameterstudy.i;
Parameterstudy.MotState = 1;//等待启动
if(speed[j]*0.80 < Parameterstudy.Speed1)
{
RotTeStudyStep = 1;
IqRefTemp = TeSave1[j]*0.70;
}
else
{
RotTeStudyStep = 2;
Parameterstudy.Time = 0;
}
break;
}
case 2://
{
j = Parameterstudy.i;
Parameterstudy.MotState = 2;//等待启动
if(speed[j]*1.2 > Parameterstudy.Speed1)
{
Parameterstudy.Time++;
RotTeStudyStep = 2;
IqRefTemp = TeSave1[j]*1.2;
Parameterstudy.Speed = speed[j];
if(Parameterstudy.Speed1 <= speed[j])
{
a1[j] = Parameterstudy.a; //实时加速度记录
}
}
else
{
RotTeStudyStep = 3;
Time[j] = Parameterstudy.Time; //记录时间
Parameterstudy.a = Parameterstudy.Speed/Parameterstudy.Time*1000.0/6.0; //换算成秒级加速度
a[j] = Parameterstudy.a; //记录加速度
Parameterstudy.Iq = _IQ12mpy(TeSave1[j],INORMAL); //标幺 值*4096 保证精度
Iq[j] = Parameterstudy.Iq; //记录Iq
p = UserParm.Var.MotPolePairs;
Parameterstudy.FluxLink = UserParm.Var.FluxLink;
Parameterstudy.Te = 1.5*p*Parameterstudy.FluxLink*Parameterstudy.Iq*0.2 ; //Te=1.5p(λmiq+(Ld-Lq)idiq 0.2是扭矩差
Te[j] = Parameterstudy.Te; //记录扭矩差
Parameterstudy.Inertia = Parameterstudy.Te/Parameterstudy.a;
Inertia[j] = Parameterstudy.Inertia; //记录转动惯量
}
break;
}
转动惯量辨识速度点及加速度记录
在这里插入代码片