【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,确保生成的数组能准确反映目标频率
-
在代码中隐含了 “每个数组元素对应的时间位置”,为后续输出控制提供理论依据。
博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/Skyrim-sssuuu/p/18774938

浙公网安备 33010602011771号
https://orcid.org/0000-0001-5102-772X