电赛控制类PID算法实现

一、什么是PID

PID(Proportional-Integral-Derivative)是一种经典的控制算法,广泛应用在自动化控制系统中。它是通过对被控对象的测量值和设定值进行比较,并根据误差的大小来调整输出信号,实现对被控对象的稳定控制。

PID控制器由三个部分组成:比例控制器(P)、积分控制器(I)和微分控制器(D)。这三个部分分别对应了控制系统中的比例、积分和微分操作。

首先,我们来看比例控制器(P)。比例控制器根据被控对象当前的偏差与设定值之间的比例关系来调整输出信号。假设被控对象的偏差为e,比例增益为Kp,那么比例控制器的输出信号为Kp * e。比例控制器主要用于快速响应系统的初始偏差,但可能会导致系统存在超调和稳态误差。

接下来是积分控制器(I)。积分控制器根据被控对象偏差的累积值来调整输出信号,以消除稳态误差。假设被控对象的偏差累积值为∑e,积分增益为Ki,那么积分控制器的输出信号为Ki * ∑e。积分控制器主要用于消除系统的稳态误差,但如果增益过大,可能会导致系统出现震荡或不稳定的情况。

最后是微分控制器(D)。微分控制器根据被控对象偏差的变化率来调整输出信号,以抑制系统的超调和振荡。假设被控对象的偏差变化率为de/dt,微分增益为Kd,那么微分控制器的输出信号为Kd * (de/dt)。微分控制器主要用于提高系统的稳定性和响应速度,但如果增益过大,可能会引入噪声或造成系统震荡。

PID控制器的输出信号是这三个部分的总和:输出信号 = Kp * e + Ki * ∑e + Kd * (de/dt)。实际应用中,可以通过试验和经验来确定适当的增益参数,以达到所需的控制效果。

总结一下,PID控制器是一种常用的控制算法,通过比例、积分和微分操作来调整输出信号,实现对被控对象的稳定控制。它在工业、自动化等领域广泛应用,能够有效地解决许多控制问题。然而,在实际应用中需要根据具体情况调整参数,以获得最佳的控制效果。

学过自动控制原理的对PID并不陌生,PID控制是对偏差信号e(t)进行比例、积分和微分运算变换后形成的一种控制规律。PID 算法的一般形式:

  • PID控制系统原理框图


二、PID离散化

在实际应用中,PID控制器通常需要在数字系统中进行离散化处理。离散化是将连续时间域的PID控制器转换为离散时间域的控制器,以适应数字控制系统的要求。

离散化PID控制器的关键在于将连续时间域的微分和积分操作转换为离散时间域的形式。下面介绍一种常用的离散化方法:采样周期法(也称为Z变换法)。

  1. 采样周期(Sampling Period):首先确定控制系统的采样周期,即每次对被控对象进行测量和调整输出的时间间隔。

  2. 离散化比例项(Discretization of the Proportional Term):离散化比例项可以简单地通过乘以采样周期得到。离散比例增益Kp_discrete = Kp * T(其中Kp为连续比例增益,T为采样周期)。

  3. 离散化积分项(Discretization of the Integral Term):离散化积分项可以使用数值积分方法来实现,常用的方法是离散化误差的累加。离散积分增益Ki_discrete = Ki * T(其中Ki为连续积分增益,T为采样周期)。

  4. 离散化微分项(Discretization of the Derivative Term):离散化微分项可以使用数值微分方法来实现,常用的方法是差分运算。离散微分增益Kd_discrete = Kd / T(其中Kd为连续微分增益,T为采样周期)。

  5. 离散化PID控制器(Discretization of the PID Controller):将离散化的比例项、积分项和微分项相加,得到离散化的PID控制器输出信号。离散化PID控制器的输出信号为PID_discrete = Kp_discrete * e + Ki_discrete * ∑e + Kd_discrete * (de/dt)。

通过以上离散化方法,我们可以将连续时间域的PID控制器转换为离散时间域的控制器,方便在数字控制系统中实现。

需要注意的是,在离散化过程中可能会引入一定的误差,特别是在采样周期较大或被控对象响应速度较快的情况下。因此,在实际应用中,需要根据系统的要求和性能指标进行参数调节和系统优化,以获得最佳的离散化PID控制效果。

对PID连续系统离散化,从而方便在处理器上实现,PID 离散表示形式:

离散化后最终得到位置式PID:

u(k)为控制器输出的控制量;(输出)
e(k)为偏差信号,它等于给定量与输出量之差;(输入)
Kp 为比例系数;
Ti 为积分时间常数;
Td 为微分时间常数。


