hi team,
i have trying to wrote a code for analog to digital converter module in segger 5.40 using nrf52840 controller and and i found one example code related to analog to digital converter in sdk 16.0. version.
in that code you are using on chip temperature sensor as a analog input. but you getting output in decimal numbers in degrees.
so can you provide formulae for converting output binary values in decimal value. why because i given vcc pin voltage as a input analog signal for analog to digital converter pins in my code but i am getting adc output as a 612 decimal number after converting adc output binary into decimal. but i do not know what is 612 is weather it is no of samples or voltage. because i given 5v dc supply as a input and using default configurations for ADC driver api's.
but i am not getting again that input 5volts value after converting into digital output binary.
#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"
/* Create an empty handler and pass this handler in the saadc initialization function
> Normally this handler deals with the adc events but we are using blocking mode
> In blocking mode the functions are called and the processor waits for the adc to finish taking samples from the respective channels
> Event handler will not be called in this method
*/
void saadc_callback_handler(nrf_drv_saadc_evt_t const * p_event)
{
// Empty handler function
}
// Create a function which configures the adc input pins and channels as well as the mode of operation of adc
void saadc_init(void)
{
// A variable to hold the error code
ret_code_t err_code;
// Create a config struct and assign it default values along with the Pin number for ADC Input
// Configure the input as Single Ended(One Pin Reading)
// Make sure you allocate the right pin.
nrf_saadc_channel_config_t channel_config = NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
// Initialize the saadc
// first parameter is for configuring the adc resolution and other features, we will see in future tutorial
//on how to work with it. right now just pass a simple null value
err_code = nrf_drv_saadc_init(NULL, saadc_callback_handler);
APP_ERROR_CHECK(err_code);
// Initialize the Channel which will be connected to that specific pin.
err_code = nrfx_saadc_channel_init(0, &channel_config);
APP_ERROR_CHECK(err_code);
}
// A function which will initialize the Log module for us
void log_init(void)
{
// check if any error occurred during its initialization
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
// Initialize the log backends module
NRF_LOG_DEFAULT_BACKENDS_INIT();
}
/**
* @brief Function for main application entry.
*/
int main(void)
{
// call the log initialization function
log_init();
// call the saadc initialization function created above
saadc_init();
// a struct to hold 16-bit value, create a variable of this type because our input resolution may vary from 8 bit to 14 bits depending on our configurations
// this variable holds the adc sample value
nrf_saadc_value_t adc_val;
// Print a simple msg that everything started without any error
NRF_LOG_INFO("Application Started!!!");
// Inifinite loop
while (1)
{
// a blocking function which will be called and the processor waits until the value is read
// the sample value read is in 2's complement and is automatically converted once retrieved
// first parameter is for the adc input channel
// second parameter is to pass the address of the variable in which we store our adc sample value
nrfx_saadc_sample_convert(0, &adc_val);
// print this value using nrf log : here %d represents the integer value
NRF_LOG_INFO("Sample value Read: %d", adc_val);
// use nrf log and float marker to show the floating point values on the log
// calculate the voltage by this: input_sample * 3.6 / 2^n (where n = 8 or 10 or 12 or 14 depending on our configuration for resolution in bits)
NRF_LOG_INFO("Volts: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(adc_val * 3.6 / 512));
// give 500ms delay
nrf_delay_ms(500);
}
}
/** @} */