带你认识PID闭环控制 - 增量式PID实现电机速度闭环
闭环控制是指控制论的一个基本概念。指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系。带有反馈信息的系统控制方式。(源自:百度百科)

小伙伴们你们好,我是集。欢迎你打开入门智能车的第六篇章:闭环控制。我们在入门智能车第二篇章转动舵机中简单提到过闭环控制,今天我们要动手来实现电机的闭环控制,使得电机能够按照我们的要求转动起来。
电机的开环控制与闭环控制
在开始讲闭环控制之前,我们先回忆一下在入门智能车第一篇章中我们是怎么控制电机转速的:这里就要请出我们的老朋友 - 脉冲宽度调制了,我们通过调整占空比来改变电机在一个周期中通电的时间,从而调整施加在电机两端的电压大小,使得电机因为流过电流的变化工作在不同的转速之下。我们把整个过程简化,只留下占空比和电机转速,得到的框图会是像下面这样的

开环控制
在这个过程中,我们通过人为的调整占空比大小使得电机拥有不同的转速。这样的过程我们称之为开环控制,这么讲你们可能会难以理解开环控制的概念,我们先来思考这样一个问题:
假设说我们给定了20%的占空比用以调整电机的转速,经过测量发现在20%占空比时电机的转速大小为50转每分钟(RPM)。这时如果想要电机工作在70转每分钟,我们应该怎么做?
直觉告诉我们,想要有更快的电机转速,就应该设置更高的占空比,但高多少才能够获得目标转速70RPM却成了一个难题。这里我们可以计算1%的占空比能获得的转速,再根据目标转速反推出需要设置的占空比,但因为电压死区的存在,这样做难以获得准确的结果。所以我们想到老方法:一个一个试,不断地调整占空比、测转速,慢了就增加占空比,快了就减小占空比。

闭环控制
给定占空比 -> 测转速 -> 比较实际转速和目标转速 -> 重新调整占空比,这样的过程其实就是一个闭环控制,我们发现这个过程形成了一个回环:每次调整的占空比大小都是基于上一次结果得到的。相比开环控制,闭环控制多了信息反馈环节(测电机转速),我们根据反馈信息再做出进一步调整,接着获得调整后的反馈信息,再基于更新过的反馈信息进行新一轮的调控。
PID算法
现在我们已经知道了实现闭环控制的方法,但显然人为的去测转速、改占空比的操作太花费时间和精力了,有没有什么办法让MCU自己实现闭环控制呢?答案是有的,它就是我们接下来要介绍的PID算法。
认识符号
在讲解PID算法之前,我们先来认识几个符号:
error:误差,目标值与实际值的差值,有正有负
target:目标值,我们设定的目标转速(以转速闭环为例)
actual:实际值,我们测量得到的实际转速(以转速闭环为例)
我们规定误差的计算公式如下:
error = target - actual
(即误差 = 目标值 - 实际值,这么规定的目的是统一正负号)
增量式PID计算公式
认识完以上几个符号之后,我们就可以开始学习PID算法了,这里我们给出增量式PID算法的计算公式
增量式PID的离散化公式如下:
u(k) = Kp(e(k) - e(k-1)) + Ki(e(k)) + Kd(e(k) - 2e(ek-1) + e(k-2))
这么一长串公式让人看着有点慌张,我们试着把公式分为几个小块:
P = Kp(e(k) - e(k-1)) #比例项
I = Ki(e(k)) #积分项
D = Kd(e(k) - 2e(ek-1) + e(k-2)) #微分项
把它们加起来就是原来的公式了:
u(k) = P + I + D
公式看着简单多了,我们再试着深入挖掘下每个小块的内容:
Kp、Ki、Kd:这三个变量是PID的调节系数,由我们指定,用以调节PID的性能e(k)、e(k-1)、e(k-2):指的都是误差errork、k-1、k-2:表示不同的时刻。与误差error配合用以表示这个时刻的误差、上个时刻的误差以及上上个时刻的误差u(k):PID算法的计算结果,即控制量。在电机速度闭环中可以是给定的占空比
把上面的内容代回到PID计算公式中,我们就得到PID的计算方法啦,可以发现PID算法中需要通过计算获取的变量只有一个:误差,其他剩下的就只有我们给定的系数了
知道了PID的计算公式,我们要如何利用它来实现闭环控制呢?我们可以看下下面的框图

