This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to read three adc pin ?

Hello everyone,

I use SDK14.2 and s132 softdevice. I can read "NRF_SAADC_INPUT_AIN0" and "NRF_SAADC_INPUT_VDD" pins and system is working properly. 

Working Code like this;

#define ADC_RESULT_IN_MILLI_VOLTS(ADC_VALUE)\
        ((((ADC_VALUE) * ADC_REF_VOLTAGE_IN_MILLIVOLTS) / ADC_RES_10BIT) * ADC_PRE_SCALING_COMPENSATION)
			
#define ADC_REF_VOLTAGE_IN_MILLIVOLTS   600                                    /**< Reference voltage (in milli volts) used by ADC while doing conversion. */
#define ADC_PRE_SCALING_COMPENSATION    6                                      /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/
#define DIODE_FWD_VOLT_DROP_MILLIVOLTS  34                                     /**< Typical forward voltage drop of the diode . */
#define ADC_RES_10BIT                   1024                                   /**< Maximum digital value for 10-bit ADC conversion. */

#define SAADC_SAMPLE_RATE		        250                                    /**< SAADC sample rate in ms. */ 

static const nrf_drv_timer_t   m_timer = NRF_DRV_TIMER_INSTANCE(3);
static nrf_ppi_channel_t       m_ppi_channel;
static nrf_saadc_value_t 			 adc_buffer[2];																				/**< SAADC Parameter */


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_config = NRF_DRV_TIMER_DEFAULT_CONFIG;
    timer_config.frequency = NRF_TIMER_FREQ_31250Hz;
    err_code = nrf_drv_timer_init(&m_timer, &timer_config, timer_handler);
    APP_ERROR_CHECK(err_code);

    /* setup m_timer for compare event */
    uint32_t ticks = nrf_drv_timer_ms_to_ticks(&m_timer,SAADC_SAMPLE_RATE);
    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_event_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_event_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;
				nrf_saadc_value_t   adc_bat;
				nrf_saadc_value_t   adc_value_1;
				uint16_t 						batt_lvl_in_milli_volts;
				uint8_t  						percentage_batt_lvl;
				
				adc_bat = p_event->data.done.p_buffer[0];	
				adc_value_1 = p_event->data.done.p_buffer[1];
        // set buffers
        err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 2);
        APP_ERROR_CHECK(err_code);
				
	    batt_lvl_in_milli_volts = ADC_RESULT_IN_MILLI_VOLTS(adc_bat) +
                                  DIODE_FWD_VOLT_DROP_MILLIVOLTS;
        percentage_batt_lvl = battery_level_in_percent(batt_lvl_in_milli_volts);

        err_code = ble_bas_battery_level_update(&m_bas, percentage_batt_lvl);
        if (
            (err_code != NRF_SUCCESS)
            &&
            (err_code != NRF_ERROR_INVALID_STATE)
            &&
            (err_code != NRF_ERROR_RESOURCES)
            &&
            (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
           )
        {
            APP_ERROR_HANDLER(err_code);
        }
				
//				NRF_LOG_INFO("adc_bat = %u", adc_bat);
				NRF_LOG_INFO("adc_value_1 = %u",adc_value_1);
//				NRF_LOG_INFO("percentage_batt_lvl = %u", percentage_batt_lvl);
				

    }
}

void saadc_init(void)
{
    ret_code_t err_code;
	
    nrf_saadc_channel_config_t channel_0_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_VDD);
	
	nrf_saadc_channel_config_t channel_1_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_0_config);
    APP_ERROR_CHECK(err_code);
	
		err_code = nrf_drv_saadc_channel_init(1, &channel_1_config);
    APP_ERROR_CHECK(err_code);
		
		err_code = nrf_drv_saadc_buffer_convert(&adc_buffer[0], 2);
    APP_ERROR_CHECK(err_code);
    err_code = nrf_drv_saadc_buffer_convert(&adc_buffer[1], 2);
    APP_ERROR_CHECK(err_code);
}

Now I want to add new ADC pin and read "NRF_SAADC_INPUT_AIN1". I added new configuration in saadc_init function;

nrf_saadc_channel_config_t channel_2_config =
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);

err_code = nrf_drv_saadc_channel_init(2, &channel_2_config);
APP_ERROR_CHECK(err_code);

err_code = nrf_drv_saadc_buffer_convert(&adc_buffer[2], 2);
APP_ERROR_CHECK(err_code);

And I add new value variable in saadc_calback function

nrf_saadc_value_t   adc_value_2;

adc_value_2= p_event->data.done.p_buffer[2];

NRF_LOG_INFO("adc_value_2= %u",adc_value_2);

I can compile the code but when I upload the code device can not advertise and RTT Viewer output get  fail.

 "0> <error> app: Fatal error"

Do you have any suggestion ? 

Parents Reply Children
No Data
Related