新手教新手之PID算法.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
新手教新手之PID算法

新手教新手之PID算法 作者:重庆大学电气学院 杨子浩 QQ:402326134 开始学习PID的时候看了很多篇PID的教程,总是觉得和自己的思路不一样,很难理解,现在好不容易有点头绪了,想和在学习的同学交流一下。希望大家给予修改意见以及互相交流继续深入学习并学会应用,然后用伟大的PID改变生活改变世界! PID(经典PID) 初始公式: Ut=KP[et+1TIetdt+TDdetdt] Ut=Kp+Kietdt+Kddetdt 为了在计算机上实现PID函数,需要离散化,得到离散化公式: Uk=KPek+TTIj=0kej+TDek-ek-1T Uk=KPek+Kij=0kej+Kdek-ek-1 更为常用地,转换为增量式: △uk=uk-uk-1=Kpek-ek-1+Kiek+Kd(ek-2ek-1+ek-2) uk=uk-1+△uk 这两条就是我们程序中需要用到的公式 下面我来介绍一下各参数的含义(电机调速为例子) 需要关注的三个量:设定值(目标速度)、输出值(PWM)、当前值(当前速度) ek、et:速度设定值-当前速度值 Kp、Ki、Kd:比例、积分、微分参数,这是我们用经典PID需要调的三个值 uk:PWM占空份数 假设PWM周期20ms,我把周期分为20000份,算出的uk就是占空比的份数。 PID就是能将当前值和目标值的关系转换为我们当前需要的输出量,最终让当前值达到目标值。 详细解释: 我学习的时候,最弄不明白的是,为什么关于速度差的一个函数会输出PWM的份数,而不是PWM的百分比,或者其他什么呢? 我现在认为是式子中积分的作用:对比下图比例、积分、微分的作用(跃阶响应) 微分图中绿色直线为初始值0,红线为目标值 我认为刚学习PID,可以先把注意力放在积分上面,而不是比例上面。 上图是我用EXCEL模拟计算PID函数的作用,我先把KP和KD置零,即不采用比例和微分 速度反馈值用如下公式:(假设速度和PWM是线性的) 速度反馈值(也就是当前速度)=PWM份数PWM总份数*满PWM对应的速度 从这里可以发现:PWM份数的改变→改变速度→积分作用→改变PWM分数 我认为,这里积分这样的作用:将PWM份数和速度对应起来 也就是说,积分能将输出量和当前值建立起关系。 为了证明这个,我把PWM控制改为以百分比控制,得到如下图: 速度反馈值也就是当前速度=PWM百分比*满PWM对应的速度 可见:输出值的形式可以随意更改,他们的关系通过积分作用联系。 而注意到2次的Ki不一样,说明了,Ki的取值范围和输出形式有关系。 我们现在只采用了积分控制 △uk=uk-uk-1=Kiek 相信大家都明白了PID公式是如何将速度值的关系转化为输出量了。 我觉得可以这样理解:积分是主作用,没有积分,只有其他无法达到目标值。而比例和微分可以帮助函数更加好地达到目标值。(例如快速、稳定等因素) 我相信通过我的解释,大家都能学会如何使用上PID,至于比例,微分,积分3个参数如何选定,对系统有什么作用,请大家参考其他高级教程。 总结:如何代码实现PID 以PWM份数为输出量,速度用编码器单位时间脉冲数表示 初始化数值 Speed_Target=1500 目标速度为1500个脉冲/单位时间 Speed=0 当前速度为0 e=0 e(k) de=0 e(k)-e(k-1) last_e=0 e(k-1) last_de=0 e(k-1)-e(k-2) dde=0 e(k)-2e(k-1)+e(k-2)或(e(k)-e(k-1))-(e(k-1)-e(k-2)) dPWM=0 PWM份数需要增加的量 PWM=0 当前PWM份数 Kp=0 比例参数 Ki=1 积分参数 Kd=0 微分参数 由于3个参数选择范围与速度的表示方式以及输出的表示方式有关,但是我也不知道是什么关系,所以大家可以先从小的开始试,因为小的时候是肯定可用的。 2、每隔一段时间执行如下代码: e=Speed_Target-Speed; 求e(k) de=e-last_e; 求e(k)-e(k-1) dde=de-last_de; 求e(k)-2e(k-1)+e(k-2) last_e=e; 把e(k)保存为e(k-1)供下次计算使用 last_de=de; 把e(k)-e(k-1)保存为e(k-1)-e(k-2) dPWM=Kp*de+Ki*e+Kd*dde; 根据公式△uk=Kpek-ek-1+Kiek+Kd(ek-2ek-1+ek-2)求出PWM份数需要改变量 PWM+=dPWM; 由公式uk=uk-1+△uk求出当前P

您可能关注的文档

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档