【问题标题】:How to generate mixed frequency sinewave using STM32F4 DAC?如何使用 STM32F4 DAC 生成混合频率正弦波?
【发布时间】:2021-08-24 08:42:35
【问题描述】:

我正在使用 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[] 数组,但这些尝试在这里不值得一提。

【问题讨论】:

    标签: signal-processing stm32 dac sine-wave


    【解决方案1】:

    为了组合两个正弦波,只需添加它们:

    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);
    }
    

    【讨论】:

    • 感谢您的帮助。但是这种方法有助于混合两个正弦波样本的振幅。但我想混合频率。频率定义/决定为 ftimer/ns。但是我无法为具有相同 ns 但具有混合频率的 DAC 创建一个数组。希望你能解决我的问题。
    • 在时域中,混合两个频率就是混合两个正弦波幅度。我在 sin 函数中添加了具有不同公式的结果代码的样子。
    • 更新后的代码有效!这是一件如此简单的事情,但在我看到并理解它之前,我自己是无法想到的。非常感谢。对于其他尝试这样做的人,波形如下所示:imgur.com/a/UZh7Xxw
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2018-06-11
    • 2019-12-12
    • 2021-03-05
    相关资源
    最近更新 更多