Appiko
simple_adc.c
1 
19 #include "simple_adc.h"
20 #include "common_util.h"
21 #include "hal_pin_analog_input.h"
22 
23 int16_t saadc_result[1];
24 
26 {
27  NVIC_ClearPendingIRQ(SAADC_IRQn);
28  NVIC_DisableIRQ(SAADC_IRQn);
29 
30  //Disable all interrupts
31  NRF_SAADC->INTENCLR = 0xFFFFFFFF;
32 
33  NRF_SAADC->TASKS_STOP = 1;
34  saadc_result[0] = 0;
35  NRF_SAADC->EVENTS_END = 0;
36  NRF_SAADC->EVENTS_STARTED = 0;
37 
38  NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_12bit << SAADC_RESOLUTION_VAL_Pos;
39  NRF_SAADC->RESULT.PTR = (uint32_t) saadc_result;
40  NRF_SAADC->RESULT.MAXCNT = 1;
41 
42  NRF_SAADC->CH[SIMPLE_ADC_CHANNEL_USED].PSELP = pin;
43  NRF_SAADC->CH[SIMPLE_ADC_CHANNEL_USED].PSELN = SAADC_CH_PSELN_PSELN_NC;
44 
45  NRF_SAADC->CH[SIMPLE_ADC_CHANNEL_USED].CONFIG = ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos)
46  & SAADC_CH_CONFIG_RESP_Msk)
47  | ((SAADC_CH_CONFIG_RESN_Bypass << SAADC_CH_CONFIG_RESN_Pos) & SAADC_CH_CONFIG_RESN_Msk)
48  | ((gain << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk)
49  | ((SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos)
50  & SAADC_CH_CONFIG_REFSEL_Msk)
51  | ((SAADC_CH_CONFIG_TACQ_10us << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk)
52  | ((SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk)
53  | ((SAADC_CH_CONFIG_BURST_Disabled << SAADC_CH_CONFIG_BURST_Pos)
54  & SAADC_CH_CONFIG_BURST_Msk);
55 
56  NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;
57 
58  NRF_SAADC->TASKS_START = 1;
59  while(NRF_SAADC->EVENTS_STARTED == 0);
60 
61  NRF_SAADC->TASKS_SAMPLE = 1;
62  while(NRF_SAADC->EVENTS_END == 0);
63 
64  NRF_SAADC->TASKS_STOP = 1;
65 
66  NRF_SAADC->EVENTS_END = 0;
67  NRF_SAADC->EVENTS_STARTED = 0;
68 
69  NRF_SAADC->EVENTS_CH[SIMPLE_ADC_CHANNEL_USED].LIMITH = 0;
70  NRF_SAADC->EVENTS_CH[SIMPLE_ADC_CHANNEL_USED].LIMITL = 0;
71 
72  //An issue with the nRF52's SAADC where it'll give negative values
73  //when the signal to the ADC is close to 0V
74  if(saadc_result[0] < 0)
75  {
76  saadc_result[0] = 0;
77  }
78  NRF_SAADC->ENABLE = (SAADC_ENABLE_ENABLE_Disabled << SAADC_ENABLE_ENABLE_Pos);
79  NRF_SAADC->CH[SIMPLE_ADC_CHANNEL_USED].PSELP = SAADC_CH_PSELP_PSELP_NC;
80 
81  return (uint32_t) saadc_result[0];
82 }
83 
uint32_t simple_adc_get_value(simple_adc_gain_t gain, simple_adc_input_t pin)
This function initializes the SAADC peripheral, gets an ADC value and then deinitializes The function...
Definition: simple_adc.c:25
simple_adc_gain_t
Gain factor of the ADC input source.
Definition: simple_adc.h:68
simple_adc_input_t
Input selection for the analog-to-digital converter.
Definition: simple_adc.h:52
#define SIMPLE_ADC_CHANNEL_USED
Definition: simple_adc.h:47