Page 1 of 1

ESP32S3 ADC sampling using DMA

Posted: Tue Aug 13, 2024 10:58 am
by paradigmshift
Dear All,

I have been trying to design a C++ class for wrapping ADC sampling with DMA based on a circular buffer.
I was not able to make the DMA work although i was able to compile and write the ADC continuous mode config code.
What i want to accomplish is the following:

- I am hopping for a CPU free of load for ADC sampling if possible.
- I was thinking a circular buffer of 100-1000 bytes somewhere in that range.
- A pointer to the element that was just fed with the last ADC sample.
- The ADC sampling must constantly be populating the buffer in a circular manner.

I am using ESP IDF 5.1.1 with PlatformIO in VSCode.

So far i was only able to work with the oneshot mode.

Are all the above doable? (circular buffer and such)

Any example would be gold.

Thanks in advance.

Regards
Manos

Re: ESP32S3 ADC sampling using DMA

Posted: Sat Aug 17, 2024 8:47 am
by djixon
You can use ULP co-processor integrated into S3 to do that for you with 0% utilization of both LX7 cores. It also can work in deep sleep mode where both LX7 cores are shut down. There are examples within IDF how to do that. Basically, the only you need is a few bytes in fast ram to store measured values (that ram is shared among ULP and LX cores) and several hundred of bytes in that ram for ULP program which will actually perform ADC. Usual scenario of such a setup is like this. Once chip is powered on, ULP program (usually written in assembly and compiled for ULP coprocessor) is uploaded into fast memory and ULP is configured and started to run it. It can be written in infinite loop so it works forever as long as chip is not reset or powered down.