- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- XGZ系列刮板输送机图册.pdf
- 第10课《 再塑生命的人》课件(共22张ppt)部编版语文七年级上册.pptx VIP
- 近5年上海市高考语文真题之书序、游记类文言文阅读汇编.docx VIP
- 00708装饰材料与构造-全国自考-2021年4月高等教育自学考试真题(试卷).pdf VIP
- XGZ系列铸石刮板输送机.doc
- 小学篮球原地运球、行进间运球教案.doc
- 中国林业研究院806有机化学考研真题试题2020年.pdf VIP
- 中国林业研究院806有机化学2019考研真题试题.pdf VIP
- 2024年初级咖啡师技能鉴定考试题库大全-上(单选题汇总).docx
- 2024-2030年中国氦(液氦和气态氦)行业市场发展趋势与前景展望战略分析报告.docx
文档评论(0)