完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本文框架:
(1)介绍控制系统的基本性能要求及常用性能指标; (2)简介RT1064与无线串口透传模块; (3)MATLAB数据处理过程详解; (4)效果展示与分析; (5)操作指南(手把手教你使用)。 一、控制系统相关知识 (1)控制系统的基本性能要求:稳、准、快 稳:指的是系统的稳定性。稳定性是系统重新恢复平衡状态的能力。不稳定的系统将出现持续的震荡,无法运用于自动控制系统中。 准:对系统稳态(静态)性能的要求。对于一个稳定的系统而言,当过渡过程结束后,系统输出量的实际值与期望值之差称为静态误差,它是衡量系统控制精度的重要指标。稳态误差越小,表示系统的准确性越好,控制精度越高。 快:对系统动态(过渡过程)性能的要求。描述系统动态性能可以用平稳性和快速性加以衡量。平稳是指系统由初始状态过渡到新的平衡状态时,具有较小的过调和振荡性;快速性是指系统过渡到新的平衡状态所需要的调节时间最短。动态性能是衡量系统质量高低的重要指标。 (2)系统的动态性能指标: 延迟时间td :阶跃响应第一次达到终值h(∞)的50%所需时间。 上升时间tr :阶跃响应从终值的10%上升到终值的90%所需时间;对有振荡的系统,也可以定义为从0到第一次达到终值所需要的时间。 峰值时间tp:阶跃响应越过终值h(∞)达到第一个峰值所需时间。 调节时间ts :阶跃响应到达并保持在终值h(∞)±5%(或2%)误差带内所需要的最短时间。 超调量σ%:峰值超出终值h(∞)的百分比,即 在上述动态性能指标中,我们常用调节时间ts (反映过渡过程的长短)、超调量σ%(反映过渡过程的波动程度)和峰值时间tp来作为系统的动态性能指标。 二、硬件模块简介 (1)RT1064核心板 RT1064为NXP公司推出的RT1064,属于RT1060系列,Cortex M7内核,拥有600Mhz运行主频4MB Flash,1MB SRAM,32KB I-Cache,32KB D-Cache,是现阶段运算性能最为强劲的一款微控制器。详细威廉希尔官方网站 指标可到NXP官网查看。这里我使用的是逐飞科技有限公司推出的RT1064最小系统版。 (2)无线串口透传模块 这里我使用的是逐飞科技推出的无线转USB(接上位机)/无线转串口(接下位机)模块,相比于平常使用的蓝牙模块,无需了解其他知识,就能快速入手,且该模块传输距离更远、传输速度更快!个人感觉:真香! 有两点需要注意一下:①在接线时,上位机的RX引脚要接下位机的TX引脚,同样上位机的TX引脚要接下位机的RX引脚。②我们传输的数据类型一般为int型、double型等等,而串口一次只能发送8位的数据,且发送的数据格式为uint8。这就需要涉及到数据转换。以int32型为例,因为int型数据有正负,需要先进行符号位的判断,先向上位机发送符号位(2字节);int32有32位数据,须将它分解为4个字节,依次发送给上位机。因此,一个int32型的数据通过数据转换为6个字节数据进行传输。其他数据类型的传输同理可得。若不知道某数据类型的字节数,可用sizeof( )函数进行获取。以下为数据转换代码,基于RT1064+逐飞的无线转串口模块,仅供参考。 void data_int32_transform(int32 data)//数据转换{ i_bit=sizeof(data); //获取数据字节数 if(data>=0) //判断数据正负,若为正值,标志位为0 { val=0; seekfree_wireless_send_buff(&val,1);//发送符号标志位 //data=abs(data); for(i_bit;i_bit>=0;--i_bit) //移位处理,先发送高位 { data_temp=(uint8)(data>>(8*i_bit)); seekfree_wireless_send_buff(&data_temp,1);//发送数据 } } else //若为负值,标志位为1 { val=1; seekfree_wireless_send_buff(&val,1);//符号标志位 data=abs(data); for(i_bit;i_bit>=0;--i_bit) { data_temp=(uint8)(data>>(8*i_bit)); seekfree_wireless_send_buff(&data_temp,1); } }} 三、MATLAB数据处理: 如下图所示,我在做速度、电流双闭环时同时向上位机发送了两种数据内容:电流值与速度值,且轮流发送;数据值即为单片机经过上述数据转换后发送给上位机的内容;每个数据内容为6个字节,其中分为2个字节的符号位和4个字节的数据位。 诚然,在MATLAB里需要将数据值再一次进行数据转换才能处理。我的转换思路为:(1)将数据值的每2个字节进行合并,即第一个字节左移8位并和第二个字节进行或运算;(2)经上述处理后,每个数据内容变为一个符号位和两个数据位;此时再将两个数据位合并,根据符号位判断数据的正负,到此数据转换结束,我们就能得到单片机原始要发送的数据(3)因为我同时发送了两种内容的数据,最后我还需要将数据进行分类处理。 以下为MATLAB数据处理代码: duty=30;s_P=2.58;s_I=0.82;c_P=0;c_I=0;goal_speed=(duty*2); goal_current=(310+duty); %以上为我所需要的一些常量a=textread('E:毕业设计无线转串口串口助手串口助手sscom32SaveWindows2021_3_28_19-28-50.txt','%s')';%以字符形式打开文件,文件地址具体查看你的数据文档所在地址alpha=hex2dec(a)'; %16进制转化为10进制数,存入alpha矩阵,方便后面的数据处理 row=size(alpha,2); %判断我的数据总数,若只有一个数据内容:00 01 00 00 0C 5A 则 row=6,存入1X6大小的矩阵%以下为变量初始化temp=zeros(1,row/2);%将数据值的每2个字节合并后暂存区矩阵data=zeros(1,row/6);%数据内容暂存区矩阵current_data=zeros(1,row/12); %存放电流数据的矩阵speed_data=zeros(1,row/12); %存放速度数据的矩阵speed_lower_err_line=zeros(1,row/12);%速度动态响应曲线的下误差线speed_upper_err_line=zeros(1,row/12);%速度动态响应曲线的上误差线current_lower_err_line=zeros(1,row/12);%电流动态响应曲线的下误差线current_upper_err_line=zeros(1,row/12);%电流动态响应曲线的上误差线for i=1:row/2 temp(1,i)=bitor(bitshift(alpha(1,2*i-1),8),alpha(1,2*i));%每2个字节数据进行合并处理,经过这步处理后,每个数据内容由原本占用1X6的矩阵变为1X3的矩阵,其中第一个表示符号位,第二、三个表示数据数据位。endfor j=1:row/6 data(1,j)=bitor(bitshift(temp(1,3*j-1),8),temp(1,3*j));%将数据位合并 if(temp(1,(3*j-2))==256)%判断符号位正负,移位后原本的负号标志1变为256 data(1,j)=-data(1,j); endendfor jj=1:row/12 %将电流数据和速度数据经行分类处理,并确定各自的误差带 current_data(1,jj)=data(1,(2*jj-1)); speed_data(1,jj)=data(1,(2*jj)); speed_lower_err_line(1,jj)=(goal_speed+goal_speed*0.05); speed_upper_err_line(1,jj)=(goal_speed-goal_speed*0.05); current_lower_err_line(1,jj)=(goal_current+goal_current*0.05); current_upper_err_line(1,jj)=(goal_current-goal_current*0.05);end figure(1);%画出电流动态响应曲线hold on plot(1:5:(row/12)*5,current_data(1,1:row/12)); plot(1:5:(row/12)*5,current_lower_err_line(1,1:row/12),'r--');%上误差线 plot(1:5:(row/12)*5,current_upper_err_line(1,1:row/12),'r--');%下误差线hold off current_ave=mean(current_data(:));%求电流平均值 %legend('name'); title({['左轮开环空载电流时间图像(占空比:',num2str(duty),'%)'],['电流平均值:',num2str(current_ave),'mA/5ms']}); xlabel('Time(ms)'); ylabel('Current(mA)'); figure(2)%画出速度动态响应曲线hold on plot(1:5:(row/12)*5,speed_data(1,1:row/12)); plot(1:5:(row/12)*5,speed_upper_err_line(1,1:row/12),'r--');%上误差线 plot(1:5:(row/12)*5,speed_lower_err_line(1,1:row/12),'r--');%下误差线hold offspeed_ave=mean(speed_data(:));%求转速平均值%legend('name');title({['左轮空载脉冲时间图像(占空比:',num2str(duty),'% P:',num2str(s_P),' I:',num2str(s_I),')'],['转速平均值:',num2str(speed_ave),'脉冲/5ms']});xlabel('Time(ms)');ylabel('Speed(脉冲)');saveas(gcf,'E:毕业设计Matlab波形空载Speed左轮test1.jpg');%保存图像 四、效果展示与分析: 话不多说,直接上图展示: (1)空载下采用开环控制 (2)空载下采用电流单闭环控制 (3)空载下采用速度单闭环控制 (4)空载下采用速度、电流双闭环控制 本期就只给出空载下的效果图哈,下期给出负载下的效果图和个人调节双闭环的心得!想要学习的小伙伴记得关注我哈~ 从图像上来分析,在空载时若采用电流、速度闭环控制方式,其电流值出现超调量后快速趋于一个恒定值而波动,其调节时间最短;其速度值出现超调量后快速趋于期望值,调节时间最短,且调节过程较为平稳,没有太大的波动。 相比于传统的目测法、经验法调节PID参数,采用辅助工具进行调参显然更具科学性! 此外根据响应情况,我们可以快速的判断出该调节哪个参数、调大或者调小。 五、操作指南: 1、硬件连接、无线模块的配置、单片机程序设计 依照自己的情况而定。 2、上位机处理 我所使用的串口助手是sscom5.13.1,具体使用步骤如下: 3、导入数据到MATLAB 将数据文本的地址拷贝到MATLAB中,点击运行,进行数据处理。 4、图像分析 根据MATLAB生成的系统动态响应图像,借助第一节所提到的相关性能指标,进行参数调节。 总结 整篇文章涉及的内容庞杂,爱学习的小伙伴细品细品,相信你会学习到很多知识!鉴于我也是刚入门的C鸟,所以还请多多指教!有不懂的地方欢迎留言… |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1866 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1656 浏览 1 评论
1133 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
755 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1717 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
784浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
608浏览 3评论
626浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
588浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-9 15:14 , Processed in 0.751535 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号