初学者的PID调速.doc.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
初学者的PID调速.doc

初学者的PID调速 背景: 偶然购买了智能小车配件,使用现在大热的arduino控制板,实现了wifi的小车运动。但是遇到了走不直,控不住的问题。上网google后,发现里面还有很大的学问,直到发现了一个名为PID的控制方法,可以控制电机转速。只有实现了PID调速,才有基础让小车走直线。 硬件准备: N20直流电机,配有1:145的金属变速箱。电机必须带测速。 Aduino nano控制板,主控芯片atmel328p。 实现电机控制的H桥电路板,带pwm输入。 供电电池。 软件准备: Arduino IDE开发环境。 串口猎人,收集数据,绘制可视化图像。 目的就是控制电机转速,但是如何入手是个门槛。 通过疯狂google,网上的偏重理论研究的很多,也有很多的学生毕业设计论文,但是都是说的不仔细不透彻。我本身工作多年,数学基础,自动控制理论也比较薄弱,看了也是云里雾里。正在发愁之际,点入丁老师的“嵌入之梦”网站。里面的一篇PID调速文章使用通俗易懂的语言介绍让我非常兴奋,给我一个不错的起点,总算是找到门了! 还是要先有个大概的理论。PID指的是(比例-积分-微分)控制器 PID 控制的基础是以周期 T 测量,计算出偏差后修正输出。而测量周期不能太长,100ms 左右的周期比较合适。– inputMeter。Kp*e(t),就可以用来控制了PWM了。e(t)有可能为正,也有可能为负,快了就变成负值,慢了就变成正值,这正是我们想要的结果啊。赶快动手试一试: 结合我的情况我的给定值是40,测得的实际速度是25。最终稳定在25。Kp参数经过调整,直到不震荡的状态。 可以看到实际的输出值与想要的速度有一个恒定的误差,也就是专业术语的稳态误差了。 double error = mySetpoint - inputMeter; outputPWM = kp*error; //arduino 的调节范围就是0 - 255 if(outputPWM? 255)?outputPWM?= 255; if(outputPWM? 0)?outputPWM?= 0; 式中:TI是积分时间常数,它表示积分速度的大小,TI越大,积分速度越慢,积分作用越弱。 这里说明下我们程序是在中断处理函数中进行。理论公式给出的是连续量,模拟式的表示方法。所以就要进行所谓的“离散化”。 u(t)对应的就是我们的pwm输出。Kp就是P控制器整定后的值。T就是设定的采样周期。Ti就是需要通过实际测试,需要整定的值。理论公式要求的积分,对应到我们实际程序编写就是把所有的误差加起来。积分 约等于 做加法。更直观一些积分就是求面积。j就是执行了多少个采样周期了。面积可以用梯形求和法。 伪代码: 增加全局变量 errSUM double error = mySetpoint - inputMeter; errSUM += error; outputPWM = kp*error + ki * errSUM ; //arduino 的调节范围就是0 - 255 if(outputPWM? 255)?outputPWM?= 255; if(outputPWM? 0)?outputPWM?= 0; 这里关注点是微分部分。涉及到2个值,本次的误差e(kT) ,上次的误差e[(k-1)T],2者的差值除以采样时间就是变化率了。Td就是微分系数。和积分一样这次用Kd = kp*Td/T ,同样是为了减少程序的计算量,整定时直接修改即可。 伪代码: 全局变量 errSUM 积分项 新增上次的偏差值变量errorLast 微分项使用 double error = mySetpoint - inputMeter; errSUM += error; outputPWM = kp*error + ki * errSUM + kd *(error – errorLast); //arduino 的调节范围就是0 - 255 if(outputPWM? 255)?outputPWM?= 255; if(outputPWM? 0)?outputPWM?= 0; 我们需要的pwm输出是全量,而不能是变化量,那么加上上次的u(k-1)即可。 u(k) = u(k-1) + ^u(k),也就是把u(k)项移到等号左边,把^u(k)移动到等号右边。好了,让我们来实现它,这次是最终代码,直接上代码片段。 #define PVAL (error - last1Error) #define IVAL ((error+last1Error)/2) #define DVAL (error - 2*last1Error + last2Error) /*Compute all the working error variab

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档