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

ADC multiple Sampling

Hello Everybody,

I have read these articles on the site : article_1 & article_2

I need to do something like that, read around 8000 sample with sampling rate equals to 100khz I mean get the readout from the adc, send it to the mobile to do some statistics but I found that there is a limitation on the sampling rate.

would you mind helping me or if there is something I did is not correct, check the attached code:

		//ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling
			// Configure ADC
			NRF_ADC->CONFIG     = (ADC_CONFIG_RES_8bit                             << ADC_CONFIG_RES_Pos)     |
														(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos)  |
														(ADC_CONFIG_REFSEL_VBG										       << ADC_CONFIG_REFSEL_Pos)  |
														(ADC_CONFIG_PSEL_AnalogInput4                    << ADC_CONFIG_PSEL_Pos)    |
														(ADC_CONFIG_EXTREFSEL_None                       << ADC_CONFIG_EXTREFSEL_Pos);
			NRF_ADC->EVENTS_END = 0;
			NRF_ADC->ENABLE     = ADC_ENABLE_ENABLE_Enabled;

			NRF_ADC->EVENTS_END  = 0;    // Stop any running conversions.
			NRF_ADC->TASKS_START = 1;
			
			while (!NRF_ADC->EVENTS_END)
			{
			}
			

			
			NRF_ADC->EVENTS_END     = 0;
			NRF_ADC->TASKS_STOP     = 1;
			
			return NRF_ADC->RESULT;
	}

		#define num_bit						8
		#define number_samples    10
		#define threshold 				500

				
		static void level_meas_timeout_handler(void * p_context)
		{
				UNUSED_PARAMETER(p_context);
				uint32_t err_code ;

				for (j = 0; j < num_bit ; j++)
				{
					for (k=0; k < number_samples ; k++)
					{
							//get the adc reading
							sample_I_temp[j][k] = temp_level_get();
							nrf_delay_ms(1);
							//nrf_delay_us(20);
					}
				}
				

			for (j = 0; j < num_bit ; j++)
				{ 
					for (k=0; k < number_samples ; k++)
					{
					err_code = ble_level_update(&m_temp,sample_I_temp[j][k]);
						if ((err_code != NRF_SUCCESS) &&
							(err_code != NRF_ERROR_INVALID_STATE) &&
							(err_code != BLE_ERROR_NO_TX_BUFFERS) &&
							(err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
							)
							{
									APP_ERROR_HANDLER(err_code);
							}
							nrf_delay_ms(10);
					}
				} 
		}

ble level update function will send the value of the adc as a notification for the mobile.

Parents
  • From the Product Specification the time required to convert a single sample in 8 bit mode is 20us, so you will never get more than 50kHz sampling rate. To get 50KHz sampling rate you should connect the END event to START task with PPI and make sure that the application gets enough time to read the RESULT register in between. With SoftDevice running you will need to ask for a timeslot of 8000*20us = 160ms to be sure that you will get a sampling rate of 50kHz (make sure that the SoftDevice will not interrupt you).

Reply
  • From the Product Specification the time required to convert a single sample in 8 bit mode is 20us, so you will never get more than 50kHz sampling rate. To get 50KHz sampling rate you should connect the END event to START task with PPI and make sure that the application gets enough time to read the RESULT register in between. With SoftDevice running you will need to ask for a timeslot of 8000*20us = 160ms to be sure that you will get a sampling rate of 50kHz (make sure that the SoftDevice will not interrupt you).

Children
Related