diff --git a/modules/saadc/saadc.ino b/modules/saadc/saadc.ino new file mode 100644 index 0000000000000000000000000000000000000000..a173b87845d0cc04a6b181760e03958dc5f91451 --- /dev/null +++ b/modules/saadc/saadc.ino @@ -0,0 +1,61 @@ +//sec, 2017 + +#define N_SAMPLES 48 + +void adc_setup() { + //configure SAADC resolution + NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_12bit; + //configure sample rate via internal timer + //NRF_SAADC->SAMPLERATE = (( SAADC_SAMPLERATE_MODE_Timers << SAADC_SAMPLERATE_MODE_Pos) & SAADC_SAMPLERATE_MODE_Msk) | + // (( 2047 << SAADC_SAMPLERATE_CC_Pos) & SAADC_SAMPLERATE_CC_Msk); + //enable oversampling -- do not combine with scan mode! + //NRF_SAADC->OVERSAMPLE = (SAADC_OVERSAMPLE_OVERSAMPLE_Over256x << SAADC_OVERSAMPLE_OVERSAMPLE_Pos) & SAADC_OVERSAMPLE_OVERSAMPLE_Msk ; + NRF_SAADC->OVERSAMPLE = (SAADC_OVERSAMPLE_OVERSAMPLE_Bypass << SAADC_OVERSAMPLE_OVERSAMPLE_Pos) & SAADC_OVERSAMPLE_OVERSAMPLE_Msk ; + //enable SAADC + NRF_SAADC->ENABLE = (SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos); + //set result pointer + NRF_SAADC->RESULT.PTR = (uint32_t)(&data_buffer); + NRF_SAADC->RESULT.MAXCNT = N_SAMPLES; // number of samples + + //set channel 0 resistor network, gain, reference, sample time, and mode + NRF_SAADC->CH[0].CONFIG = ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) & SAADC_CH_CONFIG_RESP_Msk) + | ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESN_Pos) & SAADC_CH_CONFIG_RESN_Msk) + | ((SAADC_CH_CONFIG_GAIN_Gain4 << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk) + | ((SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) & SAADC_CH_CONFIG_REFSEL_Msk) + | ((SAADC_CH_CONFIG_TACQ_5us << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk) + | ((SAADC_CH_CONFIG_BURST_Disabled << SAADC_CH_CONFIG_BURST_Pos) & SAADC_CH_CONFIG_BURST_Msk) + | ((SAADC_CH_CONFIG_MODE_Diff << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk); + //configure Channel 0 to use A0 as positive, A1 as negative + NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput0; + NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELP_PSELP_AnalogInput1; + + //set channel 1 resistor network, gain, reference, sample time, and mode + NRF_SAADC->CH[1].CONFIG = ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) & SAADC_CH_CONFIG_RESP_Msk) + | ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESN_Pos) & SAADC_CH_CONFIG_RESN_Msk) + | ((SAADC_CH_CONFIG_GAIN_Gain4 << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk) + | ((SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) & SAADC_CH_CONFIG_REFSEL_Msk) + | ((SAADC_CH_CONFIG_TACQ_5us << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk) + | ((SAADC_CH_CONFIG_BURST_Disabled << SAADC_CH_CONFIG_BURST_Pos) & SAADC_CH_CONFIG_BURST_Msk) + | ((SAADC_CH_CONFIG_MODE_Diff << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk); + //configure Channel 1 to use A2 as positive, A4 as negative + NRF_SAADC->CH[1].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput2; + NRF_SAADC->CH[1].PSELN = SAADC_CH_PSELP_PSELP_AnalogInput4; +} + +void setup(){ + //start task + NRF_SAADC->TASKS_START = 0x01UL; + while (!NRF_SAADC->EVENTS_STARTED); NRF_SAADC->EVENTS_STARTED = 0x00UL; + for(int i=0; i<N_SAMPLES; i++){ + //sample task channel 0 + NRF_SAADC->TASKS_SAMPLE = 0x01UL; + while (!NRF_SAADC->EVENTS_DONE); NRF_SAADC->EVENTS_DONE = 0x00UL; + //sample task channel 1 + NRF_SAADC->TASKS_SAMPLE = 0x01UL; + while (!NRF_SAADC->EVENTS_DONE); NRF_SAADC->EVENTS_DONE = 0x00UL; + } + NRF_SAADC->TASKS_STOP = 0x01UL; + while (!NRF_SAADC->EVENTS_STOPPED); NRF_SAADC->EVENTS_STOPPED = 0x00UL; +} + +void loop() {}