【STM32 系列】在串口上繪制正弦波
引言
不使用PWM、DAC等產生正弦波,僅僅是繪制生成一個正弦波數組,并解釋其中含義。
偽代碼
#include <math.h> #include "stm32f1xx_hal.h" // 根據實際型號調整頭文件define SINE_ARRAY_SIZE 256
define PI 3.14159265358979323846f
float sineWave[SINE_ARRAY_SIZE];
int main(void) {
// 系統初始化代碼...// 生成正弦波數據 float f= 1.0f; // 可修改為任意目標頻率 float sample_interval = 1.0f / (f* SINE_ARRAY_SIZE); // 采樣間隔 for (uint16_t i = 0; i < SINE_ARRAY_SIZE; i++) { float theta = 2.0f * PI * f* i * sample_interval; sineWave[i] = sinf(theta); } // 其他程序代碼... while (1) { // 主循環代碼 }
}
解釋
生成正弦波方式
直接使用的是math庫中的sin函數,其實可以在Excel中生成正弦波數組然后復制進來也行,主要是為了通用性。這里說一下DSP庫中的arm_sin_f32函數,同樣也是生成正弦波的函數,但是相對于math庫中的sin函數來說,犧牲了精度,獲得了速度,選擇哪一個函數取決于你的應用需求,是否偏重于精度還是性能。
sample_interval (采樣間隔)

為什么需要采樣間隔
設頻率為1Hz,則周期為1s。在for循環中,i從0遞增到255,則可計算相位θ:
θ= 2π * f * i * sample_interval
---> θ = 2π * i * 1 / 256
當i=0時,θ=0;
當i=255時,θ = 2π * 255 / 256 ≈ 2π,則正好是一個周期
若若省略采樣間隔,直接寫θ = 2π * i / 256,則生成的是固定1Hz的波形,無法調整頻率!
采樣頻率
假如同上所說,直接寫θ = 2π * i / 256,N=256,生成的是固定1Hz的波形。由于在實際采樣信號的時候,采樣點數N=采樣頻率 / 信號頻率,目前已知采樣點數和信號頻率,則可算出采樣頻率為256Hz,那么可見在分母下的這個數字256就是采樣頻率,則有結論,當想要繪制一個100Hz的波形的時候使用256Hz采樣頻率是不可行的,在一個周期只能繪制出2個點左右,最好乘以10;繪制其他頻率的正弦波則可以根據需求改變采樣率。
總結
采樣間隔是信號采樣理論中的關鍵參數,其作用是:
-
將連續的模擬信號離散化時,保證采樣點均勻分布
-
通過數學關系 sample_interval=1f×Nsample_interval=f×N1?,確保生成的數組能準確反映目標頻率
-
在代碼中隱含了 “每個數組元素對應的時間位置”,為后續輸出控制提供理論依據。
博客導航
本文來自博客園,作者:膝蓋中箭衛兵,轉載請注明原文鏈接:http://www.rzrgm.cn/Skyrim-sssuuu/p/18774938

浙公網安備 33010602011771號
https://orcid.org/0000-0001-5102-772X