1. 位置式PID公式

2. 增量式PID公式


三、两种PID的不同点

  • 位置式
    是一种非递推算法,输出值U(k)和执行机构的实际位置一一对应,在不带积分部件的对象中可以很好的应用。但是每次输出均与过去的状态有关,计算量大。
  • 增量式
    输出的是增量,控制增量的值仅与最近3次采样值有关,不需要累计偏差,运算量小,计算错误影响小。但会积分截断效应大,有稳态误差。

四、C语言程序实现

  • pid.c
#include "pid.h"/*定义PID参数结构体*/
typedef struct _PID
{float Kp,Ki,Kd;//比例系数、积分系数、微分系数float SetValue,ActualValue;//目标值、实际值float Error;//第K次误差float LastError;//第K-1次误差float PreError;//第K-2次误差float SumError;//累计偏差float Integral,MaxI;//积分、积分限幅float Output,MaxOut;//输出、输出限幅
}PID;/************************************************
*@brief  :位置式PID控制器
*@param  :PID结构体变量地址,当前实际值
*@retval : 期望输出值
*************************************************/
int32_t Position_PID_Control(PID *pid,float Cur_Value)
{pid->Error=pid->SetValue-Cur_Value; //计算偏差      pid->SumError +=pid->Error;//累计偏差pid->ActualValue=(pid->Kp*(pid->Error-pid->LastError))//比例环节+(pid->Ki*pid->SumError)//积分环节+(pid->Kd*(pid->Error-pid->LastError);//微分环节pid->LastError=pid->Error;return ((int32_t)pid->ActualValue); //返回计算值	 
}/************************************************
*@brief  :速度闭环PID控制
*@param  :PID结构体变量地址,当前实际值
*@retval : 期望输出值
*************************************************/
int32_t Inc_Pid_Ctrl(PID *pid,float Cur_Value)
{pid->Error=pid->SetValue-Cur_Value; //计算偏差pid->ActualValue +=(pid->Kp*(pid->Error-pid->LastError))//比例环节+(pid->Ki*(pid->Error))//积分环节+(pid->Kd*(pid->Error-2*pid->LastError+pid->PreError));//微分环节 pid->PreError=pid->LastError;//存储偏差,进行下次计算                                                             pid->LastError=pid->Error;                                                            	return ((int32_t)pid->ActualValue); //返回计算值
}

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

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

相关文章

【C++】map和set的封装

目录 前言一、红黑树的设计1.1 红黑树存储节点的设计1.2 红黑树的迭代器1.3 map的设计1.4 set的设计1.5关于map与set的const_iterator设计 前言 我们知道map和set的底层都是用红黑树实现的,但是set和map的结构不一样,set只有一个参数K,而map…

前端基础:1-2 面向对象 + Promise

面向对象 对象是什么?为什么要面向对象? 通过代码抽象,进而藐视某个种类物体的方式 特点:逻辑上迁移更加灵活、代码复用性更高、高度的模块化 对象的理解 对象是对于单个物体的简单抽象对象是容器,封装了属性 &am…

Linux_应用篇(07) 系统信息与系统资源

在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息, 譬如获取系统时间、日期以及设置系统时间、日期等&#x…

三能一体运营体系助力政企支撑水平提升

生产力的发展是现代社会孜孜不倦的追求,由此产生了我们熟悉的“机械化、电子化、信息化”乃至现今正在发生的“智能化”四次工业革命。这些是由技术的突破性发展带来的,但我们也注意到生产力发展的另一个助力,即生产效率的提升,19…

【MySQL数据库】mysql日志管理、备份与恢复

mysql日志管理、备份与恢复 MySQL数据库备份及日志一、数据库备份分类:如何选择逻辑备份策略 (频率)完全备份与恢复备份恢复 增量备份与恢复实现增量备份 基于时间点与位置恢复 二.MySQL日志管理 MySQL数据库备份及日志 在生产环境中,数据的安全性是至关…

在未来你将何去何从?

在数字化的浪潮中,信息技术行业无疑是推动全球经济和社会发展的重要动力。随着科技的不断迭代与进步,云计算、大数据、人工智能(AI)、物联网(IoT)、5G通信和区块链等技术已经深入到我们生活的每一个角落&am…

鸿蒙原生应用元服务开发-鸿蒙真机运行项目实战与注意事项

一、解压项目注意项目包不能为中文 二、用数据线将装好DevEco Studio的电脑与设置为开发者模式的鸿蒙手机相连接。 三、将项目包托进DevEco Studio 中 注意项目包文件不能有嵌套 四、查看设备运行 五、点击项目结构 六、勾选红色框圈部分 登录开发者账号 七、选择好公司 八、等…

