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

SAADC Noise issue

Hi, I have a simple voltage divider circuit and I am measuring analog input from in between the resistors. I am using a custom NRF52832 being powered by a DK. I get quite a lot of variation in the analog values with values varying in a range of 10 and quite often I get a spike as you can see in the image the values generally are between 470 to 480 and then I even get a 489. Can you tell me what could be the issue here. Why are the values not constant or at max should be a small variation. Here is my code and the analog values over RTT.

/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is property of Nordic Semiconductor ASA.
 * Terms and conditions of usage are described in detail in NORDIC
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 *
 * Licensees are granted free, non-transferable use of the information. NO
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 * the file.
 *
 */

/** @file
 * @defgroup nrf_adc_example main.c
 * @{
 * @ingroup nrf_adc_example
 * @brief ADC Example Application main file.
 *
 * This file contains the source code for a sample application using ADC.
 *
 * @image html example_board_setup_a.jpg "Use board setup A for this example."
 */

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "nrf.h"
#include "nrf_drv_saadc.h"
#include "boards.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "app_util_platform.h"
#include <string.h>

#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#define SAMPLES_IN_BUFFER 1
#define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 1   /**< UART RX buffer size. */

int val=0;

static void log_init(void)
{
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
}


static nrf_saadc_value_t m_buffer[SAMPLES_IN_BUFFER];

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);
        val =   p_event->data.done.p_buffer[0];
			
      
    }
}

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

    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, SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);
}

/**
 * @brief Function for main application entry.
 */
int main(void)
{
	
	
		log_init();
    saadc_init();

    while (1)
    {
        			
			nrf_drv_saadc_sample();
		  NRF_LOG_INFO("%d\n", val);
			NRF_LOG_FLUSH();
      nrf_delay_ms(100);

    }
}

/** @} */

Parents Reply
  • Thanks Kenneth have been able to successfully implement oversampling and remove the noise. Now another issue is that I have to use another analog input and I read somewhere that scan mode and oversampling won't work together. Is there a way around it I only require oversampling for one channel for the other it is not required and I am also happy to read it in blocking mode if that avoids the scan mode. 

Children
Related