How to set ADC1 channel gain when using with I2S?

danjulio
Posts: 15
Joined: Tue Feb 25, 2020 9:00 pm

How to set ADC1 channel gain when using with I2S?

Postby danjulio » Sun Feb 26, 2023 10:43 pm

I am attempting to use an ADC1 channel as an audio input via the I2S system. I have it working, however I cannot seem to set the gain on the channel to anything other than 11dB (ADC_ATTEN_DB_11). I would like to set it to ADC_ATTEN_DB_6 to better match the input signal range.

I am using IDF v4.4.2. I looked at the source code and I think the way the IDF works is as follows after I call "i2s_adc_enable" to enable sampling on the input (the I2S driver has been initialized).
1. i2s_adc_enable (in i2s.c) calls "_i2s_adc_mode_recover()"
2. _i2s_adc_mode_recover (in i2s.c) calls "adc_i2s_mode_init()"
3. adc_i2s_mode_init (in adc_deprecated.c) sets the ADC channel attenuation to DIG_ADC_ATTEN_DEFUALT (which is ADC_ATTEN_DB_11).

I thought calling adc1_config_channel_atten() after calling i2s_adc_enable() with ADC_ATTEN_DB_6 would correctly set the ADC attenuation but it does not seem to work. Does anyone know why this doesn't work or how I should do this?

As a workaround my system works if I change the constant DIG_ADC_ATTEN_DEFUALT in adc_deprecated.c to ADC_ATTEN_DB_6. However I'd rather not have to go modifying the IDF to make this program work.

Who is online

Users browsing this forum: MicroController and 77 guests