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

NRF52 SAADC current can not fall back

Hello, I am working on NRF52 customer board + SDK_13.0.0_04a0bfd I start with ble_app_uart example, I use interrupt tigger a repeat timer(500Hz, 400 times) to sample 6 channels' data. all function works well, but if I start saadx once, the current consumption will rise about 6.5ma and will not fall back any more. Below is my code:

static void adc_task_init(void)
{
    uint32_t err_code;
err_code = nrf_drv_saadc_init(NULL,saadc_callback);
APP_ERROR_CHECK(err_code);
nrf_saadc_channel_config_t channel_1_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN4);
err_code = nrf_drv_saadc_channel_init(0,&channel_1_config);
nrf_saadc_channel_config_t channel_2_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN5);
err_code = nrf_drv_saadc_channel_init(1,&channel_2_config);



nrf_saadc_channel_config_t channel_3_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
err_code = nrf_drv_saadc_channel_init(2,&channel_3_config);

nrf_saadc_channel_config_t channel_4_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
err_code = nrf_drv_saadc_channel_init(3,&channel_4_config);

nrf_saadc_channel_config_t channel_5_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
err_code = nrf_drv_saadc_channel_init(4,&channel_5_config);
nrf_saadc_channel_config_t channel_6_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN3);
err_code = nrf_drv_saadc_channel_init(5,&channel_6_config);


err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0],SAMPLES_IN_BUFFER);
	APP_ERROR_CHECK(err_code);
	err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1],SAMPLES_IN_BUFFER);
		APP_ERROR_CHECK(err_code);

}

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
	{
	
	uint8_t buffer[20];
    uint32_t err_code;
	uint8_t i;
	err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
        APP_ERROR_CHECK(err_code);

		if(m_adc_evt_counter ==0)
		{
			battery_mea_level = p_event->data.done.p_buffer[0];
			axis_x[0] = p_event->data.done.p_buffer[3];
			axis_y[0] = p_event->data.done.p_buffer[4];
			axis_z[0] = p_event->data.done.p_buffer[5];		
		}
		if(m_adc_evt_counter ==260)
		{
			//battery_mea_level = p_event->data.done.p_buffer[0];
			axis_x[1] = p_event->data.done.p_buffer[3];
			axis_y[1] = p_event->data.done.p_buffer[4];
			axis_z[1] = p_event->data.done.p_buffer[5];		
		}
		
		if(m_adc_evt_counter<(SAMPLE_NUM+5)&&m_adc_evt_counter>=5)
		{
			dataV[m_adc_evt_counter-5]= p_event->data.done.p_buffer[1]+50;
			dataR[m_adc_evt_counter-5]= p_event->data.done.p_buffer[2]+50;
		}
		else if(m_adc_evt_counter>=(SAMPLE_NUM+100))
		{
		
			nrf_drv_saadc_uninit(); 																  //Unintialize SAADC to disable EasyDMA and save power
			NRF_SAADC->INTENCLR = (SAADC_INTENCLR_END_Clear << SAADC_INTENCLR_END_Pos); 			  //Disable the SAADC interrupt
			NVIC_ClearPendingIRQ(SAADC_IRQn);														  //Clear the SAADC interrupt if set
			sampleisfinish =1;
		}
		m_adc_evt_counter++;

	}


	static void ADC_sample_handler(void * p_context)   //timer handle
{
	if(sampleisfinish == 0)
		start_adc();	
}

void start_adc(void)
{
    uint32_t err_code;
	err_code = nrf_drv_saadc_sample();
	APP_ERROR_CHECK(err_code);
}

static void button_event_handler(uint8_t pin_no, uint8_t button_action)
{
....
switch(pin_no)
{
...
case G_INT:
       m_adc_evt_counter = 0;
	adc_task_init();
	err_code = app_timer_start(m_adc_sample_timer_id, ADC_SAMPLE_INTERVAL, NULL);
	APP_ERROR_CHECK(err_code);
break;
...
}
...
}

In main loop ,when the sampling is finished ,I will stop the timer.
At the begining, if the interupt is not tiggered, my board's current consumption is about 1.1mA, but if interrupt is triggered once, the current consumption will rise to 7.7mA.

I have done some testing, if I only use one channel or enable 6 channels but don't get the data in p_event->data.done.p_buffer[1] to[5] , the current will rise to about 8mA and then fall back to 1.1mA.

I think it is because the ADC is not stopped correctly, anybody can help?

Parents Reply Children
No Data
Related