WaveGene信号発生ソフト
Wave1【サイン波】【1000Hz】【-10㏈】【L】
Wave2【三角波】【1000Hz】【-10㏈】【R】
WaveGene→PCM1808入力→ PCM5102出力→オシロスコープ
CH1【L】 サイン波
CH2【R】 三角波
参考サイト
回路図
ESP32-S3 開発ボード
5Vピン → 5V出ない(入力ピン)?
(赤い線材)三端子レギュレータから直接5Vを取出しPCM1808のアナログ電圧(5V)に供給。(自己責任で)
PCM5102A - 32ビットDAC
アマゾン購入
【SCK】ブリッジ(内部クロック)【H1L】(FLT) L側 ブリッジ
【H2L】(DEMP) L側 ブリッジ
【H3L】(XSMT) H側 ブリッジ
【H4L】(FMT) L側 ブリッジ
PCM1808 - 24ビットADC
アマゾン購入
回路不明
IC周辺にコンデンサー・抵抗がついているので外付け必要ない?
SCK ー MCLK(マスタークロック)プログラムで変更可能
FMT - GND
●スレーブ・モード
MD1 - GND
MD0 - GND
MCLK波形
ボードマネージャ
追加ボードマネージャーURLを変更
【https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json】
【esp 32】
【バージョン3.2.0】インストール
ライブラリマネージャー
●ESP32-audioI2S-master
所定のlibrariesに貼付
【i2s】
【バージョン3.2.1】インストール
プログラム Arduino IDE【ボード:ESP32S3 Dev Module】
//https://tj-lab.org/2022/10/05/esp32-s3-af%e4%bf%a1%e5%8f%b7%e5%87%a6%e7%90%86%e3%83%9c%e3%83%bc%e3%83%89/
#include <driver/i2s.h>
#define fsample 48000
#define BLOCK_SAMPLES 64
//buffers
int rxbuf[BLOCK_SAMPLES*2], txbuf[BLOCK_SAMPLES*2];
float Lch_in[BLOCK_SAMPLES], Rch_in[BLOCK_SAMPLES];
float Lch_out[BLOCK_SAMPLES], Rch_out[BLOCK_SAMPLES];
#define MUTE 40 // MUTE control (LOW: Mute)
/*-----------------------------------------------------------------------------------------------
Setup
-------------------------------------------------------------------------------------------------*/
void setup(void) {
Serial.begin(115200);
delay(50);
pinMode(MUTE, OUTPUT);
digitalWrite(MUTE, HIGH); // unmute
// I2S setup ------------------------------------------------------------
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX), //I2S作業モード
.sample_rate = fsample, //I2Sサンプルレート
.bits_per_sample = (i2s_bits_per_sample_t)32, //サンプルあたりのI2Sビット
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //I2Sチャネルフォーマット
.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_I2S), //I2S通信フォーマット
.intr_alloc_flags = 0, //割り込みを割り当てるために使用されるフラグ
.dma_buf_count = 6, //I2S DMAバッファ数
.dma_buf_len = BLOCK_SAMPLES*4, //I2S DMAバッファ長
.use_apll = false, //2SはAPLLをメインI2Sクロックとして使用し、正確なクロックを取得
.tx_desc_auto_clear = true, //データが利用できない場合にノイズを回避
.fixed_mclk = 0, //固定MCLK出力を使用するI2S
};
i2s_driver_install( I2S_NUM_0, &i2s_config, 0, NULL); //I2S ドライバーをインストールして起動
i2s_pin_config_t pin_config = {
.bck_io_num = 42, //BCK
.ws_io_num = 2, //LRC,LCK
.data_out_num = 41, //DIN
.data_in_num = 1 //OUT
};
i2s_set_pin( I2S_NUM_0, &pin_config);
}
/*-----------------------------------------------------------------------------------------------
Signal Process Loop
-------------------------------------------------------------------------------------------------*/
void loop(void) {
size_t readsize = 0;
//Input
esp_err_t res = i2s_read(I2S_NUM_0, &rxbuf[0], BLOCK_SAMPLES*2*4, &readsize, portMAX_DELAY);
if (res == ESP_OK && readsize==BLOCK_SAMPLES*2*4) {
int j=0;
for (int i=0; i<BLOCK_SAMPLES; i++) {
Lch_in[i] = (float) rxbuf[j];
Rch_in[i] = (float) rxbuf[j+1];
j+=2;
}
//-------Signal process -------------------------------
for (int i=0; i<BLOCK_SAMPLES; i++) {
Lch_out[i] = Lch_in[i];
Rch_out[i] = Rch_in[i];
}
//------------------------------------------------------
//Output
j=0;
for (int i=0; i<BLOCK_SAMPLES; i++) {
txbuf[j] = (int) Lch_out[i];
txbuf[j+1] = (int) Rch_out[i];
j+=2;
}
i2s_write( I2S_NUM_0, &txbuf[0], BLOCK_SAMPLES*2*4, &readsize, portMAX_DELAY);
}
}
.png)
.png)

.png)
.png)
.png)
0 件のコメント:
コメントを投稿