当前位置:   article > 正文

foc学习笔记4——速度环和位置环_foc位置环

foc位置环

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

槽点比较多,知道意思就好。

​ 不知道有没有人对于串级PID的理解是这样的(我之前也有过困惑):

iqTarget = speedPID.result + positionPID.result;
  • 1

iq目标等于速度环PID运算结果加上位置环PID运算结果。

​ 甚至是这样的:

uqTarget = iqPID.result + speedPID.result + positionPID.result;
  • 1

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

位置环的输出赋给速度环的目标,然后速度环的输出赋给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。

参考资料

视频:硬石相关章节

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/963199
推荐阅读