Arduino小车PID调速——整定参数初试水

在实现了小车较为可靠的测速基础上,便可以正式开展PID调速实验了。本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进行参数整定的,侧重于在对PID算法有基本了解下,通过实验自己动手整定参数,观察不同的参数值对小车调速效果的影响,从而对PID算法产生感性的认知。

PID基本知识

所谓PID算法,是一种在工程应用领域被使用最为广泛的负反馈调节方法,通过PID算法中比例、积分、微分三个部分的作用,达到使系统稳定的效果。有关PID的介绍在网络上已经非常多且详细,本文不再展开论述。

公式

Output=Kpe(t)+KI∫e(t)dt+KDddte(t)

Output = K_pe(t) + K_I \int e(t) {\rm dt} + K_D\frac{d}{dt}e(t)

Where:e=Setpoint−Input

Where : e = Setpoint - Input
上面的公式是一种最为常见的PID算法形式,由比例、积分、微分三个部分组成,在实际工作中三者相互配合作用于控制系统

P就是比例作用,是把调节器的输入偏差乘以一个系数,作为调节器的输出,它能够使系统趋于稳定,但却不能有效地使系统达到设定值
I就是积分作用,它的作用使如果系统存在输入偏差,那么积分作用将使系统按照一定的速度向一个方向累加下去,它的作用在于可以消除系统静态偏差,让系统达到设定值
D就是微分作用,能够起到超前调节的作用,即如果被调量没有变化,则微分作用不产生变化,一旦发生变化,则微分作用可以很快的做出响应。

以上是PID的公式和各个参数的意义的简单陈述,目的在于产生一个基本的认识,而对于真正进行PID参数整定的实际工作来说,还是远远不够的,需要不断地深入理解各个参数对系统的影响以及多个参数之间的关系。

参数整定口诀

这里笔者比较推崇由白志刚编著的《自动调节系统解析与PID整定》一书中的趋势读定法整定口诀

自动调节并不难,复杂系统化简单

整定要练硬功夫,图形特征看熟练

趋势读定三要素,设定被调和输出

三个曲线放一起,然后曲线能判读

积分微分先去掉,死区暂时也不要

比例曲线最简单,被调输出一般般

顶点谷底同时刻,升降同时同拐点

波动周期都一样,静态偏差没办法

比例从弱渐调强,阶跃响应记时间

时间放大十来倍,调节周期约在内

然后比例再加强,没有周期才算对

静差消除靠积分,能消静差就算稳

不管被调升或降,输出直观偏差存

输入偏差等于零,输出才会不积分

积分不可加太强,干扰调节成扰因

被调拐点零点间,输出拐点仔细辨

积分拐点再靠前,既消静差又不乱

微分分辨最容易,输入偏差多注意

偏差不动微分死,偏差一动就积极

跳动之后自动回,微分时间管回归

系统若有大延迟,微分超前最合适

风压水位易波动,微分作用要丢弃

比例积分和微分,曲线判读特征真

如果不会看曲线,多看杖策行吟文

综合比较灵活用,盛极衰来扼杀因

参数整定

首先需要将PID库运用到自己已能实现测速功能的程序中,接下来只需调节Kp、Ki、Kd三个参数即可。

第一步:纯比例作用整定

由于是第一次进行PID参数整定,笔者先以把小车速度整定到250mm/s为目标,在程序中输入设定值。根据上面的口诀,先把系统设定为纯比例作用,即只有比例增益Kp不为0,积分增益Ki和微分增益Kd都暂时设定为0.因为是这个小车第一次整定参数,笔者也不知道什么比例增益比较好。根据口诀所说比例作用从弱到强调节,因此笔者就随便写了个自认为不大的值2,然后观察小车运行情况。实际的运行结果令我大吃一惊,小车电机以一定的周期在转和不转之间震荡。根据口诀中“然后比例再加强,没有周期才算对”得知,肯定是比例作用已经非常大了,因此赶紧将比例增益调整为0.2,小车的电机不再出现剧烈的“抽搐”,开始以一种比较缓慢的姿态转动,但通过观察输出波形,还是存在较小的波动,而根据网上查阅资料得,比例作用过分小也会导致系统震荡,但与之前较大比例作用下的震荡相比,显然“温柔”多了。于是笔者继续增加比例作用,直至Kp = 0.7时,输出波形已经相较其他参数下稳定很多了。

第二步:比例积分作用

由上图可看出,一个适合的比例作用可以使系统趋于稳定,但却无法消除静态偏差,因此需要引入积分作用,其最大的好处就是可以消除静态偏差。笔者继续采用由小逐渐加大积分增益的方式。当设定Ki = 0.3时,由图可见

