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

low power saadc

when I start ADC the current will be HIGH .even I UN-Initialization it .

what I have done like that below;

 

#define SAADC_CONFIG_LP_MODE 1

void my_adc_init(void)							
{
		MI_LOG_DEBUG("my_adc_init\r\n");
    ret_code_t err_code;
    err_code = nrf_drv_saadc_init(NULL, saadc_callback);
    APP_ERROR_CHECK(err_code);
	
    nrf_saadc_channel_config_t channel_config0 =
    NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(LIGHT_CHECK);
	channel_config0.reference=NRF_SAADC_REFERENCE_VDD4;
	
    err_code = nrf_drv_saadc_channel_init(LIGHT_CHECK-1, &channel_config0);
    APP_ERROR_CHECK(err_code);
    
	nrf_saadc_channel_config_t channel_config1 =
    NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(BATTRY_CHECK);
    
    err_code = nrf_drv_saadc_channel_init(BATTRY_CHECK-1, &channel_config1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool,SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);
}

void start_ADC(void)
{
	MI_LOG_DEBUG("start_ADC\r\n");
	uint32_t err_code;
	LIGHT_PIN_control(LIGHT_CONTRL_ACTIVE);
	my_adc_init();
	err_code=nrf_drv_saadc_sample();//
	APP_ERROR_CHECK(err_code);
}
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)										
{
    MI_LOG_DEBUG("saadc_callback\r\n");
	static uint32_t count=0;
    ret_code_t err_code;	
	count ++ ;
    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)//ADC转换完成
    {
    	MI_LOG_INFO("the BATTRY  value is  %d . %d V\r\n", battry_V,(battry_V-(unsigned char )battry_V)*100);
		nrf_drv_saadc_uninit();		
	}
	if(p_event->type == NRF_DRV_SAADC_EVT_LIMIT)
	{
		MI_LOG_INFO("ADC  NRF_DRV_SAADC_EVT_LIMIT %d \r\n",count);
	}
	if(p_event->type == NRF_DRV_SAADC_EVT_CALIBRATEDONE)
	{
		MI_LOG_INFO("ADC  NRF_DRV_SAADC_EVT_CALIBRATEDONE %d \r\n",count);
	}
}

before I started it  The current is 0.6ma

but when I start it the current becom 7ma  .

Is there anything else should I do .

IS there any one can help me .

