SAADC Value is not changing as it should

Hello,

On a custom board, using the NRF52832, we want to know the value of a potentiometer. This value is send via a signal on the AIN5 pin of the NRF52.

So, I tried to set up a code to read the value via the saadc module, but it seems it doesn't work as expected...

Here's my code :

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("%d\r\n", 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_AIN5);

    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 application main entry.
 */
int main(void)
{
    bool erase_bonds;
    ret_code_t err_code;
    
    initLeds();
    led_purple();

    // Initialize.
    log_init();

    // Initialize the async SVCI interface to bootloader before any interrupts are enabled.
    //err_code = ble_dfu_buttonless_async_svci_init();
    //APP_ERROR_CHECK(err_code);
    timers_init();
    buttons_leds_init(&erase_bonds);
    power_management_init();
    ble_stack_init();
    storage_init();
    gap_params_init();
    //scan_init();
    gatt_init();
    services_init();
    advertising_init();
    conn_params_init();
    peer_manager_init();
    //db_discovery_init();
    //lbs_c_init();
    // Start execution.
    NRF_LOG_INFO("Devroye application started.");
    application_timers_start();
    //scan_start();

    advertising_start(erase_bonds);
    
    saadc_init();
    
    // Enter main loop. 
    for (;;)
    {
        nrf_drv_saadc_sample();
        idle_state_handle();
    }
}

My result are the following : 

[00:00:02.452,636] <info> app: 90

[00:00:02.527,526] <info> app: 96

[00:00:02.577,453] <info> app: 97

[00:00:04.377,746] <info> app: 102

[00:00:04.452,636] <info> app: 89

[00:00:04.527,526] <info> app: 96

[00:00:04.577,453] <info> app: 98

[00:00:06.377,746] <info> app: 101

[00:00:06.452,636] <info> app: 90

[00:00:06.527,526] <info> app: 96

[00:00:06.577,453] <info> app: 96

And of course, the values are not changing if I changed the value of the potentiometer. I don't understand why is it not working...
Another issue that I had, is that the adc value are showing 3 by 3 with a delay but I've not implemented a delay, so I don't know why...

Thanks for your help !

Chris

Parents
  • AIN5 (p0.29) seems to be floating. Most likely you're connected the potentiometer to the wrong pin. 


    Another issue that I had, is that the adc value are showing 3 by 3 with a delay but I've not implemented a delay, so I don't know why...

    I don't understand, what do you mean by "showing 3 by 3" and "with a delay"? 

  • How do you know that the AIN5 seems to be floating ? Actually, we are trying to re-build an old code that was made in js for the same hardware and in this code it was using AIN5, so I'm pretty sure that this pin is connected to it.

    I mean that in the Debug Terminal, it shows 3 values, then wait for a delay and show after 3 other values. And I did not implement a delay, so I don't kno why...

  • Christos.Bou said:
    How do you know that the AIN5 seems to be floating ?

    I just recognized the sample values and their variance. They are typical for the default single-ended settings and floating input pin. 


    Christos.Bou said:
    I mean that in the Debug Terminal, it shows 3 values, then wait for a delay and show after 3 other values. And I did not implement a delay, so I don't kno why...

    That's the log module. It will store logs in a buffer and process them in a batch. I think we call it defered logging in the API/docs.

    -Edit: You can turn this feature on/off.

Reply
  • Christos.Bou said:
    How do you know that the AIN5 seems to be floating ?

    I just recognized the sample values and their variance. They are typical for the default single-ended settings and floating input pin. 


    Christos.Bou said:
    I mean that in the Debug Terminal, it shows 3 values, then wait for a delay and show after 3 other values. And I did not implement a delay, so I don't kno why...

    That's the log module. It will store logs in a buffer and process them in a batch. I think we call it defered logging in the API/docs.

    -Edit: You can turn this feature on/off.

Children
Related