Hi,
I am working on measuring the voltage on a lithium battery (norminal 3.7V) with a voltage divider on nRF52832. The voltage divider combines a 510K and 360K resistor and a 0.1uF capacitor. We got following findings:
- The current raised up to over 6mA after SAADC measurement.
- Floating input on SAADC (no lithium battery and voltage divider on pca10040), the current is normal before and after SAADC measurement.
Please kindly help to solve this issue.
Attached below is the program code for your reference.
#include "nrf_drv_ppi.h"
#include "saadc.h"
#include "app_util_platform.h"
#include "softdevice_handler.h"
#define SAADC_CALIBRATION_INTERVAL 5
#define SAADC_SAMPLES_IN_BUFFER 1
#define SAADC_OVERSAMPLE NRF_SAADC_OVERSAMPLE_4X
#define SAADC_BURST_MODE 1
static nrf_saadc_value_t m_buffer_pool[2][SAADC_SAMPLES_IN_BUFFER];
static uint32_t m_adc_evt_counter = 0;
static nrf_ppi_channel_t m_ppi_channel;
bool m_saadc_initialized = false;
void saadc_init(void)
{
ret_code_t err_code;
nrf_drv_saadc_config_t saadc_config;
nrf_saadc_channel_config_t channel_config;
//Configure SAADC
saadc_config.resolution = NRF_SAADC_RESOLUTION_12BIT;
saadc_config.oversample = SAADC_OVERSAMPLE;
saadc_config.interrupt_priority = APP_IRQ_PRIORITY_LOW;
//Initialize SAADC
err_code = nrf_drv_saadc_init(&saadc_config, saadc_callback);
error_check(err_code);
//Configure SAADC channel
channel_config.reference = NRF_SAADC_REFERENCE_INTERNAL;
channel_config.gain = NRF_SAADC_GAIN1_6;
channel_config.acq_time = NRF_SAADC_ACQTIME_20US;
channel_config.mode = NRF_SAADC_MODE_SINGLE_ENDED;
channel_config.pin_p = NRF_SAADC_INPUT_AIN0;
channel_config.pin_n = NRF_SAADC_INPUT_DISABLED;
channel_config.resistor_p = NRF_SAADC_RESISTOR_DISABLED;
channel_config.resistor_n = NRF_SAADC_RESISTOR_DISABLED;
//Initialize SAADC channel
err_code = nrf_drv_saadc_channel_init(0, &channel_config);
error_check(err_code);
if(SAADC_BURST_MODE)
NRF_SAADC->CH[0].CONFIG |= 0x01000000;
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0],SAADC_SAMPLES_IN_BUFFER);
error_check(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1],SAADC_SAMPLES_IN_BUFFER);
error_check(err_code);
}
void saadc_sampling_event_enable(void)
{
ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel);
error_check(err_code);
}
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
ret_code_t err_code;
uint32_t data;
if (p_event->type == NRF_DRV_SAADC_EVT_DONE){
if((m_adc_evt_counter % SAADC_CALIBRATION_INTERVAL) == 0){
NRF_SAADC->EVENTS_CALIBRATEDONE = 0;
nrf_saadc_task_trigger(NRF_SAADC_TASK_CALIBRATEOFFSET);
while(!NRF_SAADC->EVENTS_CALIBRATEDONE);
while(NRF_SAADC->STATUS == (SAADC_STATUS_STATUS_Busy << SAADC_STATUS_STATUS_Pos));
}
err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAADC_SAMPLES_IN_BUFFER);
error_check(err_code);
m_adc_evt_counter++;
nrf_drv_saadc_uninit();
NRF_SAADC->INTENCLR = (SAADC_INTENCLR_END_Clear << SAADC_INTENCLR_END_Pos);
NVIC_ClearPendingIRQ(SAADC_IRQn);
m_saadc_initialized = false;
data = p_event->data.done.p_buffer[0];
}
}