【STM32 通用】在串口上绘制正弦波
1. 引言
不使用PWM、DAC等产生正弦波,仅仅是绘制生成一个正弦波数组,并解释其中含义。
2. 伪代码
#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) {
// 主循环代码
}
}
3. 解释
3.1 生成正弦波方式
直接使用的是math库中的sin函数,其实可以在Excel中生成正弦波数组然后复制进来也行,主要是为了通用性。这里说一下DSP库中的arm_sin_f32函数,同样也是生成正弦波的函数,但是相对于math库中的sin函数来说,牺牲了精度,获得了速度,选择哪一个函数取决于你的应用需求,是否偏重于精度还是性能。
3.2 sample_interval (采样间隔)

3.3 为什么需要采样间隔
设频率为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的波形,无法调整频率!
3.4 采样频率
假如同上所说,直接写θ = 2π * i / 256,N=256,生成的是固定1Hz的波形。由于在实际采样信号的时候,采样点数N=采样频率 / 信号频率,目前已知采样点数和信号频率,则可算出采样频率为256Hz,那么可见在分母下的这个数字256就是采样频率,则有结论,当想要绘制一个100Hz的波形的时候使用256Hz采样频率是不可行的,在一个周期只能绘制出2个点左右,最好乘以10;绘制其他频率的正弦波则可以根据需求改变采样率。
3.5 总结
采样间隔是信号采样理论中的关键参数,其作用是:
- 将连续的模拟信号离散化时,保证采样点均匀分布
- 通过数学关系 sample_interval=1/(f×N),确保生成的数组能准确反映目标频率
- 在代码中隐含了 "每个数组元素对应的时间位置",为后续输出控制提供理论依据。
博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/hai-feng-dev/p/18774938

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