在PMSM3-1中是如何计算初始角度的呢?
// —————————————————————————–
if(LockRotorFlag==TRUE) // locked rotor mode
{
// ——————————————————————————
// 链接 PARK 模块的输入 并且调用 park transformation 计算 函数 .
// ——————————————————————————
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Angle = 0;
park1.calc( & park1);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID IQ controller 计算 函数 .
// ——————————————————————————
pid1_iq.Ref = _IQ(IqRef);
pid1_iq.Fdb = park1.Qs;
pid1_iq.calc( & pid1_iq);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID ID controller 计算 函数 .
// ——————————————————————————
pid1_id.Ref = _IQ(IdRef);
pid1_id.Fdb = park1.Ds;
pid1_id.calc( & pid1_id);
// ——————————————————————————
// 链接 INV_PARK 模块的输入 并且调用 inverse park transformation 计算 函数 .
// ——————————————————————————
ipark1.Ds = pid1_id.Out;
ipark1.Qs = pid1_iq.Out;
ipark1.Angle = 0;
ipark1.calc( & ipark1);
}
// End: LockRotorFlag==TRUE
else if(LockRotorFlag==FALSE) // spinning mode
{
// spinning mode if LockRotorFlag = 0
// ——————————————————————————
// 链接 PARK 模块的输入 并且调用 park transformation 计算 函数 .
// ——————————————————————————
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Angle = rg1.Out;
park1.calc( & park1);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID IQ controller 计算 函数 .
// ——————————————————————————
pid1_iq.Ref = _IQ(IqRef);
pid1_iq.Fdb = park1.Qs;
pid1_iq.calc( & pid1_iq);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调 PID ID controller 计算 函数 .
// ——————————————————————————
pid1_id.Ref = _IQ(IdRef);
pid1_id.Fdb = park1.Ds;
pid1_id.calc( & pid1_id);
// ——————————————————————————
// 链接 INV_PARK 模块的输入 并且调用 inverse park transformation 计算 函数 .
// ——————————————————————————
ipark1.Ds = pid1_id.Out;
ipark1.Qs = pid1_iq.Out;
ipark1.Angle = rg1.Out;
ipark1.calc( & ipark1);
}
// End: LockRotorFlag==FALSE
Young Hu:
据我的了解,当lsw=0时,会把角度强制设置为0,那么转子会被拉到角度0去。
lsw=1时,锯齿波模块或者速度环加上,通过反电动势获取角度
在PMSM3-1中是如何计算初始角度的呢?
// —————————————————————————–
if(LockRotorFlag==TRUE) // locked rotor mode
{
// ——————————————————————————
// 链接 PARK 模块的输入 并且调用 park transformation 计算 函数 .
// ——————————————————————————
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Angle = 0;
park1.calc( & park1);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID IQ controller 计算 函数 .
// ——————————————————————————
pid1_iq.Ref = _IQ(IqRef);
pid1_iq.Fdb = park1.Qs;
pid1_iq.calc( & pid1_iq);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID ID controller 计算 函数 .
// ——————————————————————————
pid1_id.Ref = _IQ(IdRef);
pid1_id.Fdb = park1.Ds;
pid1_id.calc( & pid1_id);
// ——————————————————————————
// 链接 INV_PARK 模块的输入 并且调用 inverse park transformation 计算 函数 .
// ——————————————————————————
ipark1.Ds = pid1_id.Out;
ipark1.Qs = pid1_iq.Out;
ipark1.Angle = 0;
ipark1.calc( & ipark1);
}
// End: LockRotorFlag==TRUE
else if(LockRotorFlag==FALSE) // spinning mode
{
// spinning mode if LockRotorFlag = 0
// ——————————————————————————
// 链接 PARK 模块的输入 并且调用 park transformation 计算 函数 .
// ——————————————————————————
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Angle = rg1.Out;
park1.calc( & park1);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID IQ controller 计算 函数 .
// ——————————————————————————
pid1_iq.Ref = _IQ(IqRef);
pid1_iq.Fdb = park1.Qs;
pid1_iq.calc( & pid1_iq);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调 PID ID controller 计算 函数 .
// ——————————————————————————
pid1_id.Ref = _IQ(IdRef);
pid1_id.Fdb = park1.Ds;
pid1_id.calc( & pid1_id);
// ——————————————————————————
// 链接 INV_PARK 模块的输入 并且调用 inverse park transformation 计算 函数 .
// ——————————————————————————
ipark1.Ds = pid1_id.Out;
ipark1.Qs = pid1_iq.Out;
ipark1.Angle = rg1.Out;
ipark1.calc( & ipark1);
}
// End: LockRotorFlag==FALSE
xining yan:
回复 Young Hu:
要是没有ISW这个变量怎么办啊,只有上述的代码啊?PMSM3-1没有有您说的ISW开关
啊
在PMSM3-1中是如何计算初始角度的呢?
// —————————————————————————–
if(LockRotorFlag==TRUE) // locked rotor mode
{
// ——————————————————————————
// 链接 PARK 模块的输入 并且调用 park transformation 计算 函数 .
// ——————————————————————————
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Angle = 0;
park1.calc( & park1);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID IQ controller 计算 函数 .
// ——————————————————————————
pid1_iq.Ref = _IQ(IqRef);
pid1_iq.Fdb = park1.Qs;
pid1_iq.calc( & pid1_iq);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID ID controller 计算 函数 .
// ——————————————————————————
pid1_id.Ref = _IQ(IdRef);
pid1_id.Fdb = park1.Ds;
pid1_id.calc( & pid1_id);
// ——————————————————————————
// 链接 INV_PARK 模块的输入 并且调用 inverse park transformation 计算 函数 .
// ——————————————————————————
ipark1.Ds = pid1_id.Out;
ipark1.Qs = pid1_iq.Out;
ipark1.Angle = 0;
ipark1.calc( & ipark1);
}
// End: LockRotorFlag==TRUE
else if(LockRotorFlag==FALSE) // spinning mode
{
// spinning mode if LockRotorFlag = 0
// ——————————————————————————
// 链接 PARK 模块的输入 并且调用 park transformation 计算 函数 .
// ——————————————————————————
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Angle = rg1.Out;
park1.calc( & park1);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调用 PID IQ controller 计算 函数 .
// ——————————————————————————
pid1_iq.Ref = _IQ(IqRef);
pid1_iq.Fdb = park1.Qs;
pid1_iq.calc( & pid1_iq);
// ——————————————————————————
// 链接 PID_REG3 模块的输入 并且调 PID ID controller 计算 函数 .
// ——————————————————————————
pid1_id.Ref = _IQ(IdRef);
pid1_id.Fdb = park1.Ds;
pid1_id.calc( & pid1_id);
// ——————————————————————————
// 链接 INV_PARK 模块的输入 并且调用 inverse park transformation 计算 函数 .
// ——————————————————————————
ipark1.Ds = pid1_id.Out;
ipark1.Qs = pid1_iq.Out;
ipark1.Angle = rg1.Out;
ipark1.calc( & ipark1);
}
// End: LockRotorFlag==FALSE
user5289799:
回复 Young Hu:
Young Hu,
你好,我最近在做此帖中PMSM控制的LEVEL4的实验,通过通过观测发现 LockRotorFlag=1,并不改变。同时观测LockRotorNum数值虽然一直在增加,但最终会停在23000左右,故不会执行下方else内的控制器程序。 实验现象具体表现为:RUN后,电机叮一声不转动,提示如图所示错误。
望提供一些办法或思路,谢谢。