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 Reply
  • 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...

Children
Related