#include "prst/adc.h" #include #include #include #include // #include #include "prst_config.h" // 10 bits resoltuion. #define PRST_ADC_RESOLUTION 10 // #define PRST_ADC_BATT_INPUT NRF_SAADC_INPUT_VDD #define PRST_ADC_BATT_INPUT NRF_SAADC_INPUT_VDD #define PRST_ADC_BATT_CHANNEL 0 // #define PRST_ADC_SOIL_INPUT NRF_SAADC_INPUT_AIN1 // #define PRST_ADC_SOIL_CHANNEL 1 // Unused, since we'll call the SAADC synchronously for now. // void saadc_callback(nrfx_saadc_evt_t const* p_event) { // NRF_LOG_INFO("CB!", p_event->type) // } 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; uint16_t size = p_event->data.done.size; err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, size); APP_ERROR_CHECK(err_code); int i; NRF_LOG_INFO("ADC event!"); for (i = 0; i < size; i++) { NRF_LOG_INFO("%d", p_event->data.done.p_buffer[i]); } } } void prst_adc_init() { nrf_saadc_channel_config_t batt_channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(PRST_ADC_BATT_INPUT); APP_ERROR_CHECK(nrf_drv_saadc_init(NULL, saadc_callback)); APP_ERROR_CHECK( nrf_drv_saadc_channel_init(PRST_ADC_BATT_CHANNEL, &batt_channel_config)); // nrf_saadc_channel_config_t soil_channel_config = // NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(PRST_ADC_SOIL_INPUT); // soil_channel_config.reference = NRF_SAADC_REFERENCE_VDD4; // APP_ERROR_CHECK( // nrf_drv_saadc_channel_init(PRST_ADC_SOIL_CHANNEL, // &soil_channel_config)); } prst_adc_batt_read_t prst_adc_batt_read() { nrf_saadc_value_t result; // *WARNING* this function is blocking, which is ot ideal but okay, but it // *does not work* when oversampling is set! I had to manually disable // SAADC_CONFIG_OVERSAMPLE in sdk_config.h. APP_ERROR_CHECK(nrf_drv_saadc_sample_convert(PRST_ADC_BATT_CHANNEL, &result)); NRF_LOG_INFO("Read batt: here %d", result); prst_adc_batt_read_t ret; ret.raw = (uint16_t) result; ret.voltage = (3.6 * result) / (1 << PRST_ADC_RESOLUTION); ret.millivolts = ret.voltage * 1000; return ret; } int16_t prst_adc_soil_read() { nrf_saadc_value_t result = 0; // APP_ERROR_CHECK(nrf_drv_saadc_sample_convert(PRST_ADC_SOIL_CHANNEL, // &result)); return result; }