PID控制算法(六)

#include <stdio.h>
#include <stdlib.h>// 定义PID结构体
typedef struct
{float SetSpeed;float ActualSpeed;float err;float integral;float vo_out;           //控制器输出float err_last;float Kp;float Ki;float Kd;float limit_min; // 输出限制最小值float limit_max; // 输出限制最大值float windup_guard;     // 积分饱和保护值float derivative_filter; // 微分项的滤波系数float err_pre_last;} PID;// 函数声明
void PID_init(PID *pid);
float PID_realize(PID *pid, float Setparameter);// 函数定义
/*
void PID_init(PID *pid,float Kp, float Ki, float Kd,float vo_out_limit_min, float vo_out_limit_max)
*/
void PID_init(PID *pid)
{// 初始化PID参数pid->Kp = 0.1;pid->Ki = 0.1;pid->Kd = 0.1;pid->SetSpeed = 0.0;pid->ActualSpeed = 0.0;pid->vo_out = 0.0;pid->integral = 0.0;pid->err = 0.0;pid->err_last = 0.0;pid->limit_min = -100;//积分保护最小设置pid->limit_max =  600;//积分保护最大设置pid->windup_guard = (pid->limit_max - pid->limit_min) * 0.1; // 设置积分饱和保护值pid->err_pre_last = 0.0;//微分项的滤波器系数设置pid->derivative_filter = 0.05f;}// 积分饱和处理:
//积分环节处理:
//积分分离、积分限制、反计算饱和
void PID_IntegralWindup(PID *pid)
{//将两个参数在结构体中提前定义好://积分限制,反计算饱和double vo_out_limit_min; // 输出限制最小值double vo_out_limit_max; // 输出限制最大值if (pid->vo_out >= pid->limit_max) //当输出达到积分保护最大值时{if (pid->err > 0){pid->integral += pid->err;//积分误差累计正偏差}}else if (pid->vo_out <= pid->limit_min)//当输出小于积分保护最小值时{if (pid->err < 0){pid->integral += pid->err;//积分误差累计正偏差}}else //此时输出值在设置的最大和最小值区间内{pid->integral += pid->err;//正常计算积分误差}
}float PID_realize(PID *pid, float Setparameter)
{int index;//标志位,在index = 1时执行积分的稳态误差积累pid->SetSpeed = Setparameter;pid->err = pid->SetSpeed - pid->ActualSpeed;PID_IntegralWindup(pid);      //反计算抗饱和处理//积分分离,设置误差阈值//当误差较大时,放弃积分项的运算,当误差较小,计算积分误差积累//设置积分阈值需根据实际情况调整,//当阈值过大时对达不到阈值的数值进行计算的过程中,//就会出现小数点后一位的精度不准问题。if(abs(pid->err) > 100){index = 0;//当误差的绝对值大于所设置的阈值时,标志位置零,但积分项仍然会进行误差累计}else{index = 1;pid->integral = pid->integral + pid->err ; // 积分误差积累//不需要在此时进行积分误差积累的抵消效果?}// 不完全微分://测微分变化趋势,减小对噪声高频信号噪声的放大程度:float derivative = (pid->err - pid->err_last) - (pid->err_last - pid->err_pre_last);float filtered_derivative = pid->derivative_filter * derivative +(1 - pid->derivative_filter) *(pid->err - 2 * pid->err_last + pid->err_pre_last);//pid->integral = pid->integral + pid->err; // 积分误差积累//PID输出计算
//    pid->vo_out = pid->Kp * pid->err + pid->Ki * pid->integral +
//                  pid->Kd * (pid->err - pid->err_last);pid->vo_out = pid->Kp * pid->err + pid->Ki * pid->integral +pid->Kd * filtered_derivative;//积分饱和处理:计算PID控制器的输出if (pid->vo_out > pid->limit_max){pid->vo_out = pid->limit_max; // 限制输出最大值}else if (pid->vo_out < pid->limit_min){pid->vo_out = pid->limit_min; // 限制输出最小值}pid->err_last = pid->err;          // 本次误差更新pid->err_pre_last = pid->err_last; // 上一次的误差更新//float浮点数--数据类型pid->ActualSpeed = pid->vo_out * 2.0; // 将输出值赋给实际值,此前是1.0,现在设置为2.0做补偿;return pid->ActualSpeed;
}int main()
{PID myPID; // 创建PID控制器实例// 初始化PID参数PID_init(&myPID);float Setparameter;//传感器获取的参数值(温、湿、气压?)printf("Enter the set parameter: ");scanf("%f", &Setparameter); // 读取用户输入的目标参数int count= 0 ;while(count<1000){myPID.ActualSpeed = PID_realize(&myPID, Setparameter); // 调用PID控制函数if(count >= 1)//只显示了最后200次的计算结果{printf("count is: %d, actual_speed is: %f\n", count, myPID.ActualSpeed);}count++;}return 0;
}

在上述代码中,相比之前的PID运算过程,本次在程序中添加并实现了PID算法的不完全微分过程,通过计算本次、上次以及上上次的误差,计算三者之间的差值来计算微分系数,并自行设置了滤波器系数来消除高频噪声所带来的误差,计算结果相比之前有所提升。通过修改设置的误差阈值和滤波器系数,可以一定程度上提高PID计算结果的精度。

运行结果如下(参数分别设为了1102.39和30.9):

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

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

相关文章

2024最新版网络安全图成长路线图,从零基础到精通_网络安全防御技术发展路线图

学习网络安全一定要培养兴趣&#xff0c;兴趣是最好的老师 刚开始抱着去尝试的心态。先坚持看完一套基础视频&#xff0c;或者看几本入门书。了解信息安全到底是干嘛的。 带着尝试的心态去干靶场。 不断去练习&#xff0c;不管是打靶场还是去挖漏洞&#xff0c;遇到问题去请教…

使用Flask和Python开发自己的API

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 本文章将一步一步教你如何使用Flask和Python从头开始设置自己的API。教程结束时&#xff0c;你将能够从头开始设置你自己的API。我将一步一步指导你&#xff0c;使你能够基于Flask和Python开发你自己的API。 什么是API&a…

Linux 应用层自定义协议与序列化

文章目录 一、应用层1、协议2、序列化 && 反序列化3、通过Json库进行数据的序列化 && 反序列化Json::Value类Json::Reader类Json::Writer类 二、为什么read、write、recv、send和Tcp支持全双工&#xff1f;发数据的本质&#xff1a;tcp支持全双工通信的原因&am…

java计算机毕设课设—超级玛丽游戏(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—超级玛丽游戏(附源码、文章、相关截图、部署视频) 超级玛丽游戏是一款经典的平台游戏&#xff0c;自1985年推出以来&#xff0c;已成为全球玩家心目中的经典之作。玩家操控玛丽奥在多样化的关卡中进行冒…

【综合性渗透利器】- TscanPlus

如果你在寻找一款轻量级、实用且开源的漏洞扫描工具&#xff0c;那么 TscanPlus 绝对值得一试。这款工具由 TideSec 团队打造&#xff0c;以其简洁、高效、易用的特点&#xff0c;广受好评&#xff0c;目前在github上拥有1.5k star。 为什么推荐 TscanPlus&#xff1f; 无论你…

利用ChatGPT实现的生成式人工智能自动化控制系统

一、引言 随着信息化与智能化时代的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;正在深刻地重塑各行业的运营模式。在这一背景下&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;以其卓越的创造力和广泛的应用潜力&#xff…

一种多版本、多人并行开发GIT分支管理规范

首发公众号&#xff1a; 赵侠客 引言 作为开发者每天在写代码的同时也在写BUG&#xff0c;所以一方面需要开发新的需求&#xff0c;另一方面还要填自己以前挖的坑。目前主流程序员都在使用GIT来管理自己的代码&#xff0c;当GIT仓库有多人维护或者项目有多个版本同时迭代开发时…

Axios使用cancel token取消请求

在一个vue项目开发的过程中&#xff0c;遇到一个需要中断文件上传的需求&#xff0c;当我利用axios的cancel token实现中断请求的功能之后&#xff0c;想要再次发送post请求&#xff0c;却发现axios直接返回了reject。 问题复现 当我执行upload方法时&#xff0c;文件能够正常…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序&#xff0c;没有出现调试的界面&#xff1a;点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试&#xff0c;改完代码没反应再刷新看看&#xff0c;再没反应就再次重新点击编译并自动调试。

中国AIGC最值得关注企业产品榜单揭晓!首份应用全景图谱发布

“你好&#xff0c;新应用&#xff01;” 站在大模型落地元年&#xff0c;是时候喊出这句话了。 从软件APP、智能终端乃至具身智能等等&#xff0c;AIGC开始席卷一切。 大模型玩家、互联网巨头、终端厂商、垂直场景玩家纷纷入场&#xff0c;办公、创作、营销、教育、医疗领域…

电瓶车常见电压数据 48v/60v/72v 说明

常见电压数据 48v/60v/72v的区别 48v 基本属于电动自行车&#xff0c;适合10公里内的骑行&#xff0c;速度慢&#xff0c;25公里/时&#xff0c;适合老年人60v 电轻摩&#xff0c;不能带人&#xff0c;适合远距离出行72v 适合外卖小哥 电压和电机功率 48v 电动车通常配备400…

A: 数数(牛客练习赛129)

题目链接: A-数数_牛客练习赛129 (nowcoder.com) 题目描述: 样例输入: 5 样例输出&#xff1a; 0 思路分析&#xff1a; 直接求偶数是困难的&#xff0c;之前好像听过&#xff1a;任何一个大于1的自然数N&#xff0c;都可以唯一分解成有限个质数的乘积。那么就是间接的去做&a…

STM32F103C8----3-2 LED流水灯(跟着江科大学STM32)

一&#xff0c;电路图&#xff08;接线图&#xff09; 面包板的的使用请参考&#xff1a;《面包板的使用_面包板的详细使用方法-CSDN博客》 二&#xff0c;目的/效果 三&#xff0c;创建Keil项目 详细参考&#xff1a;《STM32F103C8----2-1 Keil5搭建STM32项目模版&#xff…

每天3分钟,彻底弄懂神经网络的优化器(三)Momentum

前面从最初的SGD开始&#xff0c;介绍SGD的算法细节&#xff0c;以及其在深度神经网络中的劣势&#xff0c;本文引入Momentum算法&#xff0c;解决SGD的一些问题。 1. Momentum算法的提出 动量&#xff08;Momentum&#xff09;方法最初由B.T.Polyak在1964年提出。这一方法被…

国庆节快乐|中国何以成为中国

华夏之土&#xff0c;广袤无垠&#xff1b;中华之史&#xff0c;源远流长。自古以来&#xff0c;中原大地物华天宝&#xff0c;人杰地灵&#xff0c;遂成一国&#xff0c;是谓中国。然中国之所以为中国&#xff0c;非徒地大物博、历史悠久也&#xff0c;更有其深厚之文化底蕴、…

改善大模型 RAG 效果:结合检索和重排序模型

最近这一两周不少大厂都已经开始秋招面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&am…

苹果退出OpenAI融资谈判

&#x1f989; AI新闻 &#x1f680; 苹果退出OpenAI融资谈判 摘要&#xff1a;据《华尔街日报》报道&#xff0c;苹果公司已决定不参与OpenAI的新一轮融资&#xff0c;计划筹集约65亿美元&#xff08;约454.98亿元人民币&#xff09;。OpenAI正进行从非营利到盈利性公司的转…

【图解秒杀系列】秒杀技术点——隔离、熔断、限流、降级

【图解秒杀系列】秒杀技术点——隔离、熔断、限流、降级 隔离熔断限流降级 隔离 隔离的思想其实就是舱壁模式&#xff0c;这在Docker中有所体现。在Docker中&#xff0c;容器与容器间互相隔离互不影响。一个容器有它独立的与外界隔离的环境与资源&#xff0c;包括CPU、内存等&…

AI读教链《关于美国、中国和BTC的三个超级变量​》

这篇文章探讨了美国、中国及比特币&#xff08;BTC&#xff09;当前经济形势中的三个超级变量&#xff0c;强调了对经济状况的重新审视。 美国经济与衰退&#xff1a;尽管有观点认为美国经济正在衰退&#xff0c;文章指出这取决于如何定义衰退。美股市场的市盈率处于高位&#…

实用工具推荐---- PDF 转换

直接上链接&#xff1a;爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下&#xff1a; 全免费&#xff01;&#xff01;&#xff01;&#xff01;