首页 > 编程语言 >什么是PID/PID算法

什么是PID/PID算法

时间:2024-08-09 18:55:38浏览次数:12  
标签:误差 ek 什么 float PID 算法 LIMIT out

什么是PID?
一、PID的基本概念
PID控制算法通过计算误差(即系统输出与期望值之间的差值),并基于该误差进行比例、积分和微分运算,来调整系统的控制输入,以实现快速、准确的控制。PID控制因其结构简单、稳定性好、工作可靠、调整方便等特点,成为工业控制中的主要技术之一。

详情了解视频pid控制算法讲解

二、PID的三个组成部分及其作用
比例控制器(P):
作用:根据控制误差的大小,以比例放大的方式对反馈信号进行修正。比例常数(Kp)决定了修正的幅度。当误差增大时,修正幅度也会增大,有助于加快系统的响应速度并抑制系统震荡。
特点:比例控制提供了快速的响应能力,但单独使用时可能无法完全消除稳态误差。
积分控制器(I):
作用:根据控制误差的积分(即误差的累积值),以增量放大的方式对反馈信号进行修正。积分项可以消除稳态误差,使系统的响应更为平滑。积分常数(Ki)决定了修正的速度。
特点:积分控制有助于减小系统的稳态误差,但在系统存在较大波动时可能导致积分饱和,影响系统的稳定性。
微分控制器(D):
作用:根据控制误差的变化率(即误差的变化速度),以微分放大的方式对反馈信号进行修正。微分项可以预测误差的变化趋势,从而提前采取控制措施,抑制系统的超调和振荡。微分常数(Kd)决定了修正的灵敏度。
特点:微分控制具有预见性,能够提前调整控制输入以应对误差的变化,提高系统的稳定性和响应速度。
三、PID的应用领域
PID控制算法因其广泛的适用性和良好的控制效果,被广泛应用于工业自动化、机器人控制、飞行器导航、医疗设备、汽车电子、家用电器等多个领域。在这些领域中,PID控制用于调节温度、压力、速度、位置等物理量,以实现精确的控制目标。

四、PID参数的调整与优化
PID参数的调整是控制工程中的一个重要问题。传统的方法是通过试错法和经验进行参数调整,但这种方法往往效率较低。近年来,随着优化算法和自适应控制方法的发展,人们开始将这些方法应用于PID控制器的设计中,以实现更快、更准确的参数调节和控制系统性能的优化。

综上所述,PID是一种基于比例、积分和微分运算的反馈控制算法,通过综合调整比例、积分和微分控制器的输出,实现对系统的精确控制。它在工业控制和其他多个领域中发挥着重要作用。

常见的PID的算法及代码示例
PID(比例-积分-微分)算法是控制系统中常用的一种反馈控制算法,它通过计算误差的比例、积分和微分来调整控制输入,以达到预定的控制目标。以下是一些常见的PID算法及代码示例:

一、常见的PID算法
位置式PID算法
位置式PID算法直接计算控制量的绝对值,每次输出都与过去的状态有关,因此计算量相对较大。其计算公式为:u(k)=Kpe(k)+Ki∑j=0ke(j)+Kd[e(k)−e(k−1)]
其中,u(k) 是第 k 次的控制量,e(k) 是第 k 次的误差,K
p、Ki、Kd 分别是比例、积分、微分系数。
增量式PID算法
增量式PID算法只计算控制量的增量,即本次控制量与上一次控制量之差,因此计算量相对较小,且更易于实现无扰动切换。其计算公式为:Δu(k)=Kp[e(k)−e(k−1)]+Kie(k)+Kd[e(k)−2e(k−1)+e(k−2)]
实际应用中,控制量 u(k) 可通过累加增量 Δu(k) 来获得。
二、代码示例
pid.c

#include "stm32f10x.h"
#include <math.h>
#include "sys.h"
#include "pid.h"
#define PID_LIMIT_MIN -10000		//PID输出最低值
#define PID_LIMIT_MAX 10000	//PID输出最大值
//注意:PID结构体必须定义为全局变量或静态变量,然后在函数中给KP,KI,KD赋值
/************************采样周期未知且不变************************************/
//位置式PID
//pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
//setvalue : 设置值(期望值)
//actualvalue: 实际值
//由于全量输出,每次输出均与过去状态有关,计算时要对ek累加,计算量大
float PID_location(float setvalue, float actualvalue, PID_LocTypeDef *PID)
{ 
	PID->ek =setvalue-actualvalue;
	PID->location_sum += PID->ek;                         //计算累计误差值
	if((PID->ki!=0)&&(PID->location_sum>(PID_LIMIT_MAX/PID->ki))) PID->location_sum=PID_LIMIT_MAX/PID->ki;
	if((PID->ki!=0)&&(PID->location_sum<(PID_LIMIT_MIN/PID->ki))) PID->location_sum=PID_LIMIT_MIN/PID->ki;//积分限幅
	
  PID->out=PID->kp*PID->ek+(PID->ki*PID->location_sum)+PID->kd*(PID->ek-PID->ek1);
  PID->ek1 = PID->ek;  
	if(PID->out<PID_LIMIT_MIN)	PID->out=PID_LIMIT_MIN;
	if(PID->out>PID_LIMIT_MAX)	PID->out=PID_LIMIT_MAX;//PID->out限幅
	
	return PID->out;
}
//增量式PID
//pidout+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
//setvalue : 设置值(期望值)
//actualvalue: 实际值
float PID_increment(float setvalue, float actualvalue, PID_LocTypeDef *PID)
{                                
	PID->ek =setvalue-actualvalue;
  PID->out+=PID->kp*(PID->ek-PID->ek1)+PID->ki*PID->ek+PID->kd*(PID->ek-2*PID->ek1+PID->ek2);
//	PID->out+=PID->kp*PID->ek-PID->ki*PID->ek1+PID->kd*PID->ek2;
  PID->ek2 = PID->ek1;
  PID->ek1 = PID->ek;  
		
	if(PID->out<PID_LIMIT_MIN)	PID->out=PID_LIMIT_MIN;
	if(PID->out>PID_LIMIT_MAX)	PID->out=PID_LIMIT_MAX;//限幅
	
	return PID->out;
}
pid.h
#ifndef __PID_H
#define __PID_H
 
