使用CCS软件查看PID曲线

  在刚开始学习PID的时候,都需要借助PID的曲线来理解比例,积分,微分这三个参数的具体作用。但是这些曲线生成一般都需要借助上位机软件或者在网页上才能实现。如果是在单片机上调试程序的话,想要看曲线,一般就是通过串口将数据发送出去,然后使用串口波形显示软化将曲线打印出来。
如果使用的是CCS软件来开发的话,那么就可以直接使用CCS软件自带的图形显示工具来打印曲线。
  比如要测试的代码如下:

typedef struct
{float P;float I;float D;float limit;
}PID;typedef struct
{float Current_Error;			//当前误差float Last_Error;				//上一次误差float Previous_Error;			//上上次误差
}ERROR;
// 位置式PID
float PID_Realize(ERROR *err, PID *pid, float feedback, float reference)
{float iError, Realize;    						// 当前误差 实际输出iError = reference - feedback;					// 计算当前误差  期望值-当前值err->Current_Error += pid->I * iError;    		// 误差积分err->Current_Error = err->Current_Error > pid->limit ? pid->limit : err->Current_Error;	//积分限幅err->Current_Error = err->Current_Error < -pid->limit ? -pid->limit : err->Current_Error;Realize = pid->P * iError       				//比例P+ err->Current_Error    						//积分I+ pid->D * (iError - err->Last_Error);  //微分Derr->Last_Error = iError;		  				// 更新上次误差return Realize;    								// 返回实际值
}// 增量式PID
float PID_Increase(ERROR *err, PID *pid, float feedback, float reference)
{float iError, Increase;    						// 当前误差  最后得出的实际增量iError = reference - feedback;    				// 计算当前误差Increase = pid->P * (iError - err->Last_Error)  //比例P+ pid->I * iError      							//积分I+ pid->D * (iError - 2 * err->Last_Error + err->Previous_Error);    //微分Derr->Previous_Error = err->Last_Error;    		// 更新前次误差err->Last_Error = iError;		  				// 更新上次误差return Increase;								// 返回增量
}

  这是两种很典型的PID算法,一个位置式,一个增量式。下面就在CCS软件中测试这两个函数,这里使用的是dsp28335芯片。首先定义PID和ERROR结构体变量。

PID pid = { 0.1, 0.01, 0.001, 100.0 };
ERROR err = { 0.0, 0.0, 0.0 };

  接下来就可以直接在main函数中调用上面两种pid的算法了。

float ref = 100;		//参考值
float sample1=0,sample2=0;	//采样值
void main()
{InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();while(1){sample1 += PID_Realize(&err,&pid,sample1,ref);sample2 += PID_Increase(&err,&pid,sample2,ref);}
}

  将需要设定的参考值ref设置为100,然后两个采样值sample1sample2都设置为0,将PID计算出来的结果作为第二次的输入,然后在调用PID计算,这样一直循环。

  代码编写完成之后,直接debug开始调试。

进入调试界面之后,在变量sample1上单击鼠标右键,选择添加到观察窗口
在这里插入图片描述
弹出的窗口上点OK
在这里插入图片描述
此时窗口右边就会出现一个变量显示区域
在这里插入图片描述
同样在变量sample2上也单击右键,添加到观察窗口。
在这里插入图片描述
  添加完成之后,将黄色箭头的图标选中,这个是实时刷新功能,这样在代码全速运行的时候,就可实时看到变量值在变化。接下来全速运行代码。
在这里插入图片描述
  此时可以看到这两个变量值都停在在100作用不变化了,没有看到变换的过程。下面将这两个值添加到图形显示中。在观测窗口变量值上单击鼠标右键,选择Graph。

在这里插入图片描述
此时就会新增一个图形显示窗口
在这里插入图片描述
在另一个变量上右键,选择Graph。
在这里插入图片描述
  此时又增加了一个显示窗口,但是这两个窗口重叠在了一起,看起来不方便,在窗口标题处按住鼠标左键,拖动窗口,将两个图形显示调节到合适的位置。
在这里插入图片描述

  然后再这两个图形显示窗口上,将实时刷新的按钮选中。
在这里插入图片描述
接下里全速运行程序。
在这里插入图片描述
  这时候PID调节的曲线就显示出来了,但是这个曲线和PID调节的曲线看起来不太一样,难道是程序有问题吗?当然不是程序的问题,是这个图形显示的刷新率太低了,而我们的程序执行的太快了。下面在代码中添加延时。