Parents
  • I'm guessing you're not using the DCDC regulator and not putting the CPU to sleep after starting the SAADC. Do you mind posting the relevant code to your SAADC usage?

  • sorry pro minite mean per minute . sorry about that I have forgetten that word。

    here is my code about my project .please take a look .

    thank you very much .

    //SDK_CONFIC.H set
    
    #ifndef SAADC_ENABLED
    #define SAADC_ENABLED 1 //改
    #endif
    #if SAADC_ENABLED
    // <o> SAADC_CONFIG_RESOLUTION - Resolution
    
    // <0=> 8 bit 
    // <1=> 10 bit 
    // <2=> 12 bit 
    // <3=> 14 bit
    
    #ifndef SAADC_CONFIG_RESOLUTION
    #define SAADC_CONFIG_RESOLUTION 0
    #endif
    
    // <o> SAADC_CONFIG_OVERSAMPLE - Sample period
    
    // <0=> Disabled 
    // <1=> 2x 
    // <2=> 4x 
    // <3=> 8x 
    // <4=> 16x 
    // <5=> 32x 
    // <6=> 64x 
    // <7=> 128x 
    // <8=> 256x
    
    #ifndef SAADC_CONFIG_OVERSAMPLE
    #define SAADC_CONFIG_OVERSAMPLE 0
    #endif
    
    // <q> SAADC_CONFIG_LP_MODE - Enabling low power mode
    
    #ifndef SAADC_CONFIG_LP_MODE
    #define SAADC_CONFIG_LP_MODE 1
    #endif
    
    // <o> SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority
    
    // <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
    // <0=> 0 (highest) 
    // <1=> 1 
    // <2=> 2 
    // <3=> 3 
    // <4=> 4 
    // <5=> 5 
    // <6=> 6 
    // <7=> 7
    
    #ifndef SAADC_CONFIG_IRQ_PRIORITY
    #define SAADC_CONFIG_IRQ_PRIORITY 7
    #endif
    
    // <e> SAADC_CONFIG_LOG_ENABLED - Enables logging in the module.
    //==========================================================
    #ifndef SAADC_CONFIG_LOG_ENABLED
    #define SAADC_CONFIG_LOG_ENABLED 0
    #endif
    #if SAADC_CONFIG_LOG_ENABLED
    // <o> SAADC_CONFIG_LOG_LEVEL - Default Severity level
    
    // <0=> Off 
    // <1=> Error 
    // <2=> Warning 
    // <3=> Info 
    // <4=> Debug
    
    #ifndef SAADC_CONFIG_LOG_LEVEL
    #define SAADC_CONFIG_LOG_LEVEL 3
    #endif
    
    // <o> SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix.
    
    // <0=> Default 
    // <1=> Black 
    // <2=> Red 
    // <3=> Green 
    // <4=> Yellow 
    // <5=> Blue 
    // <6=> Magenta 
    // <7=> Cyan 
    // <8=> White
    
    #ifndef SAADC_CONFIG_INFO_COLOR
    #define SAADC_CONFIG_INFO_COLOR 0
    #endif
    
    // <o> SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix.
    
    // <0=> Default 
    // <1=> Black 
    // <2=> Red 
    // <3=> Green 
    // <4=> Yellow 
    // <5=> Blue 
    // <6=> Magenta 
    // <7=> Cyan 
    // <8=> White
    
    #ifndef SAADC_CONFIG_DEBUG_COLOR
    #define SAADC_CONFIG_DEBUG_COLOR 0
    #endif
    
    #endif //SAADC_CONFIG_LOG_ENABLED
    // </e>
    
    #endif //SAADC_ENABLED
    // </e>
    
    //main fuction 
    
    int main(void)
    {
    
        uint32_t err_code;
        
        ble_stack_init();
        power_first(); //上电就做电源管理
        gap_params_init();
        my_service_Init();
        //services_init();
        advertising_init();
        conn_params_init();
        
        
        // printf("\r\nUART Start!\r\n");
        err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
        APP_ERROR_CHECK(err_code);
        My_flash_init();
        get_save_and_synchronous_num(); 
        // Enter main loop.
        for (;;)
        {
            if (NRF_LOG_PROCESS() == false)//将保存的LOG都吐出来之后进入休眠
            {
                if(My_Time_Fuction_Enable==1)
                {
                    My_Time_Fuction_Process();
                    My_Time_Fuction_Enable=0;
                }
                power_manage();
            }
        }
    }
    
    //SADDC Initialization
    void my_adc_init(void) 
    {
        MI_LOG_DEBUG("my_adc_init\r\n");
        ret_code_t err_code;
        err_code = nrf_drv_saadc_init(NULL, saadc_callback);
        APP_ERROR_CHECK(err_code);
        
        nrf_saadc_channel_config_t channel_config0 =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(LIGHT_CHECK);
        channel_config0.reference=NRF_SAADC_REFERENCE_VDD4;
        err_code = nrf_drv_saadc_channel_init(LIGHT_CHECK-1, &channel_config0);
        APP_ERROR_CHECK(err_code);
        
        nrf_saadc_channel_config_t channel_config1 =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(BATTRY_CHECK);
        err_code = nrf_drv_saadc_channel_init(BATTRY_CHECK-1, &channel_config1);
        APP_ERROR_CHECK(err_code);
        
        err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool,SAMPLES_IN_BUFFER);
        APP_ERROR_CHECK(err_code);
    }
    
    
    
    ADC_start(void)  //starts  per minute
    {
    
        err_code=nrf_drv_saadc_sample();//
        APP_ERROR_CHECK(err_code);
    
    }
    
    
    
    //saadc callback
    
    void saadc_callback(nrf_drv_saadc_evt_t const * p_event) //ADC完成中断 功能完成,具体参数需要调试
    {
        MI_LOG_DEBUG("saadc_callback\r\n");
        static uint32_t count=0;
        ret_code_t err_code; 
        count ++ ;
        if (p_event->type == NRF_DRV_SAADC_EVT_DONE)//ADC转换完成
        {
            MI_LOG_DEBUG("ADC has completed %d times\r\n",count);
            LIGHT_PIN_control(!LIGHT_CONTRL_ACTIVE);
            err_code=nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer,SAMPLES_IN_BUFFER);
            APP_ERROR_CHECK(err_code);
            light_value=(p_event->data.done.p_buffer[0]);
            MI_LOG_INFO("the LIGHT_CHECK ADC value is %X\r\n", light_value);//p_event->data.done.p_buffer[0]);
            
            MI_LOG_INFO("the BATTRY_CHECK ADC value is %d \r\n", p_event->data.done.p_buffer[1]);
            battry_V=((float )p_event->data.done.p_buffer[1])/256*0.6*6*133/33;
            battry_level=(uint8_t)((battry_V-BATTRY_ZERO)/(BATTRY_FULL-BATTRY_ZERO)*100);
            if(battry_V<BATTRY_ZERO)
                battry_level=0;
            if(battry_level>100)
                battry_level=100;
            if(battry_level<BATTRY_LOW_WARNING)//电量低
             POWER_LOWER_FLAG=1;
            else 
            POWER_LOWER_FLAG=0;
            MI_LOG_INFO("the BATTRY value is %d . %d V\r\n", battry_V,(battry_V-(unsigned char )battry_V)*100);
            
            if( light_value<LIGHT_TOO_HIGH_GATE)
            {
                light_flag=TO_HIGH;
                MI_LOG_INFO("light is too bright \r\n");
            }
            else if(light_value>LIGHT_TOO_LOW_GATE)
            {
                light_flag=TO_LOW;
                MI_LOG_INFO("light is too dark \r\n");
            }
            else 
                light_flag=NORMAL; 
        }
        if(p_event->type == NRF_DRV_SAADC_EVT_LIMIT)//超出限制
        {
            MI_LOG_INFO("ADC NRF_DRV_SAADC_EVT_LIMIT %d \r\n",count);
        }
        if(p_event->type == NRF_DRV_SAADC_EVT_CALIBRATEDONE)//校准完成
        {
             MI_LOG_INFO("ADC NRF_DRV_SAADC_EVT_CALIBRATEDONE %d \r\n",count);
        }
        nrf_drv_saadc_uninit();
    }

