找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2505|回复: 0
打印 上一主题 下一主题
收起左侧

PID算法新手感悟与总结

[复制链接]
跳转到指定楼层
楼主
ID:309370 发表于 2018-4-16 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作为新手接触PID算法,略有些感悟,特将此总结作为记录
PID控制器参数选择的方法很多,例如试凑法、临界比例度法、扩充临界比例度法等。但是,对于PID控制而言,参数的选择始终是一件非常烦杂的工作,需要经过不断的调整才能得到较为满意的控制效果。依据经验,一般PID参数确定的步骤如下:
(1) 确定比例系数Kp
确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为
纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
(2) 确定积分时间常数Ti
比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。
(3) 确定微分时间常数Td
微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。
(4) 系统空载、带载联调
对PID参数进行微调,直到满足性能要求。


PID控制器参数选择的方法很多,例如试凑法、临界比例度法、扩充临界比例度法等。但是,对于PID控制而言,参数的选择始终是一件非常烦杂的工作,需要经过不断的调整才能得到较为满意的控制效果。依据经验,一般PID参数确定的步骤如下:
(1)        确定比例系数Kp
确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为
纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
(2)        确定积分时间常数Ti
比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。
(3)        确定微分时间常数Td
微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。
(4)        系统空载、带载联调
对PID参数进行微调,直到满足性能要求。


PID代码
  1. //定义变量
  2. float Kp;                       //PI调节的比例常数
  3. float Ti;                       //PI调节的积分常数
  4. float T;                        //采样周期
  5. float Ki;
  6. float ek;                       //偏差e[k]
  7. float ek1;                      //偏差e[k-1]
  8. float ek2;                      //偏差e[k-2]
  9. float uk;                       //u[k]
  10. signed int uk1;                 //对u[k]四舍五入取整
  11. signed int adjust;              //调节器输出调整量

  12. //变量初始化
  13.     Kp="4";
  14.     Ti="0"。005;
  15.     T="0".001;
  16. // Ki="KpT/Ti"=0.8,微分系数Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的结果确定这些参数
  17.     ek="0";
  18.     ek1=0;
  19.     ek2=0;
  20.     uk="0";
  21.     uk1=0;
  22.     adjust="0";

  23. int piadjust(float ek)  //PI调节算法
  24. {
  25.     if( gabs(ek)<0.1 )
  26.     {
  27.        adjust="0";
  28.     }
  29.     else
  30.     {     
  31.        uk="Kp"*(ek-ek1)+Ki*ek;  //计算控制增量
  32.        ek1=ek;
  33.       
  34.        uk1=(signed int)uk;
  35.        if(uk>0)
  36.        {
  37.           if(uk-uk1>=0.5)
  38.           {
  39.              uk1=uk1+1;
  40.           }
  41.        }
  42.        if(uk<0)
  43.        {
  44.           if(uk1-uk>=0.5)
  45.           {
  46.              uk1=uk1-1;
  47.           }
  48.        }
  49.        adjust="uk1";   
  50.     }        
  51.    
  52.    
  53.     return adjust;
  54. }

  55. 下面是在AD中断程序中调用的代码。
  56.       
  57.        。。。。。。。。。。。
  58.        else //退出软启动后,PID调节,20ms调节一次
  59.            {
  60.               EvaRegs.CMPR3=EvaRegs.CMPR3+piadjust(ek);//误差较小PID调节稳住
  61.               if(EvaRegs.CMPR3>=890)
  62.               {
  63.                  EvaRegs.CMPR3=890; //限制PWM占空比
  64.               }        
  65.            }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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