I need to read high freq. analog signal data from one ADC1 channel and read low freq. data from other ADC1 pins.
I use I2S for the high freq. data read, which runs perfectly, but as soon as I2S is configured all other ADC1 pins read 4095 only.
What is the correct handling for my demands?
Can't use ADC2 because of wifi.
Code excerpt:
void readerTask(void *param) {
size_t bytesRead = 0;
while(true) {
// Get ADC data from DMA buffer
i2s_read(I2S_NUM_0, buf, sizeof(buf), &bytesRead, portMAX_DELAY);
// prevent the data getting corrupted
i2s_adc_disable(I2S_NUM_0);
/* data processing */
delay(30);
i2s_adc_enable(I2S_NUM_0);
}
}
void setup() {
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN),
.sample_rate = 8000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S_LSB,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 2,
.dma_buf_len = 1024,
.use_apll = false,
.tx_desc_auto_clear = false,
.fixed_mclk = 0};
//install and start i2s driver
i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
//init ADC pad
i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_0);
// enable the ADC
i2s_adc_enable(I2S_NUM_0);
// start a task to read samples from I2S
xTaskCreatePinnedToCore(readerTask, "Reader Task", 2048, NULL, 1, NULL, 0);
}
void loop()
{
EVERY_N_MILLISECONDS( 100 ) {
// read low freq. data
int test = analogRead(34); // will always read 4095
}
}