如何使用ESP32在MAX98357A中产生正弦波?

问题描述 投票:0回答:1

我正在尝试通过 I2S (MAX98357A) 生成正弦波。它显示正弦波,但如图所示扭曲。下面是我的代码

#include <Arduino.h>
#include <I2S.h>

#define I2S_SAMPLE_RATE     (44100)
#define I2S_SAMPLE_BITS     16
#define PIN_LRC             8
#define PIN_BCLK            7
#define PIN_DOUT            25

int count = 0;

void setup() 
{
  I2S.setSckPin(PIN_BCLK);
  I2S.setFsPin(PIN_LRC);
  I2S.setDataPin(PIN_DOUT);
  if (!I2S.begin(I2S_PHILIPS_MODE, I2S_SAMPLE_RATE, I2S_SAMPLE_BITS))
  {

    Serial.println("Failed to initialize I2S!");

    while (1)
      ; // do nothing
  }
}
int16_t GenerateSineWave()
{
    double rad = 2 * M_PI * 1000 * count++ / I2S_SAMPLE_RATE;
    int16_t sineVal = 32767 * sin(rad);
    return sineVal;
}
void loop()
{
  I2S.write(GenerateSineWave());
  I2S.write(GenerateSineWave());
}

有什么方法可以得到更完美的正弦波吗?

embedded esp32 i2s
1个回答
0
投票

如果一次“写入”超过 2 个字节,效果可能会更好。创建一个更大的缓冲区并将整个缓冲区写入驱动程序。向上循环: i2s_driver_install((i2s_port_t)I2S_NUM, &i2s_config, 0, NULL); 以及如何使用它。 然后使用 i2s_write((i2s_port_t)I2S_NUM, 缓冲区, ((位 + 8) / 16) * SAMPLE_PER_CYCLE * 4, &i2s_bytes_write, 100); 填充缓冲区后。这将使 DMA 通道保持满载,并应提供更平滑的正弦波。

© www.soinside.com 2019 - 2024. All rights reserved.