PID 控制技术深度剖析:从基础原理到高级应用

在这里插入图片描述
在这里插入图片描述
最近在项目中有要开始进行PID的控制了,隔了很久没有做PID控制的东西了,所以想正好借这个机会,温习一下和PID有关的内容。

系列文章目录

PID控制技术深度剖析:从基础原理到高级应用(一)
PID控制技术深度剖析:从基础原理到高级应用(二)
PID控制技术深度剖析:从基础原理到高级应用(三)
PID控制技术深度剖析:从基础原理到高级应用(四)
PID控制技术深度剖析:从基础原理到高级应用(五)


文章目录

  • PID 控制技术深度剖析:从基础原理到高级应用
  • 系列文章目录
    • 七、PID 控制的 C 语言实现示例
      • 7.1 位置式 PID 控制的 C 语言实现
      • 7.2 增量式 PID 控制的 C 语言实现
      • 7.3 抗积分饱和 PID 控制的 C 语言实现
      • 7.4 模糊 PID 控制的 C 语言实现
      • 7.5 自适应 PID 控制的 C 语言实现
    • 八、总结与展望
      • 8.1 PID 控制的优势与局限
      • 8.2 PID 控制的发展趋势
      • 8.3 实际应用建议


七、PID 控制的 C 语言实现示例

7.1 位置式 PID 控制的 C 语言实现

以下是一个位置式 PID 控制器的 C 语言实现示例:

typedef struct {float Kp;        // 比例系数float Ki;        // 积分系数float Kd;        // 微分系数float setpoint;  // 设定值float last_error; // 上一次的误差float integral;  // 积分项float output_min; // 输出最小值限制float output_max; // 输出最大值限制
} PIDController;// PID控制器初始化函数
void PID_Init(PIDController *pid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->setpoint = setpoint;pid->last_error = 0.0;pid->integral = 0.0;pid->output_min = output_min;pid->output_max = output_max;
}// PID计算函数
float PID_Compute(PIDController *pid, float feedback) {float error = pid->setpoint - feedback;float P = pid->Kp * error;pid->integral += error;float I = pid->Ki * pid->integral;float D = pid->Kd * (error - pid->last_error);float output = P + I + D;// 输出限幅if (output > pid->output_max) {output = pid->output_max;} else if (output < pid->output_min) {output = pid->output_min;}// 保存当前误差用于下一次计算pid->last_error = error;return output;
}

代码说明

  1. PIDController结构体包含了 PID 控制器的所有参数和状态变量。

  2. PID_Init函数用于初始化 PID 控制器的参数。

  3. PID_Compute函数根据当前反馈值计算控制输出,实现了位置式 PID 算法。

  4. 代码中包含了输出限幅处理,防止控制量超出安全范围。

  5. 积分项integral累积了所有历史误差,这是位置式 PID 的关键特性。

7.2 增量式 PID 控制的 C 语言实现

以下是一个增量式 PID 控制器的 C 语言实现示例:

typedef struct {float Kp;        // 比例系数float Ki;        // 积分系数float Kd;        // 微分系数float setpoint;  // 设定值float last_error; // 上一次的误差float prev_error; // 上上次的误差float output_min; // 输出最小值限制float output_max; // 输出最大值限制
} IncrementalPIDController;// 增量式PID控制器初始化函数
void IncrementalPID_Init(IncrementalPIDController *pid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->setpoint = setpoint;pid->last_error = 0.0;pid->prev_error = 0.0;pid->output_min = output_min;pid->output_max = output_max;
}// 增量式PID计算函数
float IncrementalPID_Compute(IncrementalPIDController *pid, float feedback) {float error = pid->setpoint - feedback;float delta_P = pid->Kp * (error - pid->last_error);float delta_I = pid->Ki * error;float delta_D = pid->Kd * (error - 2 * pid->last_error + pid->prev_error);float delta_output = delta_P + delta_I + delta_D;// 输出限幅if (delta_output > pid->output_max) {delta_output = pid->output_max;} else if (delta_output < pid->output_min) {delta_output = pid->output_min;}// 保存误差用于下一次计算pid->prev_error = pid->last_error;pid->last_error = error;return delta_output;
}

代码说明

  1. IncrementalPIDController结构体包含了增量式 PID 控制器的所有参数和状态变量。

  2. IncrementalPID_Init函数用于初始化增量式 PID 控制器的参数。

  3. IncrementalPID_Compute函数根据当前反馈值计算控制量增量,实现了增量式 PID 算法。

  4. 增量式 PID 不需要积分项,而是通过计算当前误差与前两次误差的关系来确定控制增量。

  5. 每次调用IncrementalPID_Compute函数返回的是控制量的增量,而不是绝对输出值。

