【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 &lt; 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;绘制其他频率的正弦波则可以根据需求改变采样率。

总结

采样间隔是信号采样理论中的关键参数,其作用是:

  1. 将连续的模拟信号离散化时,保证采样点均匀分布

  2. 通过数学关系 sample_interval=1f×Nsample_interval=f×N1​,确保生成的数组能准确反映目标频率

  3. 在代码中隐含了 “每个数组元素对应的时间位置”,为后续输出控制提供理论依据。

博客导航

博客导航

posted @ 2025-02-04 15:45  膝盖中箭卫兵  阅读(128)  评论(0)    收藏  举报  来源
ORCID iD icon https://orcid.org/0000-0001-5102-772X