目錄
1. MATLAB獲取 STM32 的原始數據
2. 將數據上傳到電腦
3. MATLAB 接收數據并驗證
STM32進行傅里葉代碼
結果分析
STM32 和 MATLAB 聯調是嵌入式開發中常見的工作流程,通常目的是將 STM32 采集的數據或控制信號傳輸到 MATLAB 中進行實時處理、分析和可視化,同時也可以將在開發板上運行算法,然后再與Matlab計算的結果做對比,對我們的算法進行驗證。
以在項目中對磁通門傳感器進行數據處理為例,進行在 STM32 和 MATLAB 聯調,以下是三個關鍵步驟:
1. MATLAB獲取 STM32 的原始數據
在 STM32 上,首先需要從傳感器或其他外設獲取原始數據。這個過程通常涉及:
- 配置 ADC、傳感器接口(如 I2C、SPI 等)來讀取傳感器數據。
- 將采集到的數據存儲到數組或緩沖區中,準備傳輸。
示例代碼:
// 這是采集到的原始數據:Flugate_frame.dataBuf的緩存數組,包含磁通門傳感器X、Y、Z三個軸的數據
// 數據填充過程,讀取磁通門傳感器X軸數據到數組中,先對X軸的數據做FFT變換int groupCount = Flugate_frame.dataLen / 12; /* 每組12字節(x,y,z) */
for (int i = 0; i < groupCount; i++)
{ if(Flugate_Date.Data_idx < 512) { //從原始數據緩存數組中提取X軸的數據到數組Flugate_Date.axis_X_Data_FFT_Input中,作為FFT的輸入 memcpy(&Flugate_Date.axis_X_Data_FFT_Input[Flugate_Date.Data_idx], &Flugate_frame.dataBuf[i*12 + 0], 4); Flugate_Date.Data_idx++;//數據組數 }
}
2. 將數據上傳到電腦
在 STM32 上,使用串口(USART)、USB、I2C、SPI 或網絡通信(如 TCP/IP)將原始數據發送到計算機。
- 通過串口發送數據:使用
HAL_UART_Transmit()
或直接操作串口接口,發送數據到計算機。 - 通過 USB:將 STM32 配置為 USB 虛擬串口或 USB 存儲設備,將數據通過 USB 上傳到計算機。
- 通過網絡(TCP/IP):如果 STM32 具有網絡接口(如以太網或 Wi-Fi),則可以通過 TCP/IP 協議將數據傳輸到計算機。
示例代碼(串口發送數據):
comSendBuf(COM4, (uint8_t*)&Flugate_Date.axis_X_Data_FFT_Input[Flugate_Date.Data_idx], 4);
3. MATLAB 接收數據并驗證
在 MATLAB 中,接收 STM32 上傳的數據,進行驗證、處理和可視化:
- 打開串口:在 MATLAB 中使用 serialport 打開與 STM32 的連接,我這里是通過串口發送數據,所以用到?serialport 來接收數據。
- 接收數據:使用??read 等函數接收數據。
- 數據驗證與處理:接收的數據可以進行校驗、濾波、分析或可視化,確保其正確性。
- STM2發送的數據是來自傳感器,每個數據均為4個字節,共發送了512個數據,對這512個數據進行FFT變換。
示例代碼(MATLAB 接收數據):
clear;serialObj = serialport('COM11', 115200); % 替換為正確的串口號% 設置超時時間為 200 秒
serialObj.Timeout = 200; % 設置超時為 20 秒% 讀取 512 * 4個 字節的數據
numFloats = 512;
% 按字節讀取數據
data_UINT8 = read(serialObj, numFloats * 4, "uint8"); % 將字節數據重新排列為 4 字節一組
% 重塑為 512 行,每行 4 字節
data_UINT8 = reshape(data_UINT8, 4, 512).' ; % 更改數據大小端
data_UINT8_change = fliplr(data_UINT8);% 創建一個 512x1 的全零數組
float_value = zeros(512, 0); for index = 1:512
% 將四個字節合并成一個32位無符號整數
int_value = bitshift(data_UINT8_change(index,1), 24) + bitshift(data_UINT8_change(index,2), 16) + bitshift(data_UINT8_change(index,3), 8) + data_UINT8_change(index,4);
% 將該無符號整數轉換為float
% int_value 需要先轉為int32類型
float_value(index) = typecast(int32(int_value), 'single'); end
% 關閉串口連接
clear serialObj;%進行ftft
%采樣頻率
Fs = 512;
%采樣點數
N = 512;
float_value_FFT = fft(float_value,N);Mag = abs(float_value_FFT);
STM32進行傅里葉代碼
具體代碼附件可以進行私聊。同時STM32實現FFT可見博客:嵌入式開發:傅里葉變換(5):基于STM32-DSP庫實現-CSDN博客
結果分析
STM32進行FFT的濾波效果:
Matlab濾波效果:
比較聯調可得STM32 FFT變換后的結果和Matlab中基本一致,求出的幅值響應沒有問題。