PID概述:
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的 其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、 积分、微分计算出控制量进行控制的。
(1)比例(P)控制
比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
(2)积分(I)控制
在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到接近于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后几乎无稳态误差。
(3)微分(D)控制
在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用, 其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。
制作实例:
大家一定都见过PID的实际应用
比如四轴飞行器,再比如平衡小车……还有汽车的定速巡航、3D打印机上的温度控制器….再比如动物园里的海狮,将一根杆子直立着顶在头上(OOPS,这个也算..)就是类似于这种:需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。在这篇文章中我制作了一个基本的电机控制器,来探究PID的原理以及如何去使用它。首先我要可以任意控制我的电机旋转角度,在旋转的过程中,电机需要保持稳定并且不会出现震荡。
电机选型
要想完成这个实验,单片机需要精确控制电机,从电机那获得电机的转速以及位置等信息。所以需要使用带有编码器的直流电机,通过编码器,单片机即可获得电机的转速以及位置信息。市面上售卖的编码器电机一般分为霍尔或者光电编码器的,在这里我选择的是一款来自Robot减速比为120的TT编码器电机。
根据官网给出的数据手册,他的编码器一圈可以输出16个脉冲信号,经过减速箱后,输出轴旋转一圈可以输出16*120=1920个脉冲信号。
电机一共有六根线,左边4根为编码器的线,右边两根为电机的线。
电机驱动芯片
电机驱动芯片我选择的是L293D,这是一个双路的H桥有刷电机驱动芯片,使用2个输入引脚以及一个使能脚就可以控制一路电机正反转以及调速。
单片机用的是STM32F103C8T6系列的核心板。对于这款单片机来说,其定时器支持编码器信号输入,所以我只需要把电机的编码器输出引脚连接到定时器的的编码器输入引脚即可,即可实现定时器自动计数。
单片机与电机电路连接好后,下面就开始做软件部分了。
PID控制器
PID控制器的名称其实就解释了它的基本原理,PID分别是三个单词的缩写,P(Proportion)I(Integration)D(Differential),那么解释成中文意思就是比例、积分、微分控制器。如下图所示。
其中,最左侧作为PID控制器的输入,最右侧作为PID控制器的输出,通过以上框图不难看出,PID 控制其实就是对偏差的控制过程;如果偏差为 0, 则比例环节不起作用,只有存在偏差时,比例环节才起作用;积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有系统上以抵消系统造成的静差;而微分信号则反应了偏差信号的变化规律,也可以说是变化趋势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的预知性;我们可以看到在输出端又有一个箭头指向了输入端的累加器,并且其符号是负的,这也就说明了PID控制器是具有负反馈的,同时此时的误差信号就为输入信号减去输出信号。通俗来说,拿我们实验目的来举例子就是当电机旋转角度过多了,PID控制器会控制其转回到原来角度。
所以总的来看,PID控制器的精髓就是三个运算过程。而在这个实验中,我想要控制电机旋转到特定的角度,那么我的输入就为我想要旋转的角度,经过使用PID控制器进行运算之后,他就会输出一个PWM值去控制电机运动,并且在这同时编码器会不断反馈当前位置。经过这样不断的使用PID控制器进行计算,进而我的电机就可以快速稳定的转到我指定角度。
代码的实现
值得注意的是,对于上面PID结构图中提到的三部分运算公式(比例,微分与积分)它都是对于连续信号来进行的操作,对于单片机来说,处理连续信号显然是不可能的。可行的办法就是每隔一定时间运行一次PID算法,所以对于离散的位置PID算法来说,其公式如下
对于三个变量来说,它们的计算方法如下
那么接下来就是实现整个程序了,由于我使用的单片机小板没有串口通信芯片,不利于后期调试,所以我使用STM32自带的一个USB接口模拟串口通信。接下来新建一个STM32工程,并添加相关的外设初始化代码(电机编码器等)。
接下来我根据上文提到的PID计算公式,编写了PID运算函数。
为了定时运行PID算法,我设置了一个5ms的定时器,这样每次到了定时器中断时候,就可以运行PID算法了。从定时器的中断函数中我们可以看到,每次的处理过程就是将当前位置和目标位置送入PID运算器并且得到输出后,送入电机的控制函数中即可。
而在电机的控制函数Output中,其内容如下
通过PID控制器输出的值来控制电机的旋转方向,然后对PID输出的值进行限幅,最后赋值给PWM发生器即可。
实验
接下来我们开始实验,首先我们将PID控制器的I和D参数全部调节为0,将Kp设置为一个较小值,接着编译工程并且烧录到STM32中。
给STM32上电,STM32使用USB模拟串口需要安装一个软件,我会附到文末资料中。打开串口调试助手,输入h加上回车,点击发送,帮助信息会被打印出来。可以看到支持的指令包括读取编码器位置,修改PID参数以及左右旋转等等。
接着在串口调试助手中发送数据后,观察到电机转动过了九十度,但是电机出现晃动的情况,并且响应速度也较慢接着增大Kp值,直到晃动幅度减小并且电机响应速度逐渐增快,在目标位置附近抖动时,我们开始增大Kd值去抑制在目标位置附近的抖动。当调整到Kp值为500,Kd值为900时,电机晃动情况大幅改善。虽然抖动问题解决了,但是经过多次旋转之后,电机的误差逐渐显现出来,旋转一周后没法回到原点。所以接下来增加Ki值,建议Ki值增加幅度不要过大,一般在零点几的范围。这里我设置Ki值为0.01,以修正每次旋转之后产生的误差。到这里,PID参数调整的基本就差不多了,电机可以很好的执行我的指令。
我发现当我的旋转角度设定到很大的值时候,电机会先以满速转动,然后会逐步减速直到我的设定位置。这就带来一个问题,当电机满速的时候,PWM的占空比为100%,这时候电机等于直接接在电源两端,此时电机的转速我们没法控制,那么如果这时候电源电压不稳,电机转速势必会产生变化,造成转动的不稳定,这当然不是我想看到的。所以这时候就需要引入速度环了。
由于电机转动起来之后会具有一定的惯性,那么他的速度就不可能产生突变,所以在速度环控制器中,我只采用了PI控制。速度环控制器用于控制电机在转动过程中的速度,那么它将会处于位置环控制器的内部,最终实现的代码如下。
审核编辑:汤梓红
-
单片机
+关注
关注
6037文章
44559浏览量
635508 -
控制器
+关注
关注
112文章
16374浏览量
178156 -
PID
+关注
关注
35文章
1472浏览量
85538
原文标题:【电机控制】一篇通俗的PID算法详细讲解
文章出处:【微信号:KY_QRS,微信公众号:开源嵌入式】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论