在对无人机,平衡车,智能车,倒立摆的学习过程中,我们可以常常听到一个比较常见的词-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控制。速度环控制器用于控制电机在转动过程中的速度,那么它将会处于位置环控制器的内部,最终实现的代码如下。


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

电机PID实验--一文让你看透PID​相关推荐

  1. 用matlab仿真pid实验报告,PID实验报告..doc

    实验题目:PID控制实验 学生姓名:学 号:区 队:日 期: 学科名称现代控制系统实验实验目的1.?理解一阶倒立摆的工作机理及其数学模型的建立及简化的方法:掌握使用Matlab/Simulink软件对 ...

  2. 一文带你看透 GDB 的 实现原理 -- ptrace真香

    文章目录 Ptrace 的使用 GDB 的基本实现原理 Example1 通过ptrace 修改 被追踪进程的内存数据 Example2 通过ptrace 对被追踪进程进行单步调试 Ptrace的实现 ...

  3. 第一章:基于Visual C++ 6.0使用运动控制卡控制电机转动实验操作指导

    第一章:基于Visual C++ 6.0使用运动控制卡控制电机转动实验 文章目录 第一章:基于Visual C++ 6.0使用运动控制卡控制电机转动实验 一.实验目的: 1.学习运动控制卡的使用 2. ...

  4. 电机原理及电机拖动实验系统

    ZN-758LGJ电机原理及电机拖动实验系统 一.系统构成 1.实验装置采用立式机柜,机柜内采用模块化设计,功能分隔清晰,强弱电隔离,维护检修方便.保护功能齐全.机柜面板上设有基本单元电路模块,通过适 ...

  5. 单容水箱液位pid控制实验报告_实验二(单容水箱液位pid控制实验)实验报告电子版.doc...

    实验二(单容水箱液位pid控制实验)实验报告电子版 电子科技大学中山学院学生实验报告 系别: 机电工程学院 专业: 自动化 课程名称:过程控制与自动化仪表 班级: 自动化 姓名: 学号: 组别: 实验 ...

  6. PID温控实验平台搭建(一)——PID基础知识介绍

    PID温控实验平台搭建 (一)PID基础知识介绍 (二)PID进阶知识介绍及源码分享 (三)从零开始搭建STM32温控实验平台 (四)PID温控系统代码讲解 (五)最终实验现象与总结 文章目录 前言 ...

  7. PID温控实验平台搭建(二)——PID进阶知识介绍及源码分享

    PID温控实验平台搭建 (一)PID基础知识介绍 (二)PID进阶知识介绍及源码分享 (三)从零开始搭建STM32温控实验平台 (四)PID温控系统代码讲解 (五)最终实验现象与总结 文章目录 前言 ...

  8. 流体力学(水力学)满分实验报告——文丘里流量计

    流体力学(水力学)满分实验报告--文丘里流量计 实验目的 实验装置 [部分]实验原理 [部分]实验数据记录及处理 [部分]图像处理--绘图 [部分]Matlab原码 [部分]实验分析与讨论 心得体会与 ...

  9. PID温控实验平台搭建(四)——PID温控系统实验代码讲解

    PID温控实验平台搭建 (一)PID基础知识介绍 (二)PID进阶知识介绍及源码分享 (三)从零开始搭建STM32温控实验平台 (四)PID温控系统代码讲解 (五)最终实验现象与总结 文章目录 前言 ...

最新文章

  1. Outlook新邮件要双击打开后才显示为已读
  2. DP:Sumsets(POJ 2229)
  3. python3字典(Map)
  4. ant+jmeter中build.xml配置详解
  5. C# 8 新特性 - 只读struct成员
  6. proteus里面没有stm32怎么办_嵌入式单片机之stm32串口你懂了多少!!
  7. 生信老司机以中心法则为主线讲解组学技术的应用和生信分析心得—限时免费
  8. Part7 继承与派生 7.4派生类的构造和析构
  9. Spring : Spring profile 实现多环境支持
  10. nginx 负载均衡+keepalived实现双机热备
  11. AI 开发者的痛,华为云很懂
  12. 2019最有意思的五大 ZDI 案例之:通过调色板索引实现 Win32k.sys 本地提权漏洞(上)...
  13. paip.dom4j中 selectSingleNode 或selectNodes获取不到节点的原因总结
  14. STM32 FOC5.2电机库中中的电流采样改为反向放大
  15. L298N模块驱动电机(实现pwm调速)
  16. sklearn安装包下载
  17. 车型车系品牌api离线版 CarApi
  18. 网络SSID是什么意思
  19. Python40行代码爬取电影天堂的电影下载连接
  20. linux top命令看到的实存(RES)与虚存(VIRT)分析

热门文章

  1. eclipse 高效快捷键大全
  2. php分享三十三:用php中的register_shutdown_function和fastcgi_finish_request
  3. 11 个 Visual Studio 代码性能分析工具
  4. queued frame 造成图形性能卡顿
  5. 细说PHP中strlen和mb_strlen的区别
  6. Hadoop4.2HDFS测试报告之四
  7. BS程序代码与安全与基本攻击/防御模式
  8. UA MATH566 统计理论 Bayes统计基础
  9. UA MATH566 统计理论 位置-尺度参数族
  10. EasyUI datagrid控件的基本使用