#include "stm32f10x.h"
#include <math.h>
#include "sys.h"
 
typedef struct
{
  float kp;                       //比例系数Proportional
  float ki;                       //积分系数Integral
  float kd;                       //微分系数Derivative
//	float ti;                       //积分时间常数
//  float td;                       //微分时间常数
//	float period;										//采样周期
  float ek;                       //当前误差
  float ek1;                      //前一次误差e(k-1)
  float ek2;                      //再前一次误差e(k-2)
  float location_sum;             //累计积分位置
	float out;											//PID输出值
}PID_LocTypeDef;
float PID_location(float setvalue, float actualvalue, PID_LocTypeDef *PID);
float PID_increment(float setvalue, float actualvalue, PID_LocTypeDef *PID);
#endif

注意:上述代码,在实际应用中,可能需要使用操作系统的定时器或中断来实现。

标签:误差,ek,什么,float,PID,算法,LIMIT,out
From: https://www.cnblogs.com/ljw-boke/p/18351344

相关文章

  • 等级+时间的优先级算法
    简介本算法为等级与时间结合计算对应优先级逻辑等级越高者优先级越高同等级下,时间越小者优先级越高实现主方法calculatePriorityimportcom.zk.blog.enums.TypeEnum;importorg.apache.commons.lang3.StringUtils;/***@program:*@description:*@author:zk......
  • Day24 第七章 回溯算法part03
    目录任务78.子集思路90.子集II思路93.复原IP地址思路心得体会任务78.子集给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。思路和组合问题类似,思路是从序列中每次选一个,选的深度......
  • 如何安全高效地进行企业文档外发,一文了解什么是文档安全系统密文外发!
    企业文档的外发已成为日常工作中不可或缺的一环。然而,随着数据泄露事件的频发,如何安全高效地外发文档成为了企业关注的焦点。今天,就让我们一起深入了解文档安全系统的密文外发技术,为企业信息安全保驾护航。什么是文档安全系统密文外发?文档安全系统密文外发,是一种基于先进......
  • 分布式存储和集中式存储的区别是什么?应用场景是什么?
    原文链接:https://www.jb51.net/blockchain/944935.html在数字领域中,会有分布式存储和集中式存储这两概念,分布式存储是指数据分布在多个存储节点上,这些节点可以位于不同的地理位置。集中式存储是指所有数据都存储在一个单一的中央服务器或数据中心中。关于这两种存储方式,很多新手......
  • Day23 第七章 回溯算法part02
    目录任务39.组合总和思路40.组合总和II思路131.分割回文串思路心得体会任务39.组合总和给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些......
  • 【Leetcode 169 】 多数元素——投票算法要把我迷倒了
     给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==nums......
  • 在此出现导入错误,不确定是什么损坏了
    `importtimeimportsmtplibfromemail.mime.textimportMIMETextfromgoogle.auth.transport.requestsimportAuthorizedSessionfromgoogle.oauth2.service_accountimportCredentialsimportyamldefload_config(config_path='config.yaml'):w......
  • 为什么 True/False 在 Python 中要大写?
    所有成员都是骆驼案吧?为什么True/False而不是true/false,哪个更宽松?在Python中,True和False使用大写而不是小写,这与语言的禅宗(设计原则)和它们在Python中的特殊地位有关。让我们来分析一下:1.特殊地位:在Python中,True和False......
  • 代码随想录算法训练营day08|344.反转字符串,541.反转字符串II,卡码网:54.替换数字
    344.反转字符串题目链接:https://leetcode.cn/problems/reverse-string/description/我的代码:classSolution{public:voidreverseString(vector<char>&s){for(inti=0;i<s.size()/2;i++){chartemp=s[i];s[i]=......
  • 供应链库存管理面临什么问题?全面解析安全库存和周转库存!
    在当今这个快速变化的商业世界中,供应链管理已成为企业获取竞争优势的核心领域。库存管理,作为供应链中的关键环节,直接关系到企业的成本控制、客户服务水平以及市场响应速度。然而,面对市场竞争的加剧和客户需求的多变,传统的库存管理方法已难以满足现代企业的发展需求。本文将深入......