如何理解PID?

news2024/12/25 2:53:27

1 理解PID

先说结论:调整开关量反馈更接近目标

这里拿水龙头打比方,我们想控制水龙头的出水量为一半,这里就涉及两个关键量,阀门和出水量;阀门,即上面说的开关量;出水量即反馈目标即一半的出水量;开关量的变化会让反馈随之变化。

实际操作是:我们慢慢打开阀门,即开关量在增加,同时出水量(反馈)也在增加;根据PID的算法,我们会一直将出水量与目标比较,当小于目标值时,会一直增加开关量,一当超过时就会减少开关量。

模型如下:

这里有一个很明显的特点:

开关量反馈是不同的东西,单位不一样,并没有直接的关系,也就是说没有直接公式能表达出转换关系,反馈是通过传感器或检测装置测量得到的。

这里再打另一个比方,控制四轴无人机在空中悬停,这里涉及的变量有:4路电机动力的PWM和无人机水平的欧拉角,据据PID算法,哪个轴的角度偏低了就加大PWM占空比,偏高就减少PWM占空比。

从这里可以看出,欧拉角度和PWM占空比并没有直接的关系公式。这里只涉及,根据角度偏离目标多少来调节PWM占空比的方法。比如,当角度偏离大时,PWM占空比可以一点一点增加;也可以偏离大时增加很多,当偏离小时增加小点;这此曲线特点就是由P参数、I参数和D参数决定的。

2 PID公式

Kp、Ki和Kd是公式系数,不同的值会产生不同的接近曲线。

Out(t) 是当前产生的输出,即开关量,如果是用于PWM,那就是占空比,如果要产生0~100的值,就需要调整Kp、Ki和Kd的值。

t表示这是一个循环定时调用的函数。

e(t) 是当前反馈和目标差值

是差值累加

 de(t) 是当前差值与上次差值的差值。

测试代码

#include <stdio.h>
#include <string.h>
#include <stdint.h>

typedef struct{
	double target; // 设定目标Target value
	double Kp; // 比例常数Proportional Const
	double Ki; // 积分常数Integral Const
	double Kd; // 微分常数Derivative Const
	double last_error; // Error
	double sum_error; // Sums of Errors
} _PID_t;

_PID_t PID; // PID Control Structure

double PIDCalc( _PID_t *pp, double feedback )
{
    double dError, Error, Out;
	
    Error = pp->target - feedback; // 偏差
    pp->sum_error += Error; // 积分		
    dError = Error - pp->last_error; // 当前微分    
    pp->last_error = Error;
	
	Out = (pp->Kp * Error // 比例项
    + pp->Ki * pp->sum_error // 积分项
    + pp->Kd * dError ); // 微分项
	
    return Out;
}

void PIDTarget (_PID_t *pp, double target )
{
	pp->target = target;
}

void PIDInit (_PID_t *pp)
{
	memset ( pp,0,sizeof(_PID_t));
}

int main()
{
	float speed = 0;
	float result;
	int i;
	
	PIDInit ( &PID ); // Initialize Structure
    PID.Kp = 2;
    PID.Ki = 0.1;
    PID.Kd = 0.0;
    PIDTarget(&PID, 50.0); // Set target
	
	speed = 0;
	for(i=0;i<50;i++)
	{
		speed+=1;
		result = PIDCalc(&PID,speed);
		printf("%f %f\n",result,speed);
	}
	
	for(i=0;i<10;i++)
	{
		speed-=1;
		result = PIDCalc(&PID,speed);
		printf("%f %f\n",result,speed);
	}
	
	for(i=0;i<10;i++)
	{
		speed+=1;
		result = PIDCalc(&PID,speed);
		printf("%f %f\n",result,speed);
	}
	return 0;
}

3 参数调试

从上面的分析可知,反馈和输出是不同单位的,两者并无直接关系。那么如何使输出符合开关量的范围?

3.1 Kp

Kp即P的系数,P全称是Proportional系数比例的意思,即Error的系数。

target为目标值

为起始反馈值

为输出范围

 

假设#1,target = 50, = 0,Kp = 0.04那么 = 50*0.04 = 2,即feedback由0->50时,Out则输出2~0。

 

 

 

假设#2,target = 50, = 100,Kp = 0.04那么 = -50*0.04 = -2,即feedback由0->50时,Out则输出-2~0。

 

 

 

由上可知,可以通过Kp将输出的范围变化到开关量的范围内。比如PWM的占空比0~100,没有负数,只需用到假设#1,我们把Kp=2, = 50*2 = 100,范围就在0~100。

 

 