我们把目标转速t和实际转速a输入到PID模块中,在模块内自动计算、保存误差e,再把计算得到的误差e套入PID公式中获得控制量u(k),接着把控制量u(k)当作占空比进行一轮更新,之后再把更新后的占空比得到的实际转速t传回PID模块,开始新一轮的更新。如此反复就实现了PID闭环控制,是不是很神奇呢~讲到这里我们就可以开始动手实践了,不过在开始之前我们还需要考虑一个问题:如何获得误差。
计算误差
在电机速度闭环的例子里,我们如何计算获得误差e呢?从公式中我们可以得知,误差的计算会用到目标值和实际值。速度闭环中的目标值是我们给定的目标转速,由我们自己设定,而实际值:实际转速的获取则需要花点功夫了:
通过编码器获取转速

我们在比赛中主要用编码器(蓝色)获取电机的转速。从图中可以看到,电机齿轮(红色)带着轮子转动,而编码器又与轮子上的齿轮接触,所以电机的转速经由齿轮传递给了编码器。那MCU又是怎么通过编码器测量出速度值的呢?我们来看一下编码器的输出信号:

图中分别展示了带方向的编码器和正交解码编码器的输出信号波形图。从图中我们可以知道,这两种编码器都可以用于获取转速和转向,只不过带方向的编码器是直接输出转向(通过高低电平表示),而正交解码编码器则是通过AB两相脉冲的上升沿判断转向(正转A相的上升沿比B相来得早,反转则相反)。
知道了判断转向的方法,我们再来看看如何通过编码器获取转速。我们从图中可以知道,除了方向,编码器还输出了一定数量的脉冲。

从逐飞给出的参数表中我们得知,不管是带方向的编码器还是正交解码编码器,它们的输出脉冲数都是1024线。这里的输出脉冲数指的其实是编码器每转动一圈产生的脉冲个数,即编码器每转动一圈产生1024个脉冲。
如果我们用一个计数器来累计编码器产生的脉冲数量n,从0开始,每过一分钟对计数值进行保存、清零,则在每次清零时,我们都可以通过公式(n/1024)/1计算出编码器在这一分钟内的平均转速。比如在一分钟内计数器获取到了n=4096个脉冲,则在这一分钟内编码器的平均转速为4RPM。
对于闭环控制来说,一分钟时间调整一次显然太久了(我们可能每次调整只能让实际值向目标值趋近一点点),在电机速度闭环里面我们也希望用瞬时速度而不是平均速度表示电机的转速。所以我们加快一点时间,每过几毫秒就对计数值进行保存、清零,虽然通过公式(脉冲个数/输出脉冲数)/ 经过时间算出的仍是这几毫秒内的平均转速,但因为经过时间足够短,平均速度可以被近似看作是瞬时速度被我们用到闭环控制中去。这样我们就可以把几毫秒内的脉冲计数值当作实际转速(瞬时转速)拿去计算误差值啦。
单位换算
聪明的小伙伴可能已经想到了结合时间和脉冲个数计算电机实际转速(带公制单位)的方法了,但在闭环控制中,我们其实用不着换算出带公制单位的转速,因为不管是转每分钟还是转每秒还是弧度每秒(都是线性关系),它们表示的都是同一个物理量:转速。所以在速度闭环控制中,我们直接把一段时间内的脉冲个数当作实际转速使用就可以惹。
实际应用编码器
编码器作为常用元器件同样是被封装到了逐飞开源库中,我们在使用时直接调用集成好的函数就可以了。不同芯片的开源库编码器的文件可能放在不同位置,就MM32F3277来说编码器相关的函数是放在zf_tim.c文件中的,其他开源库可能得在工程范围搜索一下关键字encoder用以找到编码器相关的函数。

因为每过一段时间要对脉冲计数进行保存、清零,所以我们可能需要用上定时器中断。定时器中断相关的函数位于文件zf_pit.c中,初始化定时器后设定好定时时间,程序就会每过一段时间自动进入到isr.c文件中的定时中断服务函数中去执行里面的语句了。
从编码器获取到负值
我们实际上手使用编码器后,把从编码器获取到的脉冲计数值显示到显示屏上,前后转动轮子我们会发现计数值时而正时而负,这代表什么呢?动动脑筋,想想看为什么会有负的值出现。
采样周期与控制周期
讲到这里我们已经能计算误差啦,剩下的就是把误差代入到PID公式中计算获得控制量,

本文详细介绍如何使用PID算法实现电机速度闭环控制,包括闭环控制原理、PID算法计算公式、增量式PID实现方法及编码器转速测量等内容。
最低0.47元/天 解锁文章
259

被折叠的 条评论
为什么被折叠?



