如何使用STM32F4 DAC生成混频正弦波?

How to generate mixed frequency sinewave using STM32F4 DAC?

我正在使用 STM32F4 探索板。我使用 DAC Channel1 生成了 10Hz 正弦波。

根据 STM 的应用说明,正弦波生成应按如下方式进行:

它可用于使用以下公式产生所需的频率:

这是我填充 100 个样本的简单函数。因为我使用了 fTimerTRGO = 1kHz,所以 fSinewave 正确地为 1k/100 = 10Hz

Appl_getSineVal();
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)Appl_u16SineValue, 100, DAC_ALIGN_12B_R);
.
.
.
.
void Appl_getSineVal(void)
{
    for (uint8_t i=0; i<100; i+=1){
        Appl_u16SineValue[i] = ((sin(i*2*PI/100) + 1)*(4096/2));
    }
}

现在我想在同一通道上叠加另一个频率为5Hz的正弦波以获得混合频率信号。我需要帮助解决这个问题。

我尝试用不同的正弦值填充 Appl_u16SineValue[] 数组,但这些尝试在这里不值得一提。

为了合并两个正弦波,只需将它们相加:

sin(...) + sin(...)

由于总和在 [-2...2] 范围内(而不是 [-1...1]),因此需要对其进行缩放。否则会超出DAC范围:

0.5 * sin(...) + 0.5 * sin(...)

现在可以像以前一样适配DAC整数范围了:

(0.5 * sin(...) + 0.5 * sin(...) + 1) * (4096 / 2)

除了增益0.5和0.5,也可以选择其他增益,例如0.3 和 0.7。他们只需要加起来 1.0.

更新

对于 10Hz 和 5Hz 正弦波的特定情况,代码如下所示:

for (uint8_t i=0; i < 200; i++) {
    mixed[i] = (0.5 * sin(i * 2*PI / 100) + 0.5 * sin(i * 2*PI / 200) + 1) * (4096 / 2);
}