This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Continuous periodic nRF52840 ADC sampling with Zephyr

Hello, guys.

We are using Zephyr RTOS (NCS v1.4.2) with nRF52840 development kit.

The idea is to have continuous ADC sampling on two ADC channels. So far, I was able to properly initialize the ADC device, and get one single ADC read with the following piece of code:

const struct adc_sequence sequence = {
	.channels = BIT(ADC_1ST_CHANNEL_ID),
	.buffer = m_sample_buffer,
	.buffer_size = sizeof(m_sample_buffer),
	.resolution = ADC_RESOLUTION,
};

ret = adc_read(adc_dev, &sequence);
if (ret) {
    printk("adc_read() failed with code %d\n", ret);
}

There is an issue even with this piece of code because, when I call adc_read(adc_dev, &sequence) function, only the first value of m_sample_buffer is updated, the rest of the m_sample_buffer values remain 0. What I am missing here?

Other than that, is there any way that we configure ADC device to do periodic sampling in the background without our intervention?

Thanks in advance for your time and efforts.

Sincerely,

Bojan.

Parents
  • Thanks for your help, Einar.

    Please help me to better understand the following...

    If we use Zephyr OS and Zephyr timer to take the samples at regular intervals, can we tell Zephyr ADC API to take some number of samples from the particular channel, not only one sample?

    This is the sequence I call when the Zephyr timer expires:

    const struct adc_sequence sequence = {
    	.channels = BIT(ADC_1ST_CHANNEL_ID),
    	.buffer = m_sample_buffer,
    	.buffer_size = sizeof(m_sample_buffer),
    	.resolution = ADC_RESOLUTION,
    };
    
    ret = adc_read(adc_dev, &sequence);
    if (ret) {
        printk("adc_read() failed with code %d\n", ret);
    }

    I selected the channels I want to read as well as where to store the data. However, it seems that only one sample is stored. Can I somehow define the number of samples I want to take from the channel?

    Cheers,

    Bojan.

Reply
  • Thanks for your help, Einar.

    Please help me to better understand the following...

    If we use Zephyr OS and Zephyr timer to take the samples at regular intervals, can we tell Zephyr ADC API to take some number of samples from the particular channel, not only one sample?

    This is the sequence I call when the Zephyr timer expires:

    const struct adc_sequence sequence = {
    	.channels = BIT(ADC_1ST_CHANNEL_ID),
    	.buffer = m_sample_buffer,
    	.buffer_size = sizeof(m_sample_buffer),
    	.resolution = ADC_RESOLUTION,
    };
    
    ret = adc_read(adc_dev, &sequence);
    if (ret) {
        printk("adc_read() failed with code %d\n", ret);
    }

    I selected the channels I want to read as well as where to store the data. However, it seems that only one sample is stored. Can I somehow define the number of samples I want to take from the channel?

    Cheers,

    Bojan.

Children
No Data
Related