简单讲一下控制系统所用的PID公式

2025年3月23日电子电工实验室讲课大纲

  哈喽,小伙伴们大家好,今天我们来讲一下PID!首先我们的针对的场景是什么——循迹小车!

        就是我们刚入手STM32时,我们可能会制作一个循迹小车。我们想让那个小车走直线,但它怎样才能走直线呢?你给他设置两个相同的PWM,它能不能走直线呢?不能吧,因为两个轮子制作工艺在微观上它是不可能完全一样的,也是这个原因造成了我们的两个轮子。

        它速度不一样,可能,你一放下去,这个车就走成一个圆了,对不对。所以我们就要引入我们的一个PID公式来使我们的车走直线。然后基本的原理呢,其实通过不断地改变作用到电机的PWM量,使两个轮子速度看起来一样。

        先来看一下PID,它到底是什么东西吧,看这里!有浏览器搜索到的结果,它说。是一个控制系统中。通过三个项的组合来输出一个值,然后控制我们的系统稳定。嗯……也就说它是一个公式了。

通过调节作用到电机的PWM值来使两个轮子的速度一样,从而走直线……

       好,那我们看一下这个PID原理图啊,这里是说。这个是我们的一个目标值,然后通过三个项后输出一个值作用到我们的一个东西上,然后再输出作用到某一个东西上,然后呢,这里是一个反馈值。那针对于我们的小车这个场景啊,目标指的是什么?速度吧。输入一个目标速度,输出的是PWM吧,然后作用到什么地方上,是作用到电机上吧。对,然后反馈就是什么?反馈就是我们的编码电机,或者说你用到其他的那些可以测速的传感器测到的一个轮子的转速,就相当于我们的实际速度,是吧?!

 我们来看一下代码公式,一般我们调节系数时,其他设为0,先改变我们的P。

这是我们的PID核心部分。可以看到说我们通过P这个系数乘以一个误差,然后得到了一个输出结果。然后误差是什么?是我们的一个to get,是目标速度减去我们的实际编码编辑获取到的一个速度。也就是说我们这个函数它是有输入两个参数的。得到的误差*P之后输出一个结果,也就是PWM输出结果。然后这个一部分呢我们先不看好,回过头来我们来看一下。

     

 好,然后我们打开WPS,来简单演示一下这个公式。为什么要用到这个WPS呢?这是我当初在一个也是在B站上刷到的一个博主,他用这个讲的,我觉得讲的特别的好,可以说是启蒙老师啊。那我就长江后浪推前浪,我再来讲讲。嗯……首先看一下这是P项的系数啊,这是D项的系数呀,

        这是一个干扰。干扰是什么?就比如说我们的小车在行驶过程中可能会遇到一个坡度啊,这会不会对我们的速度有结果有干扰,然后是我们的轮子的一个摩擦力啊,它是不是干扰?它们会直接影响到我们的速度,对不对?

好,I也是一个作用项,然后这个图是什么呢?横轴是我们第几次执行后的结果一个坐标,就看做是时间就行了。也就是说我们的PID公式啊,在某一次在程序执行的过程中,它会输出一个结果嘛!这个图就相当于把这个结果图形画出来了。

       我们来看一下吧,目标是100,也就是说我们的可能目标速度就是100。然后我们的初始值,也就是说我们的初始速度可能是0。嗯,我们的P就是一个系数,就是这条曲线的我为达到目的的这条曲线的斜率一样。

我们通过改变这个P可以让我们很直观的感受到我们达到目标值的时间变短了。但它如果它比较大呢,会遇到一个什么问题?比如说我们设置到一看看,这个曲线变陡了,但这个没什么关系。如果说如果说我们给他设到2呢,哎这是为何?你猜一下?我们的误差有100的时候,它的补偿就是200。然后我们的目标是目标值是100,哎,他却已经达到200。那这个时候我们就是要到下一次执行的时候呢,它就是-100,也就是说它成了一个这样的形状,看到没有?它成了一个这样的形状。过度补偿了,就导致我们的电机可能就会一下正转、一下反转。那这种情况下我们也就是说我们调节这个P参数了。P越小的话应该是比较好调的。但是你也可能要看实际情况,具体情况具体分析。好,我们再改回来,改成0.9吧。当然我们这个WPS上只是简单讲解一下它的原理啊。

好,我们可以看到一个P好像就已经实现到了我们的目的,从0到100。可惜呀我们还有干扰啊,在实际开发的过程中,我们肯定是有很多很多干扰的。然后这个干扰就会导致什么?我们要达到100,但是因为一个干扰,它达不到那个100了。因为我们的干扰是作用到结果上的。

好,那这个时候我们就引入到了另外一项了,也就是我们的这个积分项,通过对当前时刻、以前的误差进行一个求和乘以 我们那个系数。然后再作用回我们的补偿上。好,我们先给大家看一下效果,0.1,这个东西不能太大!好,挺好的。我们的曲线在干扰的作用下,也达到了我们的目标结果。

这样我们就达到了循迹小车走直线的目的了吧。最后,我们再来看一下,D的作用是什么吧。就是说当我们的I比较大的情况下呢,形成了什么样的效果?就因为刚开始的时候误差比较大,然后我们积分的补偿也比较大。在实际开发过程中,我们的PID代码可能是十几ms运行一次,积分是对误差的一个累积嘛,短时间内不调节好就会爆炸式增长,此时就可能是积分项做主导作用到我们的补偿上。然后输出结果就有点过度补偿了。然后这种情况下我们就通过改变一个D看一下效果啊。我们记住它这个地方最大值是多少,最大值是xxx,那我们就用一个D,来使变化量平缓一点。你看我们通过一个D抑制了增大,对吧?这就是我们的微分效果,就能这个抑制这个突然增大的那种毛刺的那个东西,因为变化量越大,他的值也就越大。好了,我们的PID就这样讲完了。

注意我们在实际的使用当中,对于小车直线行驶的这个场景,D我们一般是不用的。这个是PID应用的一种、也叫速度环,也就是我们只需要控制它的速度的话,前面这两个参数就够了。也许加上D的话可能效果更好吧,但是无疑大大增加了参数调节难度,不如只用前面两个参数。

使用PID公式的细节:

1.限制PID输入到电机的PWM范围(不可越界)

2.代码执行语句放在哪里执行? 

一般我们是放在中断里面。不能放主函数里。因为主函数的执行周期会随着代码量的改变而改变

代码执行语句的周期是越短越好,但太短也造成CPU处理资源的浪费,不是么。

3.参数调节——可以使用上位机,比如匿名上位机

