ADC problem

Hi,

I'm using nRF52833 DK and SDK v17 to test my applications. 

I have to use ADC on nRF52811 SoC, and I wanted to develop a demo on nRF52833DK before implementing on nRF52811. 

I've used saadc example in the SDK, and results of the conversion are not what I expected. I also connected the analog pin (P0.03) to GND, and the results were not 0V.

I'm sharing result of GND:

Also sharing result of a test circuit that uses potentiometer to change input voltage:

I changed the resistance of potentiometer bw pic.1 and 2.

I've also written a test code:

void wacon_adcIrqHandler(nrf_drv_saadc_evt_t const * p_event)
{
 /* not used in polling mode */
}
void saadc_init(void)
{
   nrf_saadc_channel_config_t channel_config = NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(28); /* P0.28 */

   (void)nrf_drv_saadc_init(NULL, wacon_adcIrqHandler);

   (void)nrfx_saadc_channel_init(0, &channel_config);
}

int main(void)
{
   u16 length = 9;
    bsp_board_init(BSP_INIT_LEDS);
    bool erase_bonds;
   u8 mesaj[30] = {0};
   nrf_saadc_value_t adc_val = 0u;
   uart_init();
   log_init();
   timers_init();
   buttons_leds_init(&erase_bonds);
   power_management_init();
   ble_stack_init();
   saadc_init();
   gap_params_init();
   gatt_init();
   services_init();
   advertising_init();
   conn_params_init();
   saadc_init();
    advertising_start();


    while(1)
    {
        nrfx_saadc_sample_convert(0, &adc_val);
        snprintf(mesaj, 30, "\r\nADC:%d\r\n", adc_val);

        ble_nus_data_send(&m_nus, mesaj, &length, m_conn_handle);

        nrf_delay_ms(1000);
    }
}

Result of the test code:

What is the mistake that I've done? Thanks for your help!

BR,

  • If you connect P0.03 to GND and still get a non-zero ADC result, the input may be floating, double check if the connection is proper.  Make sure you're reading from P0.03 if that's where your test is connected and try to add some delays between samples just for the sanity of the test.

    #define ADC_INPUT_PIN NRF_SAADC_INPUT_AIN1  // P0.03
    
    void saadc_init(void)
    {
       nrf_saadc_channel_config_t channel_config =
            NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(ADC_INPUT_PIN);
       channel_config.gain = NRF_SAADC_GAIN1_6;   // Ensure correct gain
       channel_config.reference = NRF_SAADC_REFERENCE_INTERNAL; // 0.6V ref
    
       nrfx_saadc_init(NULL, wacon_adcIrqHandler);
       nrfx_saadc_channel_init(0, &channel_config);
    }
    
    
    nrf_delay_us(5); 
    nrfx_saadc_sample_convert(0, &adc_val);
    

Related