7.3 抗积分饱和 PID 控制的 C 语言实现

积分饱和是 PID 控制中常见的问题,当误差持续存在时,积分项会不断累积导致输出饱和。以下是一个具有抗积分饱和功能的 PID 控制器实现示例:

typedef struct {float Kp;        // 比例系数float Ki;        // 积分系数float Kd;        // 微分系数float setpoint;  // 设定值float last_error; // 上一次的误差float integral;  // 积分项float output_min; // 输出最小值限制float output_max; // 输出最大值限制
} AntiWindupPIDController;// 抗积分饱和PID初始化函数
void AntiWindupPID_Init(AntiWindupPIDController *pid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->setpoint = setpoint;pid->last_error = 0.0;pid->integral = 0.0;pid->output_min = output_min;pid->output_max = output_max;
}// 抗积分饱和PID计算函数
float AntiWindupPID_Compute(AntiWindupPIDController *pid, float feedback) {float error = pid->setpoint - feedback;float P = pid->Kp * error;// 条件积分:只有当输出未达到极限时才更新积分项if (!((P > pid->output_max && error > 0) || (P < pid->output_min && error < 0))) {pid->integral += error;}float I = pid->Ki * pid->integral;float D = pid->Kd * (error - pid->last_error);float output = P + I + D;// 输出限幅if (output > pid->output_max) {output = pid->output_max;} else if (output < pid->output_min) {output = pid->output_min;}// 保存当前误差用于下一次计算pid->last_error = error;return output;
}

代码说明

  1. 在计算积分项时,首先检查当前的比例项输出是否已经达到了输出限制。

  2. 如果比例项输出已经达到限制,说明系统已经处于饱和状态,此时停止积分项的累积,避免积分饱和。

  3. 只有当输出未达到限制时,才继续累积积分项,这样可以有效防止积分饱和导致的控制性能下降。

  4. 其他部分与标准的位置式 PID 实现类似。

7.4 模糊 PID 控制的 C 语言实现

以下是一个模糊 PID 控制器的 C 语言实现示例:

