foc学习笔记4——速度环和位置环
PID的资料网上有很多,包括原理以及调试,相信大家对于PID都有着自己的理解,因此这里就不多介绍了。本节只讲一些针对电机的关键东西,避免新手朋友因为歧义而发生错误。
加上速度环和位置环的foc框图
什么叫串级PID
这里先看一个我自己用的PID代码:
struct PID_Type{
float32_t kp; //P、I、D各自参数
float32_t ki;
float32_t kd;
float32_t target; //PID给定目标值
float32_t value; //由传感器之类的采集到的值
float32_t error; //目标减去测量值得到的误差
float32_t errSum; //积分项的累加和
float32_t errSumMax; //积分限幅
float32_t lastErr; //保存上一次的误差
float32_t errDt; //计算误差的增量
float32_t result; //最终计算结果
};
float32_t PIDGetResult(struct PID_Type *pid, float32_t valMax)
{
pid->error = pid->target - pid->value;
pid->errSum += pid->error * pid->ki;
if(pid->errSum > pid->errSumMax)
pid->errSum = pid->errSumMax;
else if(pid->errSum < -pid->errSumMax)
pid->errSum = -pid->errSumMax;
pid->errDt = pid->error - pid->lastErr;
pid->lastErr = pid->error;
pid->result = pid->kp * pid->error + pid->errSum + pid->kd * pid->errDt;
if(pid->result > valMax)
pid->result = valMax;
else if(pid->result < -valMax)
pid->result = -valMax;
return pid->result;
}
槽点比较多,知道意思就好。
不知道有没有人对于串级PID的理解是这样的(我之前也有过困惑):
iqTarget = speedPID.result + positionPID.result;
iq目标等于速度环PID运算结果加上位置环PID运算结果。
甚至是这样的:
uqTarget = iqPID.result + speedPID.result + positionPID.result;
uq给定值等于三环PID的运算结果。
这样是不对的!!!这不叫串级PID,应该叫并联PID!!!
下面简单地展示一下串级PID到底是什么形式:
void CascadePID(float32_t target)
{
positionPID.target = target;
speedPID.target = PIDGetResult(&positionPID, aa);
idPID.target = 0;
iqPID.target = PIDGetResult(&speedPID, bb);
udTarget = PIDGetResult(&idPID, cc);
uqTarget = PIDGetResult(&iqPID, cc);
}
位置环的输出赋给速度环的目标,然后速度环的输出赋给iq电流环的目标,最终id、iq电流环的输出赋给ud、uq目标。本质就是外环的输出等于内环的输入,而最外环的输入则是人为给定的。
我们还可以改变代码中aa、bb、cc的值来控制内环的最大输出。
补充说明
有人可能要问了,能不能不要这种位置环->速度环->电流环->uq的形式,去掉速度环改成位置环->电流环->uq的形式,或者去掉电流环改成位置环->速度环->uq的形式。其实这样也是可以的,就是控制效果可能会差一些,PID会更难调一点,各位自行掂量吧。但别搞出什么速度环->电流环->位置环->uq的形式。
再说一下三环的计算频率。电流环的频率是可以等于foc的运算频率的,而foc的运算频率最高能达到mos管的开关频率,高于开关频率就没有意义了。如果只是自己做着玩,我建议mos管开关频率高于16KHz,否则会很吵。所以如果你的单片机算的过来的话,foc运算频率就等于开关频率。如果算不过来STM32的高级定时器有个重复计数寄存器,可以输出几个pwm才产生一次中断,或者也可以在中断函数里软件计数。那么电流环以及foc的运算频率就定下来了,而速度环和位置环的频率要低于电流环频率几倍。比如开关频率是16k,foc运算频率和电流环频率也是16k,那么速度环和位置环的频率可以取2k甚至更低。速度环和位置环的频率可以一样也可以不一样,总之内环的频率不要比外环频率还低。
最后关于调参或者参数整定这块,说实话本人没什么经验,基本就是瞎试然后看效果,各位自己琢磨吧。提一点就是电流环PI项就够了,速度环也只要PI项,位置环P项就够了也可以加一点D。
参考资料