我是如何使用 Next.js14 + Tailwindcss 重构个人项目的

前言 去年在学习 React 和 Nest 的时候,参考了大佬 imsyy 的项目 DailyHot,以此项目的灵感基于 React 开发,完成之后就没怎么在意。 后来发现这个项目还有点小流量,每天差不多 200-400 的 IP 访问量: 我又抽时间优…

深度学习之基于Pytorch框架手写数字识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是数字图像处理领域的一个经典问题,也是深度学习技术的一个常用应用场…

uniappx 获取设备唯一标识(OAID、AAID、AndroidID、IMEI等) Ba-IdCode-U

简介(下载地址) Ba-IdCode-U 是一款可以获取国内各大手机厂商 OAID(开放匿名设备标识)及海外手机平台 AAID(安卓广告标识)的uniapp插件。另外也支持获取 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUI…

Spring Cloud Alibaba-06-Sleuth链路追踪

Lison <dreamlison163.com>, v1.0.0, 2024.4.03 Spring Cloud Alibaba-06-Sleuth链路追踪 文章目录 Spring Cloud Alibaba-06-Sleuth链路追踪为什么使用链路追踪常见链路追踪解决方案Sleuth概述概述Sleuth术语 Sleuth Zipkin 原理Sleuth原理简述Zipkin 原理简述 Sleut…

代码随想录——路径总和(Leetcode113)需要回顾

题目链接 递归 本题递归需要遍历整棵树&#xff0c;所以递归没有返回值 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* T…

苹果M4性能分析:进步神速?还有多少空间?

2024年初&#xff0c;苹果推出了M4处理器&#xff0c;令人意外的是&#xff0c;它的发布距离M3发布仅仅过去了半年时间。更让人惊讶的是&#xff0c;M4首次亮相于iPad Pro。这一新处理器不仅仅是M3的简单升级版本&#xff0c;而是一次全面的架构优化。本文将详细分析M4处理器的…

Vue基础(1)数据绑定

一. 文本插值 普通文本可以使用双大括号 {{ }} &#xff0c;要想插入 HTML&#xff0c;需要使用 v-html 指令。 <template><h1>Message: {{ state.msg }}</h1><p>{{ state.count 1 }}</p><p>{{ state.rawHtml }}</p><p v-html…

【教学类-58-02】黑白三角拼图02(3*3宫格)262144种

背景需求&#xff1a; 已知黑白三角拼图2*2&#xff08;4个拼图&#xff09;一共有256种排列方法 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;256种-CSDN博客文章浏览阅读142次&#xff0c;点赞5次&#xff0c;收藏12次。【教学类-58-01】黑白三角拼图01…

深度学习之基于Matlab卷积神经网络(CNN)手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是计算机视觉领域的一个重要问题&#xff0c;也是深度学习应用的一个典型场景。卷…

什么是固态继电器?

固态继电器是不需要使用任何机械部件的开关继电器。这通常使它们具有比普通机电继电器寿命更长的优势&#xff0c;然而&#xff0c;尽管固态继电器速度快且耐用&#xff0c;但仍具有某些设计规定。 固态继电器风靡全球&#xff0c;彻底改变了从农业自动化到航空航天等各个行业…

银行总部文件自动下发,如何保证不影响专线网络使用?

银行在我国金融体系中占据重要地位&#xff0c;是我国市场经济的重要组成部分。我国商业银行随着自身不断发展&#xff0c;规模日益扩大&#xff0c;形成了“总行-分行-支行-营业网点”的典型层级管理模式。在日常中&#xff0c;银行总部存在文件下发的场景&#xff1a; 银行总…

多家知名媒体到访“光子1号金融算力中心“ 交流AI与算力未来观

5月23日&#xff0c;企商在线 “光子1号金融算力中心媒体参观日”活动成功举办&#xff0c;十多家主流媒体、IT行业媒体及自媒体代表走进光子1号金融算力中心&#xff0c;深入了解企商业务发展、战略规划及“光子1号金融算力中心”等企商打造的新型数字基础设施&#xff0c;共同…

Python条件分支与循环

大家好&#xff0c;当涉及到编写高效和灵活的程序时&#xff0c;条件分支和循环是 Python 中至关重要的概念。它们允许我们根据不同的条件执行不同的代码块&#xff0c;或者重复执行一组语句。条件分支和循环是测试开发工程师在日常工作中经常使用的工具&#xff0c;无论是编写…