Reply
  • sorry pro minite mean per minute . sorry about that I have forgetten that word。

    here is my code about my project .please take a look .

    thank you very much .

    //SDK_CONFIC.H set
    
    #ifndef SAADC_ENABLED
    #define SAADC_ENABLED 1 //改
    #endif
    #if SAADC_ENABLED
    // <o> SAADC_CONFIG_RESOLUTION - Resolution
    
    // <0=> 8 bit 
    // <1=> 10 bit 
    // <2=> 12 bit 
    // <3=> 14 bit
    
    #ifndef SAADC_CONFIG_RESOLUTION
    #define SAADC_CONFIG_RESOLUTION 0
    #endif
    
    // <o> SAADC_CONFIG_OVERSAMPLE - Sample period
    
    // <0=> Disabled 
    // <1=> 2x 
    // <2=> 4x 
    // <3=> 8x 
    // <4=> 16x 
    // <5=> 32x 
    // <6=> 64x 
    // <7=> 128x 
    // <8=> 256x
    
    #ifndef SAADC_CONFIG_OVERSAMPLE
    #define SAADC_CONFIG_OVERSAMPLE 0
    #endif
    
    // <q> SAADC_CONFIG_LP_MODE - Enabling low power mode
    
    #ifndef SAADC_CONFIG_LP_MODE
    #define SAADC_CONFIG_LP_MODE 1
    #endif
    
    // <o> SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority
    
    // <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
    // <0=> 0 (highest) 
    // <1=> 1 
    // <2=> 2 
    // <3=> 3 
    // <4=> 4 
    // <5=> 5 
    // <6=> 6 
    // <7=> 7
    
    #ifndef SAADC_CONFIG_IRQ_PRIORITY
    #define SAADC_CONFIG_IRQ_PRIORITY 7
    #endif
    
    // <e> SAADC_CONFIG_LOG_ENABLED - Enables logging in the module.
    //==========================================================
    #ifndef SAADC_CONFIG_LOG_ENABLED
    #define SAADC_CONFIG_LOG_ENABLED 0
    #endif
    #if SAADC_CONFIG_LOG_ENABLED
    // <o> SAADC_CONFIG_LOG_LEVEL - Default Severity level
    
    // <0=> Off 
    // <1=> Error 
    // <2=> Warning 
    // <3=> Info 
    // <4=> Debug
    
    #ifndef SAADC_CONFIG_LOG_LEVEL
    #define SAADC_CONFIG_LOG_LEVEL 3
    #endif
    
    // <o> SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix.
    
    // <0=> Default 
    // <1=> Black 
    // <2=> Red 
    // <3=> Green 
    // <4=> Yellow 
    // <5=> Blue 
    // <6=> Magenta 
    // <7=> Cyan 
    // <8=> White
    
    #ifndef SAADC_CONFIG_INFO_COLOR
    #define SAADC_CONFIG_INFO_COLOR 0
    #endif
    
    // <o> SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix.
    
    // <0=> Default 
    // <1=> Black 
    // <2=> Red 
    // <3=> Green 
    // <4=> Yellow 
    // <5=> Blue 
    // <6=> Magenta 
    // <7=> Cyan 
    // <8=> White
    
    #ifndef SAADC_CONFIG_DEBUG_COLOR
    #define SAADC_CONFIG_DEBUG_COLOR 0
    #endif
    
    #endif //SAADC_CONFIG_LOG_ENABLED
    // </e>
    
    #endif //SAADC_ENABLED
    // </e>
    
    //main fuction 
    
    int main(void)
    {
    
        uint32_t err_code;
        
        ble_stack_init();
        power_first(); //上电就做电源管理
        gap_params_init();
        my_service_Init();
        //services_init();
        advertising_init();
        conn_params_init();
        
        
        // printf("\r\nUART Start!\r\n");
        err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
        APP_ERROR_CHECK(err_code);
        My_flash_init();
        get_save_and_synchronous_num(); 
        // Enter main loop.
        for (;;)
        {
            if (NRF_LOG_PROCESS() == false)//将保存的LOG都吐出来之后进入休眠
            {
                if(My_Time_Fuction_Enable==1)
                {
                    My_Time_Fuction_Process();
                    My_Time_Fuction_Enable=0;
                }
                power_manage();
            }
        }
    }
    
    //SADDC Initialization
    void my_adc_init(void) 
    {
        MI_LOG_DEBUG("my_adc_init\r\n");
        ret_code_t err_code;
        err_code = nrf_drv_saadc_init(NULL, saadc_callback);
        APP_ERROR_CHECK(err_code);
        
        nrf_saadc_channel_config_t channel_config0 =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(LIGHT_CHECK);
        channel_config0.reference=NRF_SAADC_REFERENCE_VDD4;
        err_code = nrf_drv_saadc_channel_init(LIGHT_CHECK-1, &channel_config0);
        APP_ERROR_CHECK(err_code);
        
        nrf_saadc_channel_config_t channel_config1 =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(BATTRY_CHECK);
        err_code = nrf_drv_saadc_channel_init(BATTRY_CHECK-1, &channel_config1);
        APP_ERROR_CHECK(err_code);
        
        err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool,SAMPLES_IN_BUFFER);
        APP_ERROR_CHECK(err_code);
    }
    
    
    
    ADC_start(void)  //starts  per minute
    {
    
        err_code=nrf_drv_saadc_sample();//
        APP_ERROR_CHECK(err_code);
    
    }
    
    
    
    //saadc callback
    
    void saadc_callback(nrf_drv_saadc_evt_t const * p_event) //ADC完成中断 功能完成,具体参数需要调试
    {
        MI_LOG_DEBUG("saadc_callback\r\n");
        static uint32_t count=0;
        ret_code_t err_code; 
        count ++ ;
        if (p_event->type == NRF_DRV_SAADC_EVT_DONE)//ADC转换完成
        {
            MI_LOG_DEBUG("ADC has completed %d times\r\n",count);
            LIGHT_PIN_control(!LIGHT_CONTRL_ACTIVE);
            err_code=nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer,SAMPLES_IN_BUFFER);
            APP_ERROR_CHECK(err_code);
            light_value=(p_event->data.done.p_buffer[0]);
            MI_LOG_INFO("the LIGHT_CHECK ADC value is %X\r\n", light_value);//p_event->data.done.p_buffer[0]);
            
            MI_LOG_INFO("the BATTRY_CHECK ADC value is %d \r\n", p_event->data.done.p_buffer[1]);
            battry_V=((float )p_event->data.done.p_buffer[1])/256*0.6*6*133/33;
            battry_level=(uint8_t)((battry_V-BATTRY_ZERO)/(BATTRY_FULL-BATTRY_ZERO)*100);
            if(battry_V<BATTRY_ZERO)
                battry_level=0;
            if(battry_level>100)
                battry_level=100;
            if(battry_level<BATTRY_LOW_WARNING)//电量低
             POWER_LOWER_FLAG=1;
            else 
            POWER_LOWER_FLAG=0;
            MI_LOG_INFO("the BATTRY value is %d . %d V\r\n", battry_V,(battry_V-(unsigned char )battry_V)*100);
            
            if( light_value<LIGHT_TOO_HIGH_GATE)
            {
                light_flag=TO_HIGH;
                MI_LOG_INFO("light is too bright \r\n");
            }
            else if(light_value>LIGHT_TOO_LOW_GATE)
            {
                light_flag=TO_LOW;
                MI_LOG_INFO("light is too dark \r\n");
            }
            else 
                light_flag=NORMAL; 
        }
        if(p_event->type == NRF_DRV_SAADC_EVT_LIMIT)//超出限制
        {
            MI_LOG_INFO("ADC NRF_DRV_SAADC_EVT_LIMIT %d \r\n",count);
        }
        if(p_event->type == NRF_DRV_SAADC_EVT_CALIBRATEDONE)//校准完成
        {
             MI_LOG_INFO("ADC NRF_DRV_SAADC_EVT_CALIBRATEDONE %d \r\n",count);
        }
        nrf_drv_saadc_uninit();
    }

Children
No Data
Related