Hi forum.
I would like to sample within a specific window, using continuous mode and the DMA feature. I finally seems to have the ADC and DMA working correctly, but I am facing some problems...
I have an GPIO input, that should start and stop the sampling, with as big accuracy as possible.
- How do I start the sampling accurate when the timer interupt occurs? I can not call the adc_continuous_start from within the ISR, that causes an reboot. I think, that it takes too long, or is blocking - but not sure exactly why it fails. But it does.
- And I also want to stop the sampling the same way.
- And I would like to read the buffer, after I stop the sampling, but it seems like the resources are not available anymore. I get a ADC stopped error.
- And lastly, I would like to clear the buffer and ADC and start from scratch, making a new sampling. The only way I can see, is to adc_continuous_deinit everything. Is there a way just to reset the buffer?
I want to sample 4 channels for 100mS, at 10KHz making that a total of 4.000 samples. And my initial thought, was simply to make the buffer large enough, and read it, to avoid any ISR to handle sample data. I should have plenty of resources available.
But how do I make a precision timed sampling? Any ideas?
ADC and accurate timing
-
- Posts: 35
- Joined: Sun Mar 10, 2024 9:34 pm
Re: ADC and accurate timing
Hi again.
An alternative would be, if I can somehow log the index of the DMA buffer upon interupt. So I know, where my sample starts and stops. Is that possible?
Any help apreciated![Smile :-)](./images/smilies/icon_e_smile.gif)
An alternative would be, if I can somehow log the index of the DMA buffer upon interupt. So I know, where my sample starts and stops. Is that possible?
Any help apreciated
![Smile :-)](./images/smilies/icon_e_smile.gif)
-
- Posts: 9052
- Joined: Thu Nov 26, 2015 4:08 am
Re: ADC and accurate timing
If you use the ESP32-C6, you may be able to use the ETM to do a bunch of those things with a fairly high degree of precision. (Although I'm not sure about the support for this in ESP-IDF, you may want to look that up as well.)
-
- Posts: 35
- Joined: Sun Mar 10, 2024 9:34 pm
Re: ADC and accurate timing
I use the ESP32-S3. I have looked into getting the buffer position, but it dont seem straight forward.
I have tried to set the samplesize to 1 sample and trigger the adc_continuous_register_event_callbacks to make my own counter, but then the real benefit of the DMA is less, and it puts more strain on the processor.
So I am still thinking about the best workaround to get the ADC to sample only between 2 GPIO interupts with as little lack as possible.
If only I could use adc_continuous_start from within an GPIO interupt, but when I do that, it crashes.
I have tried to set the samplesize to 1 sample and trigger the adc_continuous_register_event_callbacks to make my own counter, but then the real benefit of the DMA is less, and it puts more strain on the processor.
So I am still thinking about the best workaround to get the ADC to sample only between 2 GPIO interupts with as little lack as possible.
If only I could use adc_continuous_start from within an GPIO interupt, but when I do that, it crashes.
-
- Posts: 1
- Joined: Thu Mar 28, 2024 9:05 am
Re: ADC and accurate timing
Hi Frank,
I'm trying to do the exact same thing.
I found the following issue on the esp-idf github page: https://github.com/espressif/esp-idf/issues/13484
I think the solution might be to: init the driver, start the driver (on the first interrupt), stop the driver (on the second interrupt), deinit the driver and start over again.
For my application this will work because I only need to analyze a single window, but if you need constant window output, this might not work.
I will try to see if this solution will work, I will let you know the result.
~Stan
I'm trying to do the exact same thing.
I found the following issue on the esp-idf github page: https://github.com/espressif/esp-idf/issues/13484
I think the solution might be to: init the driver, start the driver (on the first interrupt), stop the driver (on the second interrupt), deinit the driver and start over again.
For my application this will work because I only need to analyze a single window, but if you need constant window output, this might not work.
I will try to see if this solution will work, I will let you know the result.
~Stan
Who is online
Users browsing this forum: Baidu [Spider], Majestic-12 [Bot] and 194 guests