Hello all,
I have been testing the SAADC example from the peripheral directory.
The goal is to acquire a single sample from SAADC using nrf_drv_saadc_sample_convert() function.
I read over the internet and heard from that nrf_drv will be depricated, so I want to switch to nrfx library.
The issue is that, when I use nrf_drv library I get an ADC output from 0-1023, but nrfx is only from 0-255.
#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include "nrf.h" #include "nrf_drv_saadc.h" #include "nrf_drv_ppi.h" #include "nrf_drv_timer.h" #include "boards.h" #include "app_error.h" #include "nrf_delay.h" #include "app_util_platform.h" #include "nrf_pwr_mgmt.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" void saadc_event_handler(nrf_drv_saadc_evt_t const * p_event) { // Do nothing, as we use blocking mode } int saadc_init() { int ret = nrf_drv_saadc_init(NULL, saadc_event_handler); if (ret) return ret; const nrf_saadc_channel_config_t saadc_config = { .resistor_p = NRF_SAADC_RESISTOR_DISABLED, .resistor_n = NRF_SAADC_RESISTOR_DISABLED, .gain = NRF_SAADC_GAIN1_4, .reference = NRF_SAADC_REFERENCE_VDD4, .acq_time = NRF_SAADC_ACQTIME_10US, .mode = NRF_SAADC_MODE_SINGLE_ENDED, .burst = NRF_SAADC_BURST_DISABLED, .pin_p = NRF_SAADC_INPUT_AIN0, .pin_n = NRF_SAADC_INPUT_DISABLED }; ret = nrf_drv_saadc_channel_init(0, &saadc_config); return ret; } int saadc_measure() { nrf_saadc_value_t value; nrf_drv_saadc_sample_convert(0, &value); return value; } double convertAdc(int16_t value) { return value * (3.3/1023); } int main() { uint32_t err_code = NRF_LOG_INIT(NULL); APP_ERROR_CHECK(err_code); NRF_LOG_DEFAULT_BACKENDS_INIT(); ret_code_t ret_code = nrf_pwr_mgmt_init(); APP_ERROR_CHECK(ret_code); NRF_LOG_INFO("SAADC Start"); saadc_init(); int16_t measurement; while (1) { nrf_delay_ms(100); measurement = saadc_measure(); float voltage = convertAdc(measurement); //NRF_LOG_INFO("Measured value = %ld", measurement); NRF_LOG_INFO("Voltage: " NRF_LOG_FLOAT_MARKER "V\r\n", NRF_LOG_FLOAT(voltage)); nrf_pwr_mgmt_run(); NRF_LOG_FLUSH(); } }
Above is the code with nrf_drv library (Desired)
void saadc_event_handler(nrf_drv_saadc_evt_t const * p_event) { // Do nothing, as we use blocking mode } int saadc_init() { int ret = nrfx_saadc_init(NULL, saadc_event_handler); if (ret) return ret; const nrf_saadc_channel_config_t saadc_config = { .resistor_p = NRF_SAADC_RESISTOR_DISABLED, .resistor_n = NRF_SAADC_RESISTOR_DISABLED, .gain = NRF_SAADC_GAIN1_4, .reference = NRF_SAADC_REFERENCE_VDD4, .acq_time = NRF_SAADC_ACQTIME_10US, .mode = NRF_SAADC_MODE_SINGLE_ENDED, .burst = NRF_SAADC_BURST_DISABLED, .pin_p = NRF_SAADC_INPUT_AIN0, .pin_n = NRF_SAADC_INPUT_DISABLED }; ret = nrfx_saadc_channel_init(0, &saadc_config); return ret; } int saadc_measure() { nrf_saadc_value_t value; nrfx_saadc_sample_convert(0, &value); return value; } double convertAdc(int16_t value) { return value * (3.3/1023); } int main() { uint32_t err_code = NRF_LOG_INIT(NULL); APP_ERROR_CHECK(err_code); NRF_LOG_DEFAULT_BACKENDS_INIT(); ret_code_t ret_code = nrf_pwr_mgmt_init(); APP_ERROR_CHECK(ret_code); NRF_LOG_INFO("SAADC Start"); saadc_init(); int16_t measurement; while (1) { nrf_delay_ms(100); measurement = saadc_measure(); float voltage = convertAdc(measurement); //NRF_LOG_INFO("Measured value = %ld", measurement); NRF_LOG_INFO("Voltage: " NRF_LOG_FLOAT_MARKER "V\r\n", NRF_LOG_FLOAT(voltage)); nrf_pwr_mgmt_run(); NRF_LOG_FLUSH(); } }
Above is the code for SAADC with nrfx which gives a range of 0-255 (Not desired)
I am not able to figure out about how to get SAADC working with nrfx library.
May be I am missing out on something. Could you help me out?
Thanks!
Best regards,
Navin