// The voltage that a reading of 1 from `analogRead` actually represents JsVarFloat jshReadVRef() { #ifdef NRF52 nrf_saadc_channel_config_t config; config.acq_time = NRF_SAADC_ACQTIME_3US; config.gain = NRF_SAADC_GAIN1_6; // 1/6 of input volts config.mode = NRF_SAADC_MODE_SINGLE_ENDED; config.pin_p = NRF_SAADC_INPUT_VDD; config.pin_n = NRF_SAADC_INPUT_VDD; config.reference = NRF_SAADC_REFERENCE_INTERNAL; // 0.6v reference. config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; // make reading nrf_saadc_enable(); nrf_saadc_resolution_set(NRF_SAADC_RESOLUTION_14BIT); nrf_saadc_channel_init(0, &config); return 6.0 * (nrf_analog_read() * 0.6 / 8192.0); #else const nrf_adc_config_t nrf_adc_config = { NRF_ADC_CONFIG_RES_10BIT, NRF_ADC_CONFIG_SCALING_INPUT_FULL_SCALE, NRF_ADC_CONFIG_REF_VBG }; // internal reference nrf_adc_configure( (nrf_adc_config_t *)&nrf_adc_config); return 1.2 / nrf_adc_convert_single(ADC_CONFIG_PSEL_AnalogInput0); #endif }
ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, nrf_drv_saadc_event_handler_t event_handler) { if (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) { return NRF_ERROR_INVALID_STATE; } if (event_handler == NULL) { return NRF_ERROR_INVALID_PARAM; } if (p_config == NULL) { p_config = &m_default_config; } m_cb.event_handler = event_handler; nrf_saadc_resolution_set(p_config->resolution); nrf_saadc_oversample_set(p_config->oversample); m_cb.allocated_ains = 0; m_cb.state = NRF_DRV_STATE_INITIALIZED; m_cb.adc_state = NRF_SAADC_STATE_IDLE; m_cb.active_channels = 0; m_cb.buffer_pos = 0; m_cb.limits_enabled_flags = 0; nrf_drv_common_irq_enable(SAADC_IRQn, p_config->interrupt_priority); nrf_saadc_int_enable(NRF_SAADC_INT_END); nrf_saadc_enable(); return NRF_SUCCESS; }
ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, nrf_drv_saadc_event_handler_t event_handler) { if (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) { return NRF_ERROR_INVALID_STATE; } if (event_handler == NULL) { return NRF_ERROR_INVALID_PARAM; } if (p_config == NULL) { p_config = &m_default_config; } m_cb.event_handler = event_handler; nrf_saadc_resolution_set(p_config->resolution); nrf_saadc_oversample_set(p_config->oversample); m_cb.low_power_mode = p_config->low_power_mode; m_cb.state = NRF_DRV_STATE_INITIALIZED; m_cb.adc_state = NRF_SAADC_STATE_IDLE; m_cb.active_channels = 0; m_cb.limits_enabled_flags = 0; m_cb.conversions_end = false; nrf_saadc_int_disable(NRF_SAADC_INT_ALL); nrf_saadc_event_clear(NRF_SAADC_EVENT_END); nrf_drv_common_irq_enable(SAADC_IRQn, p_config->interrupt_priority); nrf_saadc_int_enable(NRF_SAADC_INT_END); if (m_cb.low_power_mode) { nrf_saadc_int_enable(NRF_SAADC_INT_STARTED); } nrf_saadc_enable(); return NRF_SUCCESS; }
/// Returns a quickly-read analog value in the range 0-65535 int jshPinAnalogFast(Pin pin) { if (pinInfo[pin].analog == JSH_ANALOG_NONE) return 0; #ifdef NRF52 // sanity checks for channel assert(NRF_SAADC_INPUT_AIN0 == 1); assert(NRF_SAADC_INPUT_AIN1 == 2); assert(NRF_SAADC_INPUT_AIN2 == 3); nrf_saadc_input_t ain = 1 + (pinInfo[pin].analog & JSH_MASK_ANALOG_CH); nrf_saadc_channel_config_t config; config.acq_time = NRF_SAADC_ACQTIME_3US; config.gain = NRF_SAADC_GAIN1_4; // 1/4 of input volts config.mode = NRF_SAADC_MODE_SINGLE_ENDED; config.pin_p = ain; config.pin_n = ain; config.reference = NRF_SAADC_REFERENCE_VDD4; // VDD/4 as reference. config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; // make reading nrf_saadc_enable(); nrf_saadc_resolution_set(NRF_SAADC_RESOLUTION_8BIT); nrf_saadc_channel_init(0, &config); return nrf_analog_read() << 8; #else const nrf_adc_config_t nrf_adc_config = { NRF_ADC_CONFIG_RES_8BIT, // 8 bit for speed (hopefully!) NRF_ADC_CONFIG_SCALING_INPUT_FULL_SCALE, NRF_ADC_CONFIG_REF_VBG }; // internal reference nrf_adc_configure( (nrf_adc_config_t *)&nrf_adc_config); // sanity checks for nrf_adc_convert_single... assert(ADC_CONFIG_PSEL_AnalogInput0 == 1); assert(ADC_CONFIG_PSEL_AnalogInput1 == 2); assert(ADC_CONFIG_PSEL_AnalogInput2 == 4); // make reading return nrf_adc_convert_single(1 << (pinInfo[pin].analog & JSH_MASK_ANALOG_CH)) << 8; #endif }