Thread 中讨论的其他器件:controlSUITE
尊敬的 TI 社区:
我尝试使用 FOC 技术控制 PMSM。
我从一个示例项目"无传感器28335"开始、并进行了一些修改。
我为电流和速度环路、QEP 模块(4096条编码器线路)、速度宏使用了 PI 控制器。。
lsw = 0,转子移动一个位,然后被锁定:磁场在 d 轴上定向。
qep1.calibratedAngle 等于 0。
lsw = 1:当我使用 park.angle = rg1.out 时,转子会旋转,但 rg1.out 和 qep1.thetaElectric 之间有很大的差异。
对于 park.angle=qep1.Thetaelectric、在这种情况下、转子保持锁定状态不会旋转。
我的程序如下所示,
----------------------------------------------------
if (lsw = 0) RC1.targetValue = 0;
否则 RC1.targetValue = spdrF1;//1.
RC_MACRO (RC1)
//----------------------------------
// 连接斜坡生成模块的输入并调用斜坡生成器宏
//----------------------------------
rg1.Freq = RC1.SetpointValue;
RG_MACRO (rg1)
//校准角度
如果(lsw = 0){EQep1Regs.QPOSCNT=0;EQep1Regs.QCLR.bit.IEL = 1;}//重置位置 cnt。
if (((EQep1Regs.QDLG.bit.IEL=1)&& Init_IFlag=0)//检查第一次出现的索引
{qep1.CalibratedAngle= EQep1Regs.QPOSILAT;Init_IFlag++;}//保持锁存位置
if (lsw!=0) QEP_MACRO (qep1);
//----------------------------------
// 测量相电流、减去偏移并将其从(-0.5、+0.5)标准化为(-1、+1)。
// 连接 Clarke 模块的输入并调用 Clarke 变换宏
//----------------------------------
clarke1.as=(AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;//相位 A 电流
clarke1.B=(AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909;//相位 B 电流
Clarke_macro (clarke1)
//----------------------------------
// 连接驻车模块的输入并调用驻车变速器。 宏
//----------------------------------
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
if (lsw = 0) park1.Angle = 0;
否则、如果(lsw = 1) park1.Angle = qep1.ElecTheta;//rg1.Out;//
park1.sine =_IQsincu (park1.Angle);
park1.Cosine =_IQcosPU (park1.Angle);
PARK_MACRO (park1)
//----------------------------------
// 调用 QEP 计算模块
//----------------------------------
QEP_MACRO (1、qep1);
//----------------------------------
// 连接 SPEED_FR 模块的输入并调用速度计算宏
//----------------------------------
speed1.ElecTheta = qep1.ElecTheta;
speed1.DirectionQep =(Int32)(qep1.DirectionQep);
SPEED_FR_MACRO (speed1)
//----------------------------------
// 连接 PI 的速度输入
//----------------------------------
if (SpeedLoopCount=SpeedLoopPrescaler){
pi_spd.Ref = RC1.SetpointValue;
pi_spd.fbk = speed1.Speed;
pi_macro (pi_spd);
SpeedLoopCount=1;
}
否则{
SpeedLoopCount= SpeedLoopCount+1;
}
//----------------------------------
// 连接 PI 模块的输入并调用 PI IQ 控制器宏
//----------------------------------
if (lsw = 0) pi_iq.Ref = 0;
否则、如果(lsw = 1) pi_iq.Ref = pi_spd.out;//_iq (0.1);//
pi_iq.fbk = park1.qs;
pi_macro (pi_iq)
//----------------------------------
// 连接 PI 模块的输入并调用 PI ID 控制器宏
//----------------------------------
if (lsw = 0) pi_id.Ref =_IQ (0.05);
否则 pi_id.Ref = IDREF;
pi_id.fbk = park1.ds;
pi_macro (pi_id)
//----------------------------------
// 连接 INV_PARK 模块的输入并调用逆向 Park 转换。 宏
//----------------------------------
ipark1.ds = pi_id.out;
ipark1.qs = pi_iq.out;
ipark1.sine = park1.sine;
ipark1.Cosine = park1.Cosine;
IPark_MACRO (ipark1)
//----------------------------------
// 连接 SVGEN_DQ 模块的输入并调用空间矢量发生器。 宏
//----------------------------------
svgen1.Ualpha = ipark1.Alpha;
svgen1.Ubeta = ipark1.Beta;
SVGENDQ_MACRO (svgen1)
//----------------------------------
// 连接 PWM_DRV 模块的输入并调用 PWM 信号生成宏
//----------------------------------
pwm1.Mfunc1 = svgen1.Ta;
pwm1.MfuncC2 = svgen1.tb;
pwm1.MfuncC3 = svgen1.tc;
PWM_MACRO (1、2、3、pwm1) //计算新的 PWM 比较值
//----------------------------------
// 连接 PWMDAC 模块的输入
//----------------------------------
pwmdac1.Mfunc1 = clarke1.as;
pwmdac1.MfuncC2 = clarke1.B;
PWMDAC_MACRO (6、pwmdac1) // PWMDAC 6A、6B
pwmdac1.Mfunc1 = qep1.ElecTheta;
pwmdac1.MfuncC2 = svgen1.tB-svgen1.tc;
PWMDAC_MACRO (7、pwmdac1) // PWMDAC 7A、7B
//----------------------------------
// 连接数据记录模块的输入
//----------------------------------
DlogCh1 =_IQtoQ15 (clarke1.As);
DlogCh2 =_IQtoQ15 (clarke1.Bs);
DlogCh3 =_IQtoQ15 (qep1.ElecTheta);
DlogCh4 =_IQtoQ15 (rg1.out);
请帮帮我。
此致、