You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用STM32F4的DAC生成混合频率正弦波

解决方案

问题根因

你之前修改数组失败的核心原因:当前采用的100个采样点对应10Hz正弦波的1个完整周期,而5Hz正弦波的完整周期需要200个1kHz采样点,直接在100点数组里塞入半个5Hz周期的话,DMA循环播放时会出现相位跳变,无法输出正确的叠加信号。

具体实现步骤

  • 第一步:调整采样数组长度为200。10Hz和5Hz的最小公共周期为0.2s(对应5Hz的1个周期、10Hz的2个周期),在1kHz的TRGO触发频率下,需要200个采样点才能覆盖完整公共周期,循环播放无相位断裂。
  • 第二步:修改DAC DMA启动参数,将传输长度从100改为200。
  • 第三步:修改正弦值生成函数,叠加两个频率的正弦分量,同时做幅值适配避免超出12位DAC的0~4095输出范围。

适配后代码

首先修改DAC启动逻辑:

Appl_getSineVal();
// 第四个参数从原100改为200
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)Appl_u16SineValue, 200, DAC_ALIGN_12B_R);

同步修改正弦值生成函数,采样数组定义需同步改为uint16_t Appl_u16SineValue[200]:

void Appl_getSineVal(void)
{
    for (uint16_t i=0; i<200; i+=1){
        // 10Hz分量:200点内走2个完整周期
        float sine10 = sin(i * 2 * PI / 100);
        // 5Hz分量:200点内走1个完整周期
        float sine5 = sin(i * 2 * PI / 200);
        // 两个分量各占一半幅值,叠加后偏移到0~4095范围,避免削波
        Appl_u16SineValue[i] = (uint16_t)((sine10 + sine5) * (4096 / 4) + (4096 / 2));
    }
}

如果需要调整两个信号的幅值比例,只要修改两个正弦值的系数即可,只要保证叠加后的最大值不超过2、最小值不低于-2,就不会出现失真。比如要10Hz占70%、5Hz占30%,计算式改为(0.7*sine10 + 0.3*sine5) * (4096 / 2) + (4096 / 2)即可。

内容的提问来源于stack exchange,提问作者Vishwesh GM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:36:01