Hi,
I had the issuse about power consumption of saadc.The current measured was always more than 500ua after I called nrfx_saadc_sample().My test code is below.
/********************************************************************* * MACROS */ #define ADC_DEFAULT_CONFIG \ { \ .resolution = NRF_SAADC_RESOLUTION_12BIT, \ .oversample = NRF_SAADC_OVERSAMPLE_4X, \ .interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY, \ .low_power_mode = NRFX_SAADC_CONFIG_LP_MODE \ } #define ADC_DEFAULT_LT_CHANNEL_CONFIG_SE(PIN_P) \ { \ .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ .gain = NRF_SAADC_GAIN1_4, \ .reference = NRF_SAADC_REFERENCE_VDD4, \ .acq_time = NRF_SAADC_ACQTIME_40US, \ .mode = NRF_SAADC_MODE_SINGLE_ENDED, \ .burst = NRF_SAADC_BURST_ENABLED, \ .pin_p = (nrf_saadc_input_t)(PIN_P), \ .pin_n = NRF_SAADC_INPUT_DISABLED \ } #define ADC_DEFAULT_HT_CHANNEL_CONFIG_SE(PIN_P) \ { \ .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ .gain = NRF_SAADC_GAIN1_4, \ .reference = NRF_SAADC_REFERENCE_VDD4, \ .acq_time = NRF_SAADC_ACQTIME_10US, \ .mode = NRF_SAADC_MODE_SINGLE_ENDED, \ .burst = NRF_SAADC_BURST_ENABLED, \ .pin_p = (nrf_saadc_input_t)(PIN_P), \ .pin_n = NRF_SAADC_INPUT_DISABLED \ } #define C_NOP __ASM volatile ("nop"); /********************************************************************* * Gobal Variable */ bool adcFinishFlag = false; /********************************************************************* * Local Variable */ static bool adcCalibratedone = false; static bool adcAbortFlag = false; static nrf_saadc_value_t adcSampleBuffer[4] = { 0 }; /********************************************************************* * LOCAL FUNCTIONS */ static nrf_saadc_input_t AdcChannelPort( uint8_t inputChannel ); /********************************************************************* * adc callback */ static void saadc_callback(nrf_drv_saadc_evt_t const * p_event) { if ( p_event->type == NRF_DRV_SAADC_EVT_DONE ) { if( adcAbortFlag ) { adcAbortFlag = false; } else { adcFinishFlag = true; } } else if( p_event->type == NRF_DRV_SAADC_EVT_CALIBRATEDONE ) { adcCalibratedone = true; } } /********************************************************************* * @fn InitAdcModule * * @brief initialzing Adc module * * * @param none * * * @return none */ void InitAdcModule( ) { ret_code_t err_code; nrf_drv_saadc_config_t drv_saadc_cfg = ADC_DEFAULT_CONFIG; err_code = nrf_drv_saadc_init( &drv_saadc_cfg, saadc_callback ); APP_ERROR_CHECK(err_code); adcCalibratedone = false; err_code = nrf_drv_saadc_calibrate_offset( ); APP_ERROR_CHECK(err_code); if( err_code == NRFX_SUCCESS ) { err_code = 0; do{ C_NOP; C_NOP; C_NOP; err_code++; if( err_code >= 65536 ) break; }while( !adcCalibratedone ); } } /********************************************************************* * @fn InitAdcChannel * * @brief initialzing Adc channel * * * @param sdcChannel: adc channel * * resistanceType: big resistance -> Low temperature * low resistance -> High temperature * * @return none */ void InitAdcChannel( uint8_t sdcChannel, check_type_t resistanceType ) { ret_code_t err_code; nrf_saadc_input_t InputAIN; InputAIN = AdcChannelPort( sdcChannel ); nrf_saadc_channel_config_t channel_config = ADC_DEFAULT_LT_CHANNEL_CONFIG_SE(InputAIN); if( resistanceType == HIGH_TEMPERATURE ) { channel_config.acq_time = NRF_SAADC_ACQTIME_10US; } err_code = nrf_drv_saadc_channel_init( sdcChannel, &channel_config ); APP_ERROR_CHECK(err_code); } /********************************************************************* * @fn StartAdc * * @brief start sampling * * * @param none * * * @return none */ void StartAdc( ) { ret_code_t err_code; adcFinishFlag = false; adcAbortFlag = false; err_code = nrf_drv_saadc_buffer_convert( adcSampleBuffer, 2 ); APP_ERROR_CHECK(err_code); err_code = nrfx_saadc_sample( ); APP_ERROR_CHECK(err_code); } /********************************************************************* * @fn StopAdc * * @brief stop sampling * * * @param none * * * @return none */ void StopAdc( ) { if( nrfx_saadc_is_busy( ) ) { adcAbortFlag = true; adcFinishFlag = false; nrfx_saadc_abort( ); } } /********************************************************************* * @fn DisableAdcChannel * * @brief disable adc channel * * * @param none * * * @return none */ void DisableAdcChannel( uint8_t channel ) { ret_code_t err_code; err_code = nrfx_saadc_channel_uninit( channel ); APP_ERROR_CHECK(err_code); } /********************************************************************* * Logic Function */ static nrf_saadc_input_t AdcChannelPort( uint8_t inputChannel ) { nrf_saadc_input_t channelAIN; switch( inputChannel ) { case 0: channelAIN = NRF_SAADC_INPUT_AIN0; break; case 1: channelAIN = NRF_SAADC_INPUT_AIN1; break; case 2: channelAIN = NRF_SAADC_INPUT_AIN2; break; case 3: channelAIN = NRF_SAADC_INPUT_AIN3; break; case 4: channelAIN = NRF_SAADC_INPUT_AIN4; break; case 5: channelAIN = NRF_SAADC_INPUT_AIN5; break; case 6: channelAIN = NRF_SAADC_INPUT_AIN6; break; case 7: default: channelAIN = NRF_SAADC_INPUT_AIN7; break; } return channelAIN; } /***************************************************/ void ParamterInit( ) { fristGroupFlag = true; secondGroupFlag = false; timerOutFlag = false; sampleCnt = 0; } /************************************************** * Main *************************************************/ int main(void) { uint32_t main_code=0; //bool erase_bonds; // Initialize. PortInit( ); log_init( ); timers_init( ); power_management_init( ); ble_stack_init( ); gap_params_init( ); gatt_init( ); services_init( ); advertising_init( ); conn_params_init( ); //peer_manager_init( ); // Start execution. NRF_LOG_INFO("Application started."); ApplicationParamterInit( ); application_timers_start( ); InitAdcModule( ); InitAdcChannel( 0, 0 ); InitAdcChannel( 1, 0 ); StartAdc( ); // Enter main loop. for (;;) { if( adcFinishFlag ) { //AdcMeasurePoll(); if( fristGroupFlag ) { SampleTransfer( adcSampleBuffer ); sampleCnt++; if( sampleCnt>= 4 ) { sampleCnt = 0; DisableAdcChannel(0); DisableAdcChannel(1); fristGroupFlag = false; secondGroupFlag = true; InitAdcChannel( 2, 0 ); InitAdcChannel( 3, 0 ); StartAdc( ); } else { StartAdc( ); } } else if( secondGroupFlag ) { SampleTransfer( adcSampleBuffer ); sampleCnt++; if( sampleCnt>= 4 ) { sampleCnt = 0; DisableAdcChannel(0); DisableAdcChannel(1); fristGroupFlag = false; secondGroupFlag = true; SimpleFinishHandle( ); startAdcTimer( ); //500ms time out } else { StartAdc( ); } } adcFinishFlag = false; } if( timerOutFlag ) //500ms { sampleCnt = 0; InitAdcChannel( 0, 0 ); InitAdcChannel( 1, 0 ); StartAdc( ); timerOutFlag = false; } idle_state_handle( ); } }