智能车基于RT1064+无线串口透传模块利用MATLAB辅助调节PID参数

本文框架:

(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:\毕业设计\无线转串口\串口助手\串口助手\sscom32\SaveWindows2021_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的矩阵,其中第一个表示符号位,第二、三个表示数据数据位。
end
for 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);
    end
end
for 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 off
speed_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鸟,所以还请多多指教!有不懂的地方欢迎留言…

  • 14
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值