b-parasite-esp32/code/b-parasite/src/prst/adc.c

79 lines
No EOL
2.3 KiB
C

#include "prst/adc.h"
#include <app_error.h>
#include <nrf_drv_saadc.h>
#include <nrf_log.h>
#include <nrf_saadc.h>
// #include <nrfx_saadc.h>
#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;
}