找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2805|回复: 0
收起左侧

STM32F103ZET6进行AD采集并通过串口将数据传至MATLAB动态接收并进行处理

[复制链接]
ID:693785 发表于 2020-2-20 11:07 | 显示全部楼层 |阅读模式
串口接收程序:function Serial()   %创建函数
delete(instrfindall);   %先关闭串口,否则可能导致出错

global x            %全局变量,供串口中断函数使用

global t;                        %全局变量,这里根据需要绘制图形的个人需要而设
global m;
global i;

t = [0];      %时间轴
m = [0];      %数据轴
i = 0;        %用于计数

p = plot(t,m);
axis([i-50 i+50 -1 10]);
grid on;

%%----------------------------配置部分----------------------------

%创建串口对象,直接在命令框输入serial('com1')可查看串口参数
x = serial('com4');
%设置或修改串口通信参数
set(x,'BaudRate',115200);

%设置中断触发方式
set(x,'BytesAvailableFcnMode','Terminator') %ASCII触发,字符触发
set(x,'Terminator','CR/LF')         %接收到\r\n后触发中断

% set(x,'BytesAvailableFcnMode','byte')     %数据触发,根据发送来的数据长度来触发中断
% set(x,'BytesAvailableFcnCount',1)


x.BytesAvailableFcn = @Callback  %定义中断响应函数对象,类似于中断函数名

fopen(x);                %打开串口,类似于开关

fwrite(x,255);           %发送握手信号0xff,stm32接收到后开始回传数据
pause                 %需要暂停,来接收回传数据

fclose(x);

end


串口中断服务子程序:
function Callback(obj,event)   %创建中断服务函数,绘制图像

global t; %时间
global m; %纵坐标
global i; %时间变化值
%
if i<3000
    out = fscanf(obj);
    data = str2num(out)        %将接收到的字符转换为数值
    save('a.mat','data','-ascii','-append');

%     x=load('a.mat','-ascii');

%       out=fread(obj,5,'uint32');
%       data = str2num(out)
     %%----------------------以下根据需要自行编写-------------------------------
    t = [t i];                                                       
    m = [m data];
    plot(t,m)
    xlabel('t');
    ylabel('data');
    axis([i-50 i+50 0 3.3]);
    grid on;

    i=i+1;
end

end


对数据进行FFT处理:
% clear all
% close all
% clc
%% Parameter Interface
SampleFre = 1000; %采样频率
SignalData=load('a.mat','-ascii');
% SignalLen = 20000;  %数据长度
SignalLen=length(SignalData);
%% Main
%--------------------------------------------------------------------------------------
t = (0:SignalLen-1)/SampleFre; %时间
% SignalData = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); %采样频率>2倍信号最大频率
NoiseData = 2*randn(size(t));
SignalAddNoiseData = SignalData + NoiseData;
plot(1000*t(1:50),SignalAddNoiseData(1:50))
title('信号添加随机噪声')
xlabel('t(毫秒)')
%--------------------------------------------------------------------------------------
FFTData = fft(SignalAddNoiseData);
FFTAmplitude0 = abs(FFTData)/SignalLen;  %频谱关于SignalLen/2对称
FFTAmplitude1 = FFTAmplitude0(1:SignalLen/2);
FFTAmplitude0(2:end) = 2*FFTAmplitude0(2:end); %复数域的幅值需要进行变换才能与时域的幅值对应
FFTAmplitude1(2:end) = 2*FFTAmplitude1(2:end);
Frequence0 = SampleFre*(0:(SignalLen-1))/SignalLen;
Frequence1 = SampleFre*((0:(SignalLen/2)-1))/SignalLen;
subplot(2,1,1)
plot(Frequence0,FFTAmplitude0)
title('双边频谱')
xlabel('f(Hz)')
ylabel('FFTAmplitude')
subplot(2,1,2)
plot(Frequence1,FFTAmplitude1)
title('单边频谱')
xlabel('f(Hz)')
ylabel('FFTAmplitude')


mat.zip

11.55 KB, 下载次数: 46, 下载积分: 黑币 -5

内含三个matlab子程序

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表