普誠創智(成都)科技有限公司-论坛

 找回密码
 立即注册
搜索
热搜: PT32 BLDCM Motor USB
查看: 54077|回复: 1
打印 上一主题 下一主题

基于PT32 BLDC驱动方案的增量PID调试心得

[复制链接]

1

主题

1

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2021-9-13 17:43:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试增量式PID时,查了很多资料,绕了很多弯路,最后总结了一些经验,供大家参考。

1.  源码
以整定速度PID为例,根据增量式PID程序
//*****************************************************************************
//!\brief        The speed PID reset
//!\param        None
//!\retval  None                                                                  
//*****************************************************************************
void SpeedPID_Rest(void)
{
        SpeedPID.Err           = 0;
        SpeedPID.ErrBak     = 0;
        SpeedPID.Uout       = 0;
        SpeedPID.UoutBak    = 0;
}

void SpeedPID_Init(void)
{
        SpeedPID.OutMax = 5*131072;                        // OutMax    = 5 * 65536
        SpeedPID.OutMin = -5*131072;                       // OutMin    = -5 * 65536
        SpeedPID.Kp         = 50;                                 //
        SpeedPID.Ki         = 120;                                 //
}

//*****************************************************************************
//!\brief        The speed PID control logic
//!\param        the set speed and the actual speed
//!\retval  the offset value of the speed                                                                  
//*****************************************************************************
LONG SpeedPID_Ctrl(LONG ref,LONG fdb)
{
        SpeedPID.Ref = ref;                // the set speed
        SpeedPID.Fdb = fdb;                // the actual speed
        //-----Error-------------
        SpeedPID.Err = SpeedPID.Ref - SpeedPID.Fdb;
    //
        SpeedPID.Uout = SpeedPID.UoutBak + SpeedPID.Kp * (SpeedPID.Err - SpeedPID.ErrBak) + SpeedPID.Ki * SpeedPID.Err;
        //
    SpeedPID.ErrBak = SpeedPID.Err;
    //
    if(SpeedPID.Uout > SpeedPID.OutMax)
        {
                SpeedPID.Uout = SpeedPID.OutMax; // set the maximum of Uout
        }
        else if(SpeedPID.Uout < SpeedPID.OutMin)
        {
                SpeedPID.Uout = SpeedPID.OutMin; // set the minimum of Uout  
        }
    //
    SpeedPID.UoutBak = SpeedPID.Uout;
    //
    SpeedPID.Uout >>= 17;

   return SpeedPID.Uout;
}

可知PID程序将会return一个SpeedPID.Uout值,即g_PID_Data值,
SpeedPID.Uout = SpeedPID.UoutBak + SpeedPID.Kp * (SpeedPID.Err - SpeedPID.ErrBak) + SpeedPID.Ki * SpeedPID.Err;
其中 SpeedPID.Uout为本次PID将要输出的g_PID_Data值,以改变输出PWM的占空比


2. 理论
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大(Kp增大)
曲线漂浮绕大湾,比例度盘往小扳(Kp减小)
曲线偏离回复慢,积分时间往下降(Ki增大)
曲线波动周期长,积分时间再加长(Ki减小)
曲线振荡频率快,先把微分降下来(Kd增大)
动差大来波动慢。微分时间应加长(Kd减小)
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低


3. 设定上下限OutMax 和 OutMin
如何确定outmax outmin
P是对现在的情况做出反应 I是对过去的积累

先找电机最高转速,根据这个转速设定OutMax和Outmin的值,具体为OutMax或min为最高转速的5~10倍之间,过大
会导致out值过小,变化幅度小;过小会导致导致out值平常过大,不能平滑输出out。例如-5 -4 -4 -3 -2 -1是我们想要的PID输出值
,而过大 out可能会为-1 -1 -1 0 0 ,过小输出可能会为5 5 5 5 5 0 0 -5 -5 -5 -5 ,震荡大。

4. 调试比例系数P
然后是P 和 I 的确定,先I为零 调P。当只有P,没i的时候,p是对现在的情况作出反应,若加速,起始时候p会乘上和0和目标的差值,
之后P会一直乘一个负值,最后out值会趋近与0,可能一直到不了目标速度。利用这个特性,找适合整个电机转速区间的P。
所以调P不要只在一个转速调,在最高速,最低速,中间速度,找到适合这三个转速区间的P。

何为适合,例如一个P值。
在高速的时候 能达到最高速的80%,但在中速只能到中速的60%,低速只能到低速的40%,那么这个P值,就还不适合
而另外一个P值,能达到高速的70%,中速的70%,低速的70%,那么这个P值就比较适合。这个时候,就需要用I值来达到目标速度。


5. 调试积分系数I
此刻调i,
先找稳态时候的误差  例如稳态 6W转时候 上下误差为2000r ,也就是说ERR要么为0 要么为2000,-2000,此时可以加入较小的I。观察目标波形的抖动,如果周期出现震荡,时间很长,则I太大 需要减小。如果振荡回复很慢,则I太小,需要增大。
I的调整很灵活,在P参数整定正常后,很快就能调好I。

以上是增量式PID 参数整定调试心得,如有不足请提出指正,谢谢阅读!

回复

使用道具 举报

174

主题

198

帖子

1622

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1622
沙发
发表于 2021-9-14 10:42:53 | 只看该作者
厉害啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

蜀ICP备16008743号-1|普诚科技公司|小黑屋|普誠創智(成都)科技有限公司-论坛  

GMT+8, 2024-11-23 17:38 , Processed in 0.201995 second(s), 22 queries .

快速回复 返回顶部 返回列表