I am using nrf51822 chips and UART to communicate with my cellphone. I want to know if there are any ways to improve the sampling rate (reading and transmission) of measurement. I am doing the EEG stuff, so more date transitted is favorable. Thanks!
I am using nrf51822 chips and UART to communicate with my cellphone. I want to know if there are any ways to improve the sampling rate (reading and transmission) of measurement. I am doing the EEG stuff, so more date transitted is favorable. Thanks!
Hi,
Thanks for your suggestions. I will keep these in mind. Do you mean that the dongle used with the computer has a better throughput?
Do you mean that the dongle used with the computer has a better throughput
If you use the Nordic Dongle, the BLE code is running on the dongle itself - so it is not subject to any restrictions that the host OS might impose.
The same would apply to using a Nordic Dev Kit .
Or other custom board ...
Got you. I will give it a try.
Hi Jorgen, I attached my code here. I use two channels: one for temperature and the other for ECG. Please help to take a look!
void adc_1()
{
// interrupt ADC
NRF_ADC->INTENSET = (ADC_INTENSET_END_Disabled <<
ADC_INTENSET_END_Pos); /*!< Interrupt enabled. */
// config ADC
NRF_ADC->CONFIG = (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos) /* Bits 17..16 :
ADC external reference pin selection. */
| (ADC_CONFIG_PSEL_AnalogInput2 <<
ADC_CONFIG_PSEL_Pos) /*!< Use analog
input 0 as analog input. */
| (ADC_CONFIG_REFSEL_VBG <<
ADC_CONFIG_REFSEL_Pos) /*!<
Use internal 1.2V bandgap voltage as reference for
conversion. */
| (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling <<
ADC_CONFIG_INPSEL_Pos) /*!< Analog input specified by
PSEL with no prescaling used as input for the
conversion. */
| (ADC_CONFIG_RES_10bit <<
ADC_CONFIG_RES_Pos);
/*!< 10bit ADC resolution. */
// enable ADC
NRF_ADC->ENABLE =
ADC_ENABLE_ENABLE_Enabled;
/* Bit 0 : ADC enable. */
// start ADC conversion
NRF_ADC->TASKS_START = 1;
// wait for conversion to end
while (!NRF_ADC->EVENTS_END)
{}
NRF_ADC->EVENTS_END = 0;
//Save your ADC result
adc_result = NRF_ADC->RESULT;
tempvalue=-1481.96+sqrt(2196200+(1.8639-adc_result*3.3/1023)/0.00000388);
//Use the STOP task to save current. Workaround for PAN_028 rev1.1 anomaly 1.
NRF_ADC->TASKS_STOP = 1;
}
void adc_2()
{
// interrupt ADC
NRF_ADC->INTENSET = (ADC_INTENSET_END_Disabled <<
ADC_INTENSET_END_Pos); /*!< Interrupt enabled. */
// config ADC
NRF_ADC->CONFIG = (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos) /* Bits 17..16 :
ADC external reference pin selection. */
| (ADC_CONFIG_PSEL_AnalogInput4 <<
ADC_CONFIG_PSEL_Pos) /*!< Use analog
input 0 as analog input. */
| (ADC_CONFIG_REFSEL_VBG <<
ADC_CONFIG_REFSEL_Pos) /*!<
Use internal 1.2V bandgap voltage as reference for
conversion. */
| (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling <<
ADC_CONFIG_INPSEL_Pos) /*!< Analog input specified by
PSEL with no prescaling used as input for the
conversion. */
| (ADC_CONFIG_RES_10bit <<
ADC_CONFIG_RES_Pos);
/*!< 10bit ADC resolution. */
// enable ADC
NRF_ADC->ENABLE =
ADC_ENABLE_ENABLE_Enabled;
/* Bit 0 : ADC enable. */
// start ADC conversion
NRF_ADC->TASKS_START = 1;
// wait for conversion to end
while (!NRF_ADC->EVENTS_END)
{}
NRF_ADC->EVENTS_END = 0;
//Save your ADC result
adc_output = NRF_ADC->RESULT;
//Use the STOP task to save current. Workaround for PAN_028 rev1.1 anomaly 1.
NRF_ADC->TASKS_STOP = 1;
}
/**@brief Application main function.
*/
int main(void)
{
uint32_t err_code;
bool erase_bonds;
uint8_t start_string[] = START_STRING;
// Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
uart_init();
buttons_leds_init(&erase_bonds);
ble_stack_init();
gap_params_init();
services_init();
advertising_init();
conn_params_init();
printf("%s",start_string);
printf("\n\rADC HAL simple example\r\n");
printf("Current sample value:\r\n");
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
// Enter main loop.
while(true)
{
adc_1();
adc_2();
// trigger next ADC conversion
//nrf_adc_start();
// enter into sleep mode
__SEV();
__WFE();
__WFE();
uint8_t str[4];
sprintf((char*)str, "ADC:%d TEMP: %.2f", (int)adc_result,(float)tempvalue);//
out ADC result
ble_nus_string_send(&m_nus, str, strlen((char*)str));
nrf_delay_ms(2000);
sprintf((char*)str, "ECG-ADC: %d", (int)adc_output);
ble_nus_string_send(&m_nus, str, strlen((char*)str));
nrf_delay_ms(2000);
power_manage();
}
}
/**
* @}
*/This is not enough to help you with throughput. The throughput depends on the BLE configuration, which you have not included in above code. To be able to help you, I would need the entire project (including main/sdk_config.h/IDE project files).