while(1){sample1 += PID_Realize(&err,&pid,sample1,ref);sample2 += PID_Increase(&err,&pid,sample2,ref);DELAY_US(1000*200);}

  重新编译运行代码
在这里插入图片描述
在这里插入图片描述
这时候就可看到右侧的变量和曲线都在缓慢的变化,可以看到PID的调节过程了。
在这里插入图片描述
  为了方便修改PID的参数,将结构体变量pid也添加到观察窗口中。在代码中选中pid然后右键添加到观察窗口。
在这里插入图片描述
  此时右边的观察窗口中就多了一个pid的结构体变量,将PID前面的加号点开,这时候就可以看到结构体中每个成员的值了。
在这里插入图片描述
  这时候在变量窗口中就可以直接修改这些参数的值了。鼠标双击要修改的值,选中值之后,直接输入要改的值,然后按回车键。
在这里插入图片描述
这里将P的值修改为0.2在这里插入图片描述
修改完成之后,底下的曲线没有发生变化。要想重新看pid的调节过程,这里将两个采样值都改为0 。
在这里插入图片描述
这时候PID函数就会从0开始重新计算,底下的曲线也会重新绘制。
在这里插入图片描述
  这样只需要在变量观察窗口直接修改PID的参数,就能实时看到PID曲线的效果了。不用在程序里面修改一次参数然后又重新仿真运行。

  还有一种方法,不需要加延时也能实时查看波形。下面就介绍一下这个方法。
定义两个数组来存放采样值,然后增加一个变量来记录数组的下标。在主函数中将采样的两个值分别存放到数组中,当数组个数超过200个之后,将下标清零。此时代码中将延时函数去掉了。没有延时,相当于代码按照正常的计算速度运行。