在小车运行的过程中,通过串口输出一个数值到上位机,上位机读取后在坐标轴上显示出来。还能边运行边参数, 提高效率。甚至还有大佬开发了自动调参的上位机(当然,也需要手动优化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直观理解ECC椭圆曲线加密算法

数学还是挺有逻辑的,给出计算的操作步骤 就能得出想要结果 背景: ● ECC 是一种极其巧妙的 非对称加密算法 , 其完美利用了 椭圆曲线几何累加 不可逆的性质 ● 拥有 密钥体积小,计算速度快的优势,被广泛用于各种区块链&#xff0c…

深度解析 Android Matrix 变换(二):组合变换 pre、post

前言 在上一篇文章中,我们讲解了 Canvas 中单个变换的原理和效果,即缩放、旋转和平移。但是单个旋转仅仅是基础,Canvas 变换最重要的是能够随意组合各种变换以实现想要的效果。在这种情况下,就需要了解如何组合变换,以…

c++之迭代器

一.迭代器的基本概念 1.什么是迭代器 迭代器是一种对象,它提供了一种访问容器中各个元素的方法,同时隐藏了容器内部的实现细节。简单来说,迭代器就像是一个指针,它可以指向容器中的某个元素,并且能够通过一些操作&am…

在 .NET 9.0 Web API 中实现 Scalar 接口文档及JWT集成

示例代码:https://download.csdn.net/download/hefeng_aspnet/90408075 介绍 随着 .NET 9 的发布,微软宣布他们将不再为任何 .NET API 项目提供默认的 Swagger gen UI。以前,当我们创建 .NET API 项目时,微软会自动添加 Swagger…

【操作系统笔记】操作系统的功能

上节课,我们学习了《什么是操作系统》。接下来,我们来看看操作系统有哪些功能? 这里讲的内容有两部分,一个是操作系统的目标,另外一个就是操作系统的功能。这两个细节可能会在考试的时候考到,但是最近好些年很少考到了。为了理解,我们还是一起来看一下。 操作系统的目标…

C/C++蓝桥杯算法真题打卡(Day7)

一、P8723 [蓝桥杯 2020 省 AB3] 乘法表 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> // 包含标准库中的所有头文件&#xff0c;通常用于竞赛编程中简化代码 using namespace std; // 使用标准命名空间&#xff0c;避免每次调用标准库函数时都要加std:: ty…

数据结构5(初):排序

目录 1、排序的概念以及常见的排序算法 1.1、排序的概念 1.2、常见的排序算法 2、常见排序算法的实现 2.1、插入排序 2.1.1、直接插入排序 2.1.2、希尔排序 2.2、选择排序 2.2.1、直接选择排序 2.2.2、堆排序 2.3、交换排序 2.3.1、冒泡排序 2.3.2、快速排序 2.3.…

VS2022中通过VCPKG安装的ceres之后调试ceres的例程设置

1.采用C20. vcpkg中设置: 2.增加预处理宏: GLOG_USE_GLOG_EXPORT 3.屏蔽sdl错误 在 项目-属性-C/C -命令行中添加 /sdl /w34996 #include "ceres/ceres.h" //#include <iostream> //#include<glog/logging.h>using ceres::AutoDiffCostFunction; usi…

Pydantic字段级校验:解锁@validator的12种应用

title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: Pydantic校验系统支持通过pre验证器实现原始数据预处理,在类型转换前完成字符清洗等操作。格式验证涵盖正则表达式匹配与枚举值约束,确保护照编号等字…

函数递归和迭代

1.什么是递归&#xff1f; 在C语言中递归就是自己调用自己。 看一下简单函数的递归&#xff1a; 上面的代码实现演示一下函数的递归&#xff0c;最终是会陷入死循环的&#xff0c;栈溢出 。 1.1递归的思想&#xff1a; 把一个大型的问题一步一步的转换成一个个小的子问题来解…

发票查验/发票验真如何用Java实现接口调用

一、什么是发票查验&#xff1f;发票验真接口&#xff1f; 输入发票基本信息发票代码、发票号码、开票日期、校验码后6位、不含税金额、含税金额&#xff0c;核验发票真伪。 该接口也适用于机动车、二手车销售发票、航空运输电子客票、铁路电子客票等。 二、如何用Java实现接口…

AM32-MultiRotor-ESC项目固件编译和烧录方法介绍

AM32-MultiRotor-ESC项目固件编译和烧录方法介绍 &#x1f4cd;AM32-MultiRotor-ESC项目地址:https://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware&#x1f388;Updater with V8 Bootloader&#xff1a; https://github.com/AlkaMotors/F051_Bootloader_Updater&#…

HarmonyOS:@AnimatableExtend 装饰器自学指南

在最近的项目开发中&#xff0c;我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中&#xff0c;我发现了 AnimatableExtend 装饰器&#xff0c;它为实现动画效果提供了一种非常灵活且强大的方式。然而&#xff0c;在学习这个装饰器的过程中&#xff0c;我发现相关的…

Windows server 2022域控制服务器的配置

Windows server 2022介绍 一、核心特性与改进 安全核心服务器&#xff08;Secured-Core Server&#xff09; 硬件级安全&#xff1a;支持基于硬件的安全功能&#xff08;如TPM 2.0、Secure Boot、基于虚拟化的安全防护VBS&#xff09;&#xff0c;防止固件攻击。受信任的启动链…

C++语法之模板函数和模板类

模板函数是什么&#xff1f;就是不指定类型的函数&#xff0c;不指定类型如何写代码?所以得用到模板&#xff0c;可以先用模板代替&#xff0c;就好像方程式&#xff0c;先用x,y代替一样。 它的写法是这样&#xff0c;定义函数时&#xff0c;开头加一句:(其中的T就相当于x,y之…

时序分析笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、周期约束 二、建立时间和保持时间 三、时序路径 四、时序模型 前言 约束文件笔记&#xff0c;傅里叶的猫的视频。 一、周期约束 时序约束就是告诉软件输…

六十天前端强化训练之第二十八天之Composition 函数完全指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、核心概念解析 1.1 什么是 Composition 函数 1.2 为什么需要封装 1.3 设计原则 二、实战案例&#xff1a;鼠标跟踪器 2.1 未封装版本 2.2 封装后的 Composition 函数…

MySQL 锁机制详解

MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…

常见中间件漏洞攻略-Apache篇

漏洞名称&#xff1a;Apache HTTP Server 路径穿越漏洞-CVE-2021-41773 第一步&#xff1a;拉取环境、启动环境 #拉取环境 docker pull blueteamsteve/cve-2021-41773:no-cgidhttp://121.40.229.129:8080#启动环境 docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:n…

站群服务器是什么意思呢?

站群服务器是一种专门为托管和管理多个网站而设计的服务器&#xff0c;其核心特点是为每个网站分配独立的IP地址。这种服务器通常用于SEO优化、提高网站权重和排名&#xff0c;以及集中管理多个网站的需求。以下是站群服务器的详细解释&#xff1a; 一、站群服务器的定义 站群…