我正在尝试通过 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());
}
如果一次“写入”超过 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 通道保持满载,并应提供更平滑的正弦波。