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

Understanding SAADC

Hi all,

I am trying to use the SAADC to measure battery level. I have a rechargable lithium battery connected to my customed PCB with a NRF52832. The rechargable battery has a max voltage of about 4.2V when charged.

I also have a 3.3V voltage regulator connected to the battery and the 3.3V is used to power up the NRF52032.

I am using a voltage divider to measure the battery voltage. 4M ohm to battery and a 10M ohm to ground. The point between the 4M resistor and the 10M resistor is connected to AIN1. There is also a capacitor of 10nF across the 10M resistor.

My saadc init function is as follows:

void saadc_init(void)
{
    ret_code_t err_code;

    nrf_saadc_channel_config_t channel_config =
    NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
    channel_config.reference = NRF_SAADC_REFERENCE_VDD4;
    err_code = nrf_drv_saadc_init(NULL, saadc_callback);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_channel_init(0, &channel_config);
    APP_ERROR_CHECK(err_code);

    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);
}

And the callback function is as follows:

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
   if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
   {
      ret_code_t err_code;
      err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 
      SAMPLES_IN_BUFFER);
      APP_ERROR_CHECK(err_code);

  NRF_LOG_INFO("Conversion Result: %d\r\n", p_event->data.done.p_buffer[0]);

      nrf_drv_saadc_uninit();
      NRF_SAADC->INTENCLR = (SAADC_INTENCLR_END_Clear << SAADC_INTENCLR_END_Pos);
      NVIC_ClearPendingIRQ(SAADC_IRQn);
   }
}

I used a multimeter and measure a voltage if 2.09V at the output of the voltage divider and I am getting a measure value of about 550 for the ADC conversion.

How is this 550 value obtained? And is it the correct value? What is the reference voltage for the ADC? I am assuming it 0.6 x 6 = 3.6V?

If so, then (2.09/3.6) * 1023 = 593. This is slightly off from the measured value of 550.

Can anyone help?

Parents Reply Children
Related