This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Unable to get meaningful data while reading analog voltage applied to pin on nrf52840. Please help

I am getting random data while using saadc example to reading analog voltage applied to pin on nrf52840. i want to read analog output from MQ135 gas sensor, I have applied the voltage output from sensor to P0.06 and reading the output from termite but all i am getting is random data with no meaning.

            #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_drv_power.h"

	#define NRF_LOG_MODULE_NAME "APP"
	#include "nrf_log.h"
	#include "nrf_log_ctrl.h"

	#define SAMPLES_IN_BUFFER 5
	volatile uint8_t state = 1;

	static const nrf_drv_timer_t m_timer = NRF_DRV_TIMER_INSTANCE(0);
	static nrf_saadc_value_t     m_buffer_pool[2][SAMPLES_IN_BUFFER];
	static nrf_ppi_channel_t     m_ppi_channel;
	static uint32_t              m_adc_evt_counter;


	void timer_handler(nrf_timer_event_t event_type, void * p_context)
	{

	}


	void saadc_sampling_event_init(void)
	{
			ret_code_t err_code;

			err_code = nrf_drv_ppi_init();
			APP_ERROR_CHECK(err_code);

			nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;
			timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
			err_code = nrf_drv_timer_init(&m_timer, &timer_cfg, timer_handler);
			APP_ERROR_CHECK(err_code);

			/* setup m_timer for compare event every 400ms */
			uint32_t ticks = nrf_drv_timer_ms_to_ticks(&m_timer, 400);
			nrf_drv_timer_extended_compare(&m_timer,
																		 NRF_TIMER_CC_CHANNEL0,
																		 ticks,
																		 NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
																		 false);
			nrf_drv_timer_enable(&m_timer);

			uint32_t timer_compare_event_addr = nrf_drv_timer_compare_event_address_get(&m_timer,
																																									NRF_TIMER_CC_CHANNEL0);
			uint32_t saadc_sample_task_addr   = nrf_drv_saadc_sample_task_get();

			/* setup ppi channel so that timer compare event is triggering sample task in SAADC */
			err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel);
			APP_ERROR_CHECK(err_code);

			err_code = nrf_drv_ppi_channel_assign(m_ppi_channel,
																						timer_compare_event_addr,
																						saadc_sample_task_addr);
			APP_ERROR_CHECK(err_code);
	}


	void saadc_sampling_event_enable(void)
	{
			ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel);

			APP_ERROR_CHECK(err_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);

					int i;
					NRF_LOG_INFO("ADC event number: %d\r\n", (int)m_adc_evt_counter);

					for (i = 0; i < SAMPLES_IN_BUFFER; i++)
					{
							NRF_LOG_INFO("%c\r\n", p_event->data.done.p_buffer[i]);
					}
					m_adc_evt_counter++;
			}
	}


	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_AIN0);

			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_pool[0], SAMPLES_IN_BUFFER);
			APP_ERROR_CHECK(err_code);

			err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_IN_BUFFER);
			APP_ERROR_CHECK(err_code);

	}


	/**
	 * @brief Function for main application entry.
	 */
	int main(void)
	{
			uint32_t err_code = NRF_LOG_INIT(NULL);
			APP_ERROR_CHECK(err_code);

			err_code = nrf_drv_power_init(NULL);
			APP_ERROR_CHECK(err_code);

			ret_code_t ret_code = nrf_pwr_mgmt_init();
			APP_ERROR_CHECK(ret_code);

			NRF_LOG_INFO("SAADC HAL simple example.\r\n");
			saadc_init();
			saadc_sampling_event_init();
			saadc_sampling_event_enable();

			while (1)
			{
					nrf_pwr_mgmt_run();
					NRF_LOG_FLUSH();
			}
	}

I keep getting output in termite - terminal like this :

[00]€[05]@…[05][00]Ù–ð[00]ý¨Q8[00]Æ[06][00][00][05]@…[01][03][00][05]@…[01][00][00][05][1C][05]…[01][00][00][05]@…[01][00][00][01]@_x[00][00]APP:INFO:ADC event number: 434
APP:INFO:[03]
APP:INFO:[00]
APP:INFO:[02]
APP:INFO:[02]
APP:INFO:[02]
APP:INFO:ADC event number: 435

But cannot get the actual value.

Related