// TestClickNoiseBef.ino - 内蔵DACのクリックノイズ対策(比較用 対策前のもの) #define PI 3.14159265 void setup() { Serial.begin(115200); Serial.println("PopNoise"); } void loop() { Serial.println("D/A create"); DAC_Create(); delay(1000); // PLAY for(int iLoop=0;iLoop<4;iLoop++){ Serial.print("Playing..."); DAC_Start(); // sin波出力 float rad = PI/10; for(int k=0;k<1000;k++){ int16_t val = (int16_t)(8192*sin(rad*k)); DAC_Write(val); } Serial.println("Stop"); DAC_Stop(); delay(1000); } // RELEASE Serial.println("Release"); DAC_Release(); delay(2000); } //////////////////////////////// // ESP32 サウンド出力(I2S+内蔵DAC) //////////////////////////////// #include #define FS 24000 // サンプリング周波数 #define DMA_BUF_COUNT 3 // DMAバッファの数 #define DMA_BUF_LEN 32 // DMAバッファの長さ(片側チャンネルのサンプル数) #define DMA_BUF_SIZE (DMA_BUF_COUNT*DMA_BUF_LEN) #define I2S_FIFO_LEN (64/2) const i2s_port_t i2s_num = (i2s_port_t)0; // i2s port number const i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN), .sample_rate = FS, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S_MSB, .intr_alloc_flags = 0, .dma_buf_count = DMA_BUF_COUNT, .dma_buf_len = DMA_BUF_LEN, .use_apll = 0 }; // DACの初期化 void DAC_Create() { i2s_driver_install(i2s_num, &i2s_config, 0, NULL); i2s_set_pin(i2s_num, NULL); i2s_stop(i2s_num); // Create時はstop状態 } // DACの解放 void DAC_Release() { i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver } // DACの開始 // DAC_Start()後は、DMAバッファが空になる前にDAC_Write()で出力データを書き込むこと void DAC_Start() { i2s_start(i2s_num); } // DACの停止 // データ出力後、DMAバッファが空になる前にこの関数を呼び出すこと void DAC_Stop() { i2s_stop(i2s_num); } // 1サンプル出力 // return 1:正常終了 0:Timeout -1:ESP_FAIL int DAC_Write(int16_t val) { // write to I2S DMA buffer uint16_t sample[2]; uint16_t us = ((uint16_t)val)^0x8000U; // 符号無へ変換(内蔵DACのみ) sample[0]=sample[1]=us; // mono -> stereo return i2s_push_sample(i2s_num, (const char *)sample, 100); } // 同じ値を複数回出力 int DAC_WriteS(int len, int16_t val) { int i; for(i=0;i DAC_Write(val)) break; } return i; }