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

SAADC with 8 channels do not map correctly on PCA10040

I am trying to measure the ADC on all 8 ADC pins of the nRF52 on the PCA10040. I'm noticing quite large amount on noise on floating lines (up to 0.6V). However my biggest issue is how the channels map to the buffer. I initialize each channel with its corresponding AIN pin.

//Setup ADC Channels
nrf_saadc_channel_config_t channel_config_0 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN0 );
channel_config_0.burst =  NRF_SAADC_BURST_ENABLED; //enabled
channel_config_0.gain = ADC_GAIN;
channel_config_0.acq_time = ADC_ACQ_TIME;


nrf_saadc_channel_config_t channel_config_1 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN1 );
channel_config_1.burst =  NRF_SAADC_BURST_ENABLED; //enabled
channel_config_1.gain = ADC_GAIN;
channel_config_1.acq_time = ADC_ACQ_TIME;

nrf_saadc_channel_config_t channel_config_2 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN2 );
channel_config_2.burst = NRF_SAADC_BURST_ENABLED; //enabled
channel_config_2.gain = ADC_GAIN;
channel_config_2.acq_time = ADC_ACQ_TIME;


nrf_saadc_channel_config_t channel_config_3 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN3 );
channel_config_2.burst = NRF_SAADC_BURST_ENABLED; //enabled
channel_config_2.gain = ADC_GAIN;
channel_config_2.acq_time = ADC_ACQ_TIME;


nrf_saadc_channel_config_t channel_config_4 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN4 );
channel_config_2.burst = NRF_SAADC_BURST_ENABLED; //enabled
channel_config_2.gain = ADC_GAIN;
channel_config_2.acq_time = ADC_ACQ_TIME;

nrf_saadc_channel_config_t channel_config_5 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN5 );
channel_config_2.burst = NRF_SAADC_BURST_ENABLED; //enabled
channel_config_2.gain = ADC_GAIN;
channel_config_2.acq_time = ADC_ACQ_TIME;


nrf_saadc_channel_config_t channel_config_6 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN6 );
channel_config_2.burst = NRF_SAADC_BURST_ENABLED; //enabled
channel_config_2.gain = ADC_GAIN;
channel_config_2.acq_time = ADC_ACQ_TIME;


nrf_saadc_channel_config_t channel_config_7 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE( NRF_SAADC_INPUT_AIN7 );
channel_config_2.burst = NRF_SAADC_BURST_ENABLED; //enabled
channel_config_2.gain = ADC_GAIN;
channel_config_2.acq_time = ADC_ACQ_TIME;

//Configure SAADC Module
nrf_drv_saadc_config_t saadc_config;
saadc_config.low_power_mode	= true;
saadc_config.resolution = NRF_SAADC_RESOLUTION_12BIT;
saadc_config.oversample = NRF_SAADC_OVERSAMPLE_4X;
saadc_config.interrupt_priority = APP_IRQ_PRIORITY_LOW;  //Set SAADC interrupt to low priority.

//Initialize SAADC Module
err_code = nrf_drv_saadc_init( &saadc_config, m_saadc_callback );
m_adc_error_check(err_code,11);

//Initialize ADC Channels
err_code = nrf_drv_saadc_channel_init( 0, &channel_config_0 );
m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 1, &channel_config_1 );
m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 2, &channel_config_2 );
 m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 3, &channel_config_3 );
m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 4, &channel_config_4 );
m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 5, &channel_config_5 );
m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 6, &channel_config_6 );
m_adc_error_check(err_code,12);

err_code = nrf_drv_saadc_channel_init( 7, &channel_config_7 );
m_adc_error_check(err_code,12);

However I get the following mapping to my adc buffer (yes I'm using double buffering).

m_buffer[0] -> Not connected to anything? 
m_buffer[1] -> P0.02
m_buffer[2] -> P0.03
m_buffer[3] -> P0.04
m_buffer[3] -> P0.05 //But held high due to CTS connection to Jlink IC on the PCA10040
m_buffer[5] -> P0.28
m_buffer[6] -> P0.29 
m_buffer[7] -> P0.30 

So the first location seems to be unconnected, and P0.31 which should be AIN7 has no affect on values in the buffer. This looks like a bizzard offset issue that I can't seem to nail down. I check the next memory location but it isn't of any significance.

In my callback on the DONE_EVENT i just iterate through the buffer to extract the values:

	for(int i=0; i<SAMPLES_IN_BUFFER; i++)
	{
		new_value[i] = p_event->data.done.p_buffer[i];

		if( new_value[i] >= 0xFFF0 ) new_value[i] = 0;
	}

P.S. COMP and LP_COMP are not enabled in sdk_config,h

Related