静态偏差逐渐减小,输出的速度越来越接近设定的250mm/s的目标,不过调节速度太慢,还是不能满足需求。
于是继续加积分作用,当Ki = 5时,可以看出,系统反应速度已经很快,可以在0.1秒内

由波形可以看出,此时速度已基本能够快速准确地达到设定值,但仍然存在着些许波动。在比例积分作用下产生波动,可能是由于比例作用过大,也有可能是积分作用过强产生了积分干扰,因此可以适当降低比例或积分作用,来尝试减弱波动。由于比例作用和积分作用是相对的,因此为了使系统稳定,降低其中一种作用时,另外一种作用也要随之降低。故把参数设定为Kp = 0.65,Ki = 4.5,此时效果如图

可明显看出,速度得到进一步的稳定,且系统反应迅速,在不到0.1秒的时间内便使速度达到稳定。考虑到测速中存在的干扰以及电机机械转动的问题,剩余的些许波动可以被忽略。

第三步:测试在其他速度下的效果

以上的实验是建立在设定速度恒定为250mm/s的条件下进行的,能保证在250mm/s的速率下良好的调节效果,而这个参数是否适合在其他速率下工作,还需要进一步测试。

一、低速运行情况下

当笔者尝试将速度设定为200mm/s时,再观察波形,结果出现了非常频繁的波动,极端情况下,达到设定速度附近一段时间后,系统居然开始出现越来越大的波动,越来越发散

由此可得出,在参数不变的情况下,适合一个特定速度的调节方式不一定适合低速条件,在低速条件下会出现不稳定。
是什么导致这样波动的发生?比例作用可以使系统稳定,虽然积分可以消除静态偏差,但如果比例设定的不合理,静态偏差也难以被消除。而之前设定的参数是在250mm/s的情况下合适的,此时设定速度降低到200mm/s。比例作用是把调节器的输入偏差乘以一个系数,作为调节器的输出,因此可以设想此时比例作用相对于积分作用实际上偏向于减弱了。这就可能造成了积分作用过强,导致积分干扰。因此笔者尝试降低积分作用, 并相应略微降低比例作用。将参数设定为Kp = 0.5,Ki = 2

可以看出,波动已得到一定的抑制,同时在运行一段时间后,不再出现波动范围越来越大,波动周期越来越明显的“抽搐”发生,证明了高速条件下的参数运用到低速条件下会出现积分干扰的猜想。

二、高速运行情况下

笔者再次尝试将适合250mm/s的参数运用到300mm/s,看看会有什么情况发生。

对比250mm/s下的波形可以观察得,在300mm/s下工作,系统的快速性变弱,系统的稳定时间比250mm/s下要长了一点,同时波形出现了小幅度的有周期震荡。
系统稳定时间变长有两方面的原因,第一可能是比例作用偏弱,会导致难以消除静态偏差,第二是积分作用偏弱也会导致消除静态偏差的过程变慢。比例作用偏强和偏弱都会导致一定的震荡,偏强时的曲线是周期性很强,基本呈正弦波形式的,而偏弱时候波动也会有一定的周期,但在一个波动周期内,往往掺杂着几个小的波峰。由本图可看出,此时的波动属于比例作用偏小的情况。
当把参数调节到Kp = 0.75,Ki = 5.5时,得到的曲线如图

很明显,波动得到了抑制,稳定时间也缩短了。

总结

通过以上实验证明了pid调速过程中,一个特定的参数仅对一定的速度区间有比较好的调节效果。若比这个速度低,则会出现比例积分作用过强,从而出现震荡;若比这个速度高,则会出现比例作用不强,系统的稳定时间变长,且出现小幅度周期性波动的情况。

不足与改进

小车在实际工作中,不会一直只工作在一个恒定的速度下,因此在进行PID调速时不能在一个速度下调成功了就觉得万事大吉了。为了能达到PID调速对更大的速度区间内有效,一个简单的办法就是在电机低速转动的情况下进行调速,这样基本可以实现从慢速到高速都能速度稳定的效果,但这样的一个缺点在于高速情况下稳定时间变长,且会出现小幅度周期性波动。在这个基础上的一个改进办法是通过分别调节低速、中速、高速三种不同情况下适合的PID,可以设定速度区间,当速度设定值落在某个区间内,则启用适合那个速度下的PID参数进行调速。进一步深挖,可以尝试自动整定参数,达到最好的PID调速效果。
以上是本人的一点尝试和经验,难免有不足之处,还望各位多多指教!

参考

  1. 白志刚《自动调节系统解析与PID整定》化学工业出版社