// 模糊PID控制器结构体
typedef struct {PIDController pid;          // 基础PID控制器FuzzyController fuzzy;      // 模糊控制器float error;                // 当前误差float last_error;           // 上一次误差float error_rate;           // 误差变化率
} FuzzyPIDController;// 模糊PID初始化函数
void FuzzyPID_Init(FuzzyPIDController *fpid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {PID_Init(&fpid->pid, Kp, Ki, Kd, setpoint, output_min, output_max);Fuzzy_Init(&fpid->fuzzy); // 模糊控制器初始化fpid->error = 0.0;fpid->last_error = 0.0;fpid->error_rate = 0.0;
}// 模糊PID计算函数
float FuzzyPID_Compute(FuzzyPIDController *fpid, float feedback) {// 计算误差和误差变化率fpid->error = fpid->pid.setpoint - feedback;fpid->error_rate = (fpid->error - fpid->last_error) / sample_time;// 模糊推理调整PID参数Fuzzy_AdjustParameters(&fpid->fuzzy, fpid->error, fpid->error_rate);// 更新PID参数PID_SetParameters(&fpid->pid, fpid->fuzzy.Kp, fpid->fuzzy.Ki, fpid->fuzzy.Kd);// 计算PID输出float output = PID_Compute(&fpid->pid, feedback);// 保存当前误差用于下一次计算fpid->last_error = fpid->error;return output;
}

代码说明

  1. 模糊 PID 控制器由一个基础 PID 控制器和一个模糊控制器组成。

  2. 模糊控制器根据当前误差和误差变化率调整 PID 参数。

  3. Fuzzy_AdjustParameters函数实现模糊推理过程,根据输入的误差和误差变化率调整 PID 参数。

  4. 模糊 PID 控制器的参数调整周期通常与 PID 计算周期相同,或者略长。

  5. 模糊控制器的具体实现需要根据模糊规则和隶属函数来设计。

7.5 自适应 PID 控制的 C 语言实现

以下是一个基于模型参考的自适应 PID 控制器的 C 语言实现示例:

// 自适应PID控制器结构体
typedef struct {PIDController pid;          // 基础PID控制器ReferenceModel ref_model;   // 参考模型float error;                // 当前误差float last_error;           // 上一次误差float output;               // 控制器输出
} AdaptivePIDController;// 自适应PID初始化函数
void AdaptivePID_Init(AdaptivePIDController *apid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {PID_Init(&apid->pid, Kp, Ki, Kd, setpoint, output_min, output_max);ReferenceModel_Init(&apid->ref_model); // 参考模型初始化apid->error = 0.0;apid->last_error = 0.0;apid->output = 0.0;
}// 自适应PID计算函数
float AdaptivePID_Compute(AdaptivePIDController *apid, float feedback) {// 计算误差和误差变化率apid->error = apid->pid.setpoint - feedback;float error_rate = (apid->error - apid->last_error) / sample_time;// 计算参考模型的输出float ref_output = ReferenceModel_Output(&apid->ref_model, apid->pid.setpoint);// 计算模型误差float model_error = apid->output - ref_output;// 自适应调整PID参数apid->pid.Kp += adaptive_rate * model_error * apid->error;apid->pid.Ki += adaptive_rate * model_error * apid->error * sample_time;apid->pid.Kd += adaptive_rate * model_error * error_rate / sample_time;// 限制PID参数范围if (apid->pid.Kp < 0) apid->pid.Kp = 0;if (apid->pid.Ki < 0) apid->pid.Ki = 0;if (apid->pid.Kd < 0) apid->pid.Kd = 0;// 计算PID输出apid->output = PID_Compute(&apid->pid, feedback);// 保存当前误差用于下一次计算apid->last_error = apid->error;return apid->output;
}

代码说明

  1. 自适应 PID 控制器由一个基础 PID 控制器和一个参考模型组成。

  2. 参考模型定义了期望的系统响应特性。

  3. 根据参考模型的输出与实际系统输出的误差,调整 PID 参数,使得实际系统的响应尽可能接近参考模型的响应。

  4. 自适应调整律基于模型参考自适应控制理论,通常采用梯度下降法或 Lyapunov 稳定性理论设计。

  5. adaptive_rate是自适应增益,控制参数调整的速度。

八、总结与展望

8.1 PID 控制的优势与局限

PID 控制作为一种经典的控制算法,具有以下优势:

  1. 结构简单:PID 控制器由三个基本环节组成,结构简单,易于理解和实现(2)。

  2. 鲁棒性强:对模型精度要求不高,在一定的参数范围内都能保持较好的控制性能(11)。

  3. 适用范围广:适用于各种线性和部分非线性系统,在工业控制中得到广泛应用(11)。

  4. 理论成熟:经过多年的研究和应用,PID 控制的理论基础已经非常成熟,有多种参数整定方法可供选择(11)。

  5. 实现方便:无论是硬件实现还是软件实现都相对简单,对计算资源要求不高(6)。

然而,PID 控制也存在一些局限性:

  1. 参数整定困难:对于复杂系统,PID 参数的整定需要丰富的经验和技巧,有时需要反复试凑(11)。

  2. 对非线性系统适应性差:对于强非线性系统,固定参数的 PID 控制器难以获得满意的控制效果(12)。

  3. 对时变系统适应性差:当系统特性随时间变化时,固定参数的 PID 控制器性能会下降(47)。

  4. 对复杂多变量系统控制效果不佳:对于多变量、强耦合的系统,单一的 PID 控制器难以实现理想的控制效果(12)。

8.2 PID 控制的发展趋势

随着控制理论和计算机技术的发展,PID 控制也在不断发展和完善,主要发展趋势包括:

  1. 智能化:将模糊逻辑、神经网络、遗传算法等智能计算技术与 PID 控制相结合,形成智能 PID 控制,提高对复杂系统的控制能力(32)。

  2. 自适应化:开发具有在线辨识和参数自调整能力的自适应 PID 控制器,适应系统特性的变化(47)。

  3. 网络化:基于网络的 PID 控制技术,实现远程监控和分布式控制(12)。

  4. 集成化:将 PID 控制与其他先进控制策略(如预测控制、鲁棒控制等)集成,形成复合控制策略,提高控制性能(12)。

  5. 参数整定自动化:开发自动整定工具,减少人工干预,提高整定效率和精度(14)。

8.3 实际应用建议

基于本文的分析,针对 PID 控制的实际应用,提出以下建议:

  1. 根据系统特性选择合适的 PID 类型:对于大滞后系统,选择位置式 PID;对于快速响应系统,选择增量式 PID;对于易受干扰的系统,考虑使用抗积分饱和 PID(22)。

  2. 合理选择参数整定方法:简单系统可采用手动试凑法;工业过程控制可采用齐格勒 - 尼科尔斯法或科恩 - 库恩法;复杂系统可采用基于模型的方法或智能优化算法(11)。

  3. 重视抗干扰措施:根据系统特点,采取积分限幅、微分先行、滤波等抗干扰措施,提高控制系统的鲁棒性(6)。

  4. 结合先进控制策略:对于复杂系统,考虑将 PID 控制与模糊控制、自适应控制等先进控制策略结合,提高控制性能(32)。

  5. 进行充分的测试和验证:在实际应用前,对 PID 控制器进行充分的测试和验证,确保其在各种工况下都能稳定可靠地工作(12)。

  6. 持续优化和调整:随着系统特性的变化和控制要求的提高,需要持续优化和调整 PID 参数,确保控制性能始终处于最佳状态(11)。

PID 控制虽然已有几十年的历史,但仍然是工业控制中最常用的控制算法之一。随着控制理论和计算机技术的不断发展,PID 控制将继续发挥重要作用,并在新的应用领域展现出强大的生命力。

在这里插入图片描述

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

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

相关文章

PCL关键点提取

1. 核心概念:什么是关键点?为什么需要关键点? 关键词:信息冗余、计算效率、突出特征 “想象一下,我们有一片密集的点云,包含几十万个点。如果我们直接在每个点上都计算像FPFH这样的局部特征,计算量会非常大,极其耗时,而且很多点所处的区域(比如平坦的墙面)特征非常…

vcruntime140_1.dll缺失怎么办?暗黑破坏神游戏vcruntime140_1.dll缺失的4个解决方法

你是否遇到过这样的情况&#xff1a; 玩《暗黑破坏神》《英雄联盟》《GTA5》的时候&#xff0c;游戏忽然闪退&#xff0c;弹窗提示&#xff1a; “无法启动&#xff0c;因为计算机中丢失 vcruntime140_1.dll” 这不是某一个游戏的问题&#xff0c;而是 Windows 系统运行库缺失…

迁移学习-ResNet

好的&#xff0c;我将为你撰写一篇关于ResNet迁移学习的技术博客。以下是博客的主要内容&#xff1a;ResNet迁移学习&#xff1a;原理、实践与效果深度解析1. 深度学习中迁移学习的重要性与ResNet的独特价值迁移学习&#xff08;Transfer Learning&#xff09;是机器学习中一种…

极大似然估计与概率图模型:统计建模的黄金组合

在数据驱动的时代&#xff0c;如何从海量信息中提取有价值的规律&#xff1f;统计建模提供了两大核心工具&#xff1a;极大似然估计&#xff08;MLE&#xff09;帮助我们根据数据推断模型参数&#xff0c;而概率图模型&#xff08;PGM&#xff09;则通过图形化语言描述变量间的…

解析豆科系统发育冲突原因

生命之树是进化生物学的核心&#xff0c;但由于 不完全谱系排序&#xff08;ILS&#xff09;、杂交 和 多倍化 等复杂过程&#xff0c;解析深层且难解的系统发育关系仍然是一个挑战。**豆科&#xff08;Leguminosae&#xff09;**这一物种丰富且生态多样化家族的理解&#xff0…

从Java全栈到前端框架:一次真实的面试对话与技术解析

从Java全栈到前端框架&#xff1a;一次真实的面试对话与技术解析 在一次真实的面试中&#xff0c;一位拥有多年经验的Java全栈开发工程师&#xff0c;被问及了多个涉及前后端技术栈的问题。他的回答既专业又自然&#xff0c;展现了扎实的技术功底和丰富的实战经验。 面试官&…

阿瓦隆 A1566HA 2U 480T矿机参数解析:性能与能效深入分析

在矿机行业&#xff0c;AvaLON是一个备受关注的品牌&#xff0c;尤其在比特币&#xff08;BTC&#xff09;和比特币现金&#xff08;BCH&#xff09;挖矿领域&#xff0c;凭借其强劲的算力和高效能效&#xff0c;在市场中占据了一席之地。本文将针对阿瓦隆 A1566HA 2U 480T矿机…

小迪安全v2023学习笔记(七十八讲)—— 数据库安全RedisCouchDBH2database未授权CVE

文章目录前记服务攻防——第七十八天数据库安全&Redis&CouchDB&H2database&未授权访问&CVE漏洞前置知识复现环境服务判断对象类别利用方法数据库应用 - Redis-未授权访问&CVE漏洞前置知识案例演示沙箱绕过RCE - CVE-2022-0543未授权访问 - CNVD-2019-2…

HTML + CSS 创建图片倒影的 5 种方法

HTML CSS 创建图片倒影的 5 种方法 目标&#xff1a;掌握多种生成“图片倒影 / Reflection”效果的实现思路&#xff0c;理解兼容性、性能差异与最佳实践&#xff0c;方便在真实业务&#xff08;商品展示、相册、登陆页面视觉强化&#xff09;中安全使用。 总览对比 方法核心…

一个文件被打开io流和不打卡 inode

1. 磁盘 最小基本单位 扇区 机器磁盘的io效率 &#xff08;读和取&#xff09;2. 文件系统 对磁盘分区 &#xff0c;最小的文件单位块组&#xff0c;快组内部已经划分好区域&#xff0c;巴拉巴拉&#xff0c;总之&#xff0c;每次使用数据&#xff0c;以操作系统的处理都是块级…

ThermoSeek:热稳定蛋白数据库

这篇论文提出了ThermoSeek&#xff0c;一个综合性的网络资源&#xff0c;用于分析来自嗜热和嗜冷物种的蛋白质序列和结构。具体来说&#xff0c;数据收集&#xff1a;从美国国家生物技术信息中心&#xff08;NCBI&#xff09;的基因组数据库中收集了物种的分类ID&#xff0c;并…

leetcode算法刷题的第二十七天

1.leetcode 56.合并区间 题目链接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<v…

解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题

文章目录解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题为什么会出现证书链错误&#xff1f;常见场景直连服务器正常&#xff0c;但经过 WAF 出错Windows/Linux 下证书文件说明引入 WAF 或其他中间层&#xff1a;解决方法方法一&#xff1a;单独配置 …

十一、标准化和软件知识产权基础知识

1 标准化基础知识 1.1 基本概念 1.1.1 标准的分类 1.1.1.1 按使用范围分类 国际标准&#xff1a;由国际组织如 ISO、IEC 制定的标准。国家标准&#xff1a;由国家标准化机构制定的标准&#xff0c;如中国的 GB&#xff0c;美国 ANSI。行业标准&#xff1a;由行业主管部门制定的…

计算机毕设选题:基于Python数据挖掘的高考志愿推荐系统

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二…

什么是PCB工艺边?猎板给您分享设计要点

什么是PCB工艺边&#xff1f;猎板给您分享设计要点在PCB设计和制造领域&#xff0c;工艺边是一个看似简单却至关重要的概念&#xff0c;它直接关系到生产流程的顺畅性与最终产品的质量。本文将为您详细解析PCB工艺边的定义、作用、设计要点&#xff0c;并分享猎板PCB在高精度制…

Rustdesk搭建与客户端修改与编译

Rustdesk是一个开源的远程桌面工具&#xff0c;客户端可以自己定制修改编译 这里主要记录一下搭建的过程 服务端搭建 主要是参考了这篇文章&#xff0c;感觉作者分享~ 在 Linux VPS 上创建 RustDesk 服务器 - 知乎 https://zhuanlan.zhihu.com/p/1922729751656765374 这里主要…

数字人系统源码搭建与定制化开发:从技术架构到落地实践

随着元宇宙、直播电商、智能客服等领域的爆发&#xff0c;数字人从概念走向商业化落地&#xff0c;其定制化需求也从 “单一形象展示” 升级为 “多场景交互能力”。本文将从技术底层出发&#xff0c;拆解数字人系统的源码搭建逻辑&#xff0c;结合定制化开发中的核心痛点&…

2025国赛C题创新论文+代码可视化 NIPT 的时点选择与胎儿的异常判定

2025国赛C题创新论文代码可视化 NIPT 的时点选择与胎儿的异常判定基于多通道LED光谱优化的人体节律调节与睡眠质量评估模型摘要无创产前检测&#xff08;NIPT&#xff09;通过分析孕妇血浆中胎儿游离DNA来筛查染色体异常&#xff0c;其准确性很大程度上依赖于胎儿Y染色体浓度的…

2021/07 JLPT听力原文 问题一 4番

4番&#xff1a;女の人が新しい商品の紹介をしています。よく頭が痛くなる人は、どの商品を選びますか。女&#xff1a;こちら、新発売の中国茶をご案内します。今回皆様にご紹介いたしますのは、月・星・虹・空のお茶の4種類でございます。さあ、どうぞ召し上がってください。…