电机PID实验--一文让你看透PID​

在对无人机,平衡车,智能车,倒立摆的学习过程中,我们可以常常听到一个比较常见的词-PID,那么PID到底是什么呢,到底它有什么作用呢?在这篇文章中我制作了一个基本的电机控制器,来探究PID的原理以及如何去使用它。


首先我们要明确一下实验的目标,就是我要可以控制我的电机旋转任意角度,在旋转的过程中,电机需要保持稳定并且不会出现震荡的情况。

电机的选择

要想完成这个实验,单片机需要对电机进行比较精确的控制,从电机那获得电机的转速以及位置等信息。所以需要使用带有编码器的直流电机,通过编码器,单片机即可获得电机的转速以及位置信息。市面上售卖的编码器电机一般分为霍尔或者光电编码器的,在这里我选择的是一款来自DFRobot减速比为120的TT编码器电机


根据官网给出的数据手册,他的编码器一圈可以输出16个脉冲信号,经过减速箱后,输出轴旋转一圈可以输出16*120=1920个脉冲信号。

买回来的电机一共有六根线,左边4根为编码器的线,右边两根为电机的线


电机驱动芯片

电机驱动芯片我选择的是L293D,这是一个双路的H桥有刷电机驱动芯片,使用2个输入引脚以及一个使能脚就可以控制一路电机正反转以及调速。



单片机

单片机用的是STM32F103C8T6系列的核心板,某宝有售。对于这款单片机来说,其定时器支持编码器信号输入,所以我只需要把电机的编码器输出引脚连接到定时器的的编码器输入引脚即可,即可实现定时器自动计数

把这些材料准备好之后,我设计了一个电路图

根据这个电路图,我在一块洞洞板上焊接好了电路


到这里,整个电路部分就制作好了,接下来是软件部分

PID控制器

PID控制器的名称其实就解释了它的基本原理,PID分别是三个单词的缩写,P(Proportion)I(Integration)D(Differential),那么解释成中文意思就是比例、积分、微分控制器。如下图所示


其中,最左侧作为PID控制器的输入,最右侧作为PID控制器的输出,我们可以看到在输出端又有一个箭头指向了输入端的累加器,并且其符号是负的,这也就说明了PID控制器是具有负反馈的,同时此时的误差信号就为输入信号减去输出信号。通俗来说,拿我们实验目的来举例子就是当电机旋转角度过多了,PID控制器会控制其转回到原来角度。


在经过累加器之后,误差信号就被分为了三部分,比例运算,积分运算和微分运算。其中比例运算直接将误差信号乘以Kp值,积分运算中将每次的误差积分之后乘以Ki值,微分运算中则是将误差信号的导数乘以Kd。其中Kp,Ki,Kd都是常数,根据不同的系统我们需要调整这三个不同的参数,下面我来从数学的角度说明一下各个运算对于输出的贡献。

当误差信号较大时,P项会积极的对输出做出响应,贡献最大的值,所以此时P项占据输出的主要成分。当误差信号处于快速变化中的时候,D项微分运算会对输出做出较大贡献。而I项扮演着校准的角色,当系统的每次细小误差累积起来后,I项就会修正这个误差。

所以总的来看,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参数以及左右旋转等等。

接着在串口调试助手中发送L90加回车,观察到电机转动过了九十度,但是电机出现晃动的情况,并且响应速度也较慢

接着增大Kp值,直到晃动幅度减小并且电机响应速度逐渐增快,在目标位置附近抖动时,我们开始增大Kd值去抑制在目标位置附近的抖动。当调整到Kp值为500,Kd值为900时,电机晃动情况大幅改善。

虽然抖动问题解决了,但是经过多次旋转之后,电机的误差逐渐显现出来,旋转一周后没法回到原点。

所以接下来增加Ki值,建议Ki值增加幅度不要过大,一般在零点几的范围。这里我设置Ki值为0.01,以修正每次旋转之后产生的误差。
到这里,PID参数调整的基本就差不多了,电机可以很好的执行我的指令。

改进

我发现当我的旋转角度设定到很大的值时候,电机会先以满速转动,然后会逐步减速直到我的设定位置。这就带来一个问题,当电机满速的时候,PWM的占空比为100%,这时候电机等于直接接在电源两端,此时电机的转速我们没法控制,那么如果这时候电源电压不稳,电机转速势必会产生变化,造成转动的不稳定,这当然不是我想看到的。所以这时候就需要引入速度环了。


由于电机转动起来之后会具有一定的惯性,那么他的速度就不可能产生突变,所以在速度环控制器中,我只采用了PI控制。速度环控制器用于控制电机在转动过程中的速度,那么它将会处于位置环控制器的内部,最终实现的代码如下。






点击“阅读原文”,  查看完整内容获取资料下载入口!

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值