# Arduino小车PID调速——整定参数初试水相关推荐

  1. 教你10分钟完成智能小车的PID调速

    简介 这是我在CSDN上面的第一篇博客,来分享一下我是如何用最短的时间进行智能小车的PID调速的.在疫情期间比较无聊,在某宝买了一个智能小车底盘和一堆零件,基于Arduino Due和树莓派进行开发, ...

  2. STM32应用开发实践教程:智能小车电机调速模块的应用开发

    3.3.1 任务分析 本任务要求设计一个可实现智能小车电机调速的应用程序,具体要点说明如下. ① 电机驱动部分选用德州仪器(Texas Instruments,TI)公司的 DRV8848 芯片(也可 ...

  3. 小车PWM调速-模式选择

    小车PWM调速-模式选择 写好程序后,接上蓝牙模块,打开手机蓝牙助手,小车运行效果:首先进行模式选择,有快速模式.中速模式.慢速模式,按下模式选择,小车接收到串口信号后(串口接收指示灯会闪一下),便可 ...

  4. 小车PWM调速-串口控制

    小车PWM调速-串口控制 串口控制调速,即通过串口修改speed的值, 1.将上节PWM调速用到的定时器0源文件和头文件引入进来,工程文件如下 mian.c:主函数 Motor.c:小车前进.后退.左 ...

  5. 小车PWM调速-左右轮差速转弯

    小车PWM调速-左右轮差速转弯 之前写的左转和右转函数都是一个轮子停止,另一个轮子转动,才实现了转弯效果,那差速就是,两个轮子都转动,只不过一个轮子快,一个轮子慢,这样就实现了较平滑的转弯 左转:右轮 ...

  6. 智能小车PWM调速原理

    电机驱动电路 智能小车电机的驱动芯片采用L293D.L293D是一款单片集成的高电压.高电流.4通道电机驱动,设计用于连接标准DTL或TTL逻辑电平,驱动电感负载(诸如继电线圈.DC和步进电机)和开关 ...

  7. matlab直流电机pid调速仿真,基于MATLAB的数字PID直流电机调速系统的实现

    Computer Knowledge and Technology 电脑知识与技术计算机工程应用技术 本栏目责任编辑:梁书 第6卷第22期(2010年8月)基于MATLAB 的数字PID 直流电机调速 ...

  8. PIC16 F887 单片机 直流电机PWM调速 PID调速 PID算法

    直流电机PWM调速:使用将直流电机转速转换为脉冲频率,测量出电机的转速,与写入到单片机的EEPROM里的脉冲设定值进行比较产生偏差,若偏差为正值则电机减速,偏差为负值则加速,并在LCD上显示电机的转速 ...

  9. 51智能小车pwm调速

    首先pwm调速主要运用的是定时器和中断的知识,此段代码运用的是定时器0,8位自动重装模块 下面了解pwm是如何控制速度的 调速的本质就是通过定时器控制小车的左右两轮使能:对小车的轮子转的时间和停的时间 ...

最新文章

  1. 生鲜电商APP开发,有哪五大商机?
  2. 苹果笔记本适合学python吗_千万别花冤枉钱!大学生买本得这么选!
  3. leetcode算法题--最长数对链
  4. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
  5. python 加密解密_python实现AES加密解密
  6. STP、RSTP、MSTP
  7. postgresql 备份_等保涉及的PostgreSQL数据库
  8. centos7 systemctl status servicename执行慢的问题
  9. Centos7找不到ifconfig和netstat命令
  10. mac终端操作文件或文件夹(持续更新)
  11. 神经网络 误差下降 准确率不上升_Go进程的HeapReleased上升,但是RSS不下降造成内存泄漏?...
  12. 中级软件评测师考什么
  13. 关于如何将动作识别数据集UCF101中的每一小段视频按类别分割成一帧帧图片
  14. 2011当选的院士工作职务之一
  15. 【算法面试题】工厂木材加工问题
  16. turicreate 视频_iOS 推出的turiCreate功能(一) 图片识别
  17. 明基PD2710QC测评
  18. GDI+ 制作透明图片
  19. DDL,DML,DQL,DCL概念
  20. bash快捷键Quick bash shortcuts--用Enki学Linux系列(4)

热门文章

  1. 进制的转换规则简单口诀
  2. 一、[专栏内容简介-免费试读-修改链接]使用Teigha.net完成.net winfrom界面修改读取dwg/dxf文件,类似CAD看图王软件无AutoCAD环境下操作显示CAD文件的功能
  3. 河南省信息学竞赛网站
  4. App控件定位:Android 控件介绍及元素定位方法
  5. JavaScript系列学习笔记2 —— 数组Array对象
  6. ios 画图_技术成长笔记_新浪博客
  7. 将JS保存为书签,在网页中运行
  8. MySQL忘记登录密码解决
  9. 优衣库经验:我们怎么做O2O?
  10. 一键安装docker