|
串口接收程序: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
2020-2-20 11:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
11.55 KB, 下載次數: 46, 下載積分: 黑幣 -5
內含三個matlab子程序
評分
-
查看全部評分
|