int cnt=0;
float value1[200];
float value2[200];while(1){sample1 += PID_Realize(&err,&pid,sample1,ref);sample2 += PID_Increase(&err,&pid,sample2,ref);//DELAY_US(1000*200);if(cnt<200){value1[cnt] = sample1;value2[cnt] = sample2;cnt++;}elsecnt =0;}

仿真运行代码,进入仿真界面后再工具栏选择 Tools—Grapg—Single Time
在这里插入图片描述
这时候会弹出一个对话框,在对话框中填入需要观测的数组信息。
在这里插入图片描述
将数组相关信息填写进去,然后点OK按钮,此时就会新增一个图形显示窗口
在这里插入图片描述
按照同样的方法,在工具栏选择 Tools—Grapg—Single Time,将value2数组也添加到图形显示中,然后选中实时刷新按钮。
在这里插入图片描述
然后在 cnt=0这一行打个断点,用来观察一次计算完成之后的波形。全速运行代码。
在这里插入图片描述
  程序在断点处停止后,左边两个图形显示的是正常的PID调节曲线,右边两个是阶跃信号。这是因为取消延时后,图形显示的刷新率太低,不能实时捕获到每个数据,所以直接显示变量的曲线就看不出来细节了,而数组显示比较完整,是因为代码中将过程中的所有数据都先存储到了数组中,然后根据数组中的数据来绘制曲线。
  继续全速运行,这时候曲线就会变成一条直线,这是因为PID调节完成之后,数组中的值被更新了。
在这里插入图片描述

如果还想继续观察调节过程,在程序中断之后,将sample1sample2的值改为0,修改完之后,这时变量的曲线值也会从100变为0.
在这里插入图片描述
  全速运行代码
在这里插入图片描述
这时候左边两个数组的曲线就会被重新绘制出来。

  如果要修改PI参数的话,每次程序在断点处停止之后,修改PI参数,然后将sample1sample2的值改为0,接着全速运行,就可观测到新的PI参数生成的曲线了。
在这里插入图片描述
  这样在学习PID的时候就不用借助上位机软件,使用CCS本身的图形显示工具,就能看到不同参数下PID调节的差别了。
在这里插入图片描述
完整代码如下

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "leds.h"
typedef struct
{float P;float I;float D;float limit;
} PID;typedef struct
{float Current_Error;			//当前误差float Last_Error;				//上一次误差float Previous_Error;			//上上次误差
} ERROR;// 位置式PID控制
float PID_Realize(ERROR *err, PID *pid, float feedback, float reference)
{float iError, Realize;    						// 当前误差 实际输出iError = reference - feedback;					// 计算当前误差  期望值-当前值err->Current_Error += pid->I * iError;    		// 误差积分err->Current_Error = err->Current_Error > pid->limit ? pid->limit : err->Current_Error;    //积分限幅err->Current_Error = err->Current_Error < -pid->limit ? -pid->limit : err->Current_Error;Realize = pid->P * iError       				//比例P+ err->Current_Error    						//积分I+ pid->D * (iError - err->Last_Error);    //微分Derr->Last_Error = iError;		  				// 更新上次误差return Realize;    								// 返回实际值
}// 增量式PID
float PID_Increase(ERROR *err, PID *pid, float feedback, float reference)
{float iError, Increase;    						// 当前误差  最后得出的实际增量iError = reference - feedback;    				// 计算当前误差Increase = pid->P * (iError - err->Last_Error)    //比例P+ pid->I * iError      							//积分I+ pid->D * (iError - 2 * err->Last_Error + err->Previous_Error);    //微分Derr->Previous_Error = err->Last_Error;    		// 更新前次误差err->Last_Error = iError;		  				// 更新上次误差return Increase;								// 返回增量
}PID pid = { 0.1, 0.01, 0.001, 100.0 };
ERROR err = { 0.0, 0.0, 0.0 };float ref = 100;		//参考值
float sample1 = 0, sample2 = 0;    //采样值int cnt = 0;
float value1[200];
float value2[200];
void main()
{InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();while (1){sample1 += PID_Realize(&err, &pid, sample1, ref);sample2 += PID_Increase(&err, &pid, sample2, ref);//DELAY_US(1000*200);if (cnt < 200){value1[cnt] = sample1;value2[cnt] = sample2;cnt++;}elsecnt = 0;}
}

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

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

相关文章

【YOLOv5】使用yolov5训练模型时报错合集

文章目录 前言问题1 -- VsCode终端无法进入Anaconda创建的虚拟环境【问题描述】【问题分析】【解决方式】方法一方法二 问题2 -- 怎么在VsCode中为项目配置Anaconda创建的虚拟环境【问题描述】【解决方式】 问题3 -- yolov5训练模型时报错RuntimeError: result type Float cant…

web自动化测试系列-selenium常用方法定位(五)

目录 1.selenium的定位方法 2.操作案例 3.实现代码 前面我们介绍了html页面元素主要是通过标签和属性来进行定位 &#xff0c;只要满足唯一&#xff0c;无论是标签还是属性 &#xff0c;都能进行定位 。当然 &#xff0c;我们要通过selenium来进行定位 &#xff0c;同样还是…

基于SpringBoot的在线五子连珠的设计与实现,前端采用vue框架;后端采用SpringBoot,mybatis

介绍 基于SpringBoot的在线五子连珠的设计与实现&#xff0c;主要是设计一款五子棋游戏&#xff0c;涉及登录注册的功能&#xff0c;人机对战、联机对战和积分排行榜的功能。其中人机对战中&#xff0c;电脑采用的是采用了一种基于局面分析的评分算法来确定机器人的下一步落子…

线程池学习(通俗易懂)

线程池 线程池是什么ThreadPoolExecutor模拟实现线程池结语 线程池是什么 假设我们要频繁的创建线程和销毁线程,但是创建线程和销毁线程是有成本的. 所以我们可以提前创建一批线程,后面需要使用的时候,直接拿就可以了,这就是线程池. 当线程不再使用的时候,就归还到池子里.为什…

图片懒加载

看下tuniu的页面&#xff0c;这有两个属性src和data-src <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><t…

SpringBoot3 + Kotlin + mybatis-plus + Swagger3后端开发样例

前言&#xff1a; Kotlin 是一种在 JVM&#xff08;Java 虚拟机&#xff09;、Android 和浏览器端运行的静态类型编程语言。以下是关于 Kotlin 的总结介绍&#xff1a; 1、语言特性&#xff1a; 简洁性&#xff1a;Kotlin 旨在提供简洁且安全的代码&#xff0c;同时保持与 Jav…

什么是反向 ETL?为什么它很有价值?

提取、转换、加载 &#xff08;ETL&#xff09; 过程已经成熟并被广泛采用。 它只涉及从各种源系统中获取数据&#xff0c;将其转换为标准化数据模型&#xff0c;然后将其加载到数据仓库中。从那里&#xff0c;您的团队使用其商业智能 &#xff08;BI&#xff09; 和分析工具中…

云轴科技ZStack入选中国信通院《高质量数字化转型产品及服务全景图(2023年度)》

近日&#xff0c;由中国互联网协会主办、中国信通院承办的“2024高质量数字化转型创新发展大会”暨“铸基计划”年度会议在北京成功召开。 本次大会发布了2024年度行业数字化转型趋势&#xff0c;总结并展望了“铸基计划”2023年取得的工作成果及2024年的工作规划。同时&#…

谷粒商城实战(013 业务-认证服务-短信验证)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第211p-第p219的内容 介绍 认证中心要集成 社交登录、OAuth2.0、单点登录 等功能 OAuth 2.0&#xff1a; 问题解决&#xff1a; OAuth 2.0 主要…

10分钟1000台虚机 云安全效能双升 亚信安全新信舱无代理云平台快速适配版正式发布

新信舱 亚信安全新信舱无代理云平台快速适配版正式发布。在云平台依赖性、无代理部署速度、宿主机无代理AV防护和虚拟机缓存扫描性能等方面&#xff0c;新信舱无代理版本提供了无缝的可扩展性、低资源消耗并降低管理复杂性&#xff0c;让安全防护真正做到了 多快好省&#xff…

Linux基本指令(1)

目录 ls指令&#xff1a; pwd命令&#xff1a; cd指令&#xff1a; touch指令&#xff1a; mkdir指令&#xff1a; rmdir指令&&rm指令&#xff1a; man指令&#xff1a; cp指令&#xff1a; ls指令&#xff1a; 语法&#xff1a;ls [选项][目录或者文件] 作用…

突破传统WAF的瓶颈·WAAP平台将是未来发展的必然趋势

近年来&#xff0c;基础组件相继爆出严重的高危漏洞&#xff0c;层出不穷的“核弹级”0-day漏洞事件不断破圈&#xff0c;Web应用已成攻击者首要目标&#xff0c;让整个泛IT行业都难堪其扰&#xff0c;疲于应对。根据Gartner调查显示&#xff0c;信息安全攻击有75%都是发生在We…

【C++庖丁解牛】C++11---统一的列表初始化 | auto | decltype | nullptr | STL中一些变化

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. C11简介2. 统一的列表…

【Docker】Linux开放2735端口实现远程访问Docker

【Docker】Linux开放2735端口实现远程访问Docker 大家好 我是寸铁&#x1f44a; 总结了一篇【Docker】Linux开放2735端口实现远程访问Docker ✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天需要远程操作Linux服务器的docker&#xff0c;这时就需要开放出docker的端口给我…

建筑企业都在用的工程项目管理系统!企智汇工程项目管理系统

在当今竞争激烈的建筑市场中&#xff0c;工程项目管理的重要性不言而喻。为了提高工程项目质量、降低成本、加快进度&#xff0c;越来越多的建筑企业开始运用工程项目管理系统。建筑企业都在用的工程项目管理系统是企智汇工程项目管理系统。 企智汇工程项目管理系统具备全面的…

axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

L2-2 病毒溯源 坑点

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株&#xff0c;而这些变异的病毒又可能被诱发突变产生第二代变异&#xff0c;如此继续不断变化。 现给定一些病毒之间的变异关系&#xff0c;要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的&a…

Linux_CentOS7/8系统 - 关闭图形界面新增用户机制手册

Linux_CentOS7/8系统 - 关闭图形界面新增用户机制手册 在系统完成图形界面安装后重新启动后第一次登入&#xff0c;在图形界面会有新增用户页面&#xff0c;那如果取消关闭可以按以下操作&#xff1a; CTRLALTF2 root账号登录 yum remove gnome-initial-setup -y init 3 init …

【优质书籍推荐】《Effective Java》是人工智能的基石

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Mybatis-plus动态数据源

由于服务没有做微服务部署&#xff0c;需要在后台管理系统访问其他服务的库&#xff0c;所以需要用到动态数据源切换 引入依赖 mybatis-plus动态数据源依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot…