本文框架:
(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鸟,所以还请多多指教!有不懂的地方欢迎留言…
|