3.2 Ki

Ki即I的系数,I全称是Integral系数积分的意思,即Error积分的系数。

target = 50, = 0,则最大的sum_error =  = 1275

该系数起到的效果是快速或缓慢接近目标,其值由0.01开始往上调,根据自己的需求确认靠近速度。

在上调时注意曲线,其值大到一定程度时曲线会变形,所以不能过大。

3.3 Kd

Kd即D的系数,D全称是Derivative系数积分,即dError微分的倍数。

从公式可以看出,Kd影响很小。

在Ki确定后,Kd也由0.01开始往上调,起到曲线微调作用。

4 实例调参

下面表格是pwm duty对应的电机转速:

pwm duty

speed

100

137

90

128

80

122

70

113

60

105

50

99

40

85

30

75

20

60

10

42

Speed的范围是0~137,那么缩放比例Kp = 100/137 = 0.73

Kp = 0.73, Ki = 0.1, Kd = 0.0, target = 60

由上图可知,红线到达60时,时间轴是30

 

Kp = 0.73, Ki = 0.2, Kd = 0.0, target = 60

由上图可知,红线到达60时,时间轴是12

 

Kp = 0.73, Ki = 0.3, Kd = 0.0, target = 60

由上图可知,红线到达60时,时间轴是接近5

Kp = 0.73, Ki = 0.3, Kd = 0.01, target = 60

 由上图可知,红线到达60时,时间轴是4

5提示

 个人理解,可能有偏颇的地方。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postman和jmeter的区别何在?

小伙伴们大家好呀&#xff0c;前段时间笔者做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xf…

推荐50个超实用的 Chrome 扩展,建议收藏!

今天来分享 50 个超实用的 Chrome 浏览器扩展&#xff01; JSON Viewer Pro JSON Viewer Pro 用于可视化JSON文件。其核心功能包括&#xff1a; 支持将JSON数据进行格式化&#xff0c;并使用属性或者图表进行展示&#xff1b;使用面包屑深入遍历 JSON 属性&#xff1b;在输入…

大势智慧与深信服签署战略合作协议,助推实景三维中国建设

7月28日&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;与深信服成功签署战略合作协议&#xff0c;双方将围绕“实景三维中国建设”和测绘行业数字化领域开展深度合作&#xff0c;共同为广大测绘行业用户打造一款灵活高效的测绘数据生产和存…

【CDC】跨时钟域处理方法总结一

文章目录 一、概述1.异步时序2.亚稳态与建立保持时间 二、跨时钟域处理1.控制信号的跨时钟域处理&#xff08;单bit数据&#xff09;a.慢时钟域到快时钟域b.快时钟域到慢时钟域握手“扩宽”快时钟域脉冲时钟停止法窄脉冲捕捉电路 2.数据信号的跨时钟域处理&#xff08;多bit数据…

C++动态内存管理(new和delete)

C动态内存管理 1. C中动态内存管理1.1 new/delete操作内置类型1.2 new和delete操作自定义类型 2. operator new与operator delete函数2.1 operator new与operator delete函数&#xff08;重点&#xff09;3. new和delete的实现原理3.1 内置类型3.2 自定义类型 4. 常见面试题4.1…

快速转换PDF文件: Python和PyMuPDF教程

解决问题 有时候将文档上传Claude2做分析&#xff0c;有大小限制&#xff0c;所以需要切割pdf文档为几个小点的文档&#xff0c;故才有了本文章。 如何用Python和PyMuPDF制作你想要大小的PDF&#xff1f; PDF是一种广泛使用的文件格式&#xff0c;可以在任何设备上查看和打印…

C#核心知识回顾——19.插入排序

1.插入排序的基本原理 871542639 两个区域 排序区 未排序区 用一个索引值做分水岭 未排序区元素 与排序区元素比较 插入到合适位置 直到未排序区清空 int[] arr { 8, 6, 7, 2, 9, 4 };//第一步//能取出未排序区…

防御第六次作业-文案

1.录制一个讲解密码学综合应用视频&#xff0c;参考讲义中的综合应用图 过程&#xff1a; 发送者为Alice 接受者为Bob 首先对原始信息进行hash运算得到信息摘要&#xff0c;然后使用私钥进行签名&#xff08;签名的作用是验证该信息是Alice的&#xff09;&#xff0c;然后将…

设备类资产盘点报告系统怎么处理?

对于一个企业或者公司来说&#xff0c;掌握公司资产的实际情况是最基本的。要知道公司的资产&#xff0c;主要工作内容之一就是固定资产盘点。对于资产盘点&#xff0c;有一些应用。Excel人力资源方式&#xff0c;有的则采用固定资产管理系统。 RFID固定资产管理系统是指通过射…

Footprint Analytics 宣布 20+ 链 API 免费增速,助力熊市 buidler

7 月 31 日&#xff0c;web3 数据供应商 Footprint Analytics 宣布其 API 产品的重大更新。 此次升级不仅大幅提升了 API 产品调用速度限制&#xff0c;还开放了包括 Ethereum, BNB, Polygon, zkSync 等在内的 20 公链的免费数据调用。 此外&#xff0c;Footprint 还更新了新…

【网络】传输层

目录 一、端口号 1、端口号范围划分 2、知名端口号(Well-Know Port Number) 3、netstat 4、pidof 二、UDP协议 1、UDP协议段格式 2、UDP的特点 3、面向数据报 4、UDP的缓冲区 5、UDP使用注意事项 6、基于UDP的应用层协议 三、TCP协议 1、TCP协议段格式 2、确认应…

vim、awk、tail、grep的使用

vim命令 $定位到光标所在行的行末^定位到光标所在行的行首gg定位到文件的首行G定位到文件的末行dd删除光标所在行ndd删除n行&#xff08;从光标所在行开始&#xff09;D删除光标所在行&#xff0c;使之变为空白行x删除光标所在位置字符nx删除n个字符&#xff0c;从光标开始向后…

mac屏幕提词器Presentation Prompter for mac

Presentation Prompter是一款专业的电脑提词器软件&#xff0c;主要用于辅助演讲者、主持人等在演讲或演示过程中更加流畅地展示内容。它可以将文字以滚动或分页的形式显示在屏幕上&#xff0c;帮助演讲者在不中断演讲的情况下更好地掌控演讲进度。 以下是Presentation Prompt…

城市内涝积水监测预警系统的重要性

一、系统概述 随着我国城镇化快速发展&#xff0c;城市建设产生的大量地面硬底化&#xff0c;大部分的降雨将形成地表径流&#xff0c;仅有少量雨水渗入地下&#xff0c;导致城市内涝等一系列问题。当前&#xff0c;全国多地发生洪涝&#xff0c;我国南北方全面进入主汛期。需要…

【数据库】mysql调用过程函数生成日期维表

写在前面的话 第一次使用sql中的函数部分&#xff0c;本文会记录sql函数的一些基础语法&#xff0c;如果你已经很熟练&#xff0c;请忽视掉 创建日期维表 使用环境 Navicat 12 创建存储日期的表&#xff08;日期&#xff0c;日期的不同的表达形式&#xff0c;这一年的第几周&…

瑞芯微原厂源码目录介绍2-RK3568

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言顶层目录分析out 目录system 目录frameworks 目录了解目录有什么意义 前言 在上一个小节中&#xff0c;下载并解压了瑞芯微提供的 Android 源码&#xff0c;解…

51单片机学习--LED点阵屏显示图形动画

为了通用性考虑&#xff0c;需要把用到的几个口用特殊位声明来重新命名&#xff0c;由于RCLK在头文件中已有定义&#xff0c;所以这里把P3^5声明成RCK吧。。这样的做法可以提高可读性 sbit RCK P3^5; //RCLK sbit SCK P3^6; //SRCLK sbit SER P3^4;接下来编写74HC595的输…

开源软件包存储库存在1200+恶意包,供应链安全何去何从

一、前言 2020年12月13日&#xff0c;网络安全公司FireEye发布分析报告&#xff0c;称全球最著名的网络安全软件供应商SolarWinds遭受供应链攻击并被植入木马后门&#xff0c;影响版本为2019.4 HF 5 - 2020.2.1&#xff1a;使用该产品的机器可被攻击者完全操控。根据SolarWind…

前端学习——Vue (Day9)

Pinia 快速入门 https://pinia.vuejs.org/zh/getting-started.html npm install pinia import { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst pinia createPinia() const app createApp(App)app.use(pinia) app.mount(#app)&l…

2分钟大白话:什么是大数据架构。人人好懂

问题背景 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;尼恩一直指导大家写简历&#xff0c;做面试&#xff0c;最高的拿到年薪近100W。 昨天指导 一个 阿里 p6 小伙写简历&#xff0c;做面试。在帮他 挖掘简历亮点时&#xff0c;发现他项目在Java上没有什么技术亮点&…