42 #define ADC_CHANS_ENABLED 0x1FF // all channels, including battery reference voltage
46 #define ADC_SAMPLE_FREQ 400 // Hz (minimum of ~366.21 Hz)
47 #define ADC_PRESCALE_VALUE (REF_OSC / ADC_SAMPLE_FREQ)
49 #define ADC_USE_TIMER 0
50 #define ADC_USE_INTERRUPTS 0 // incomplete support
52 uint16_t adc_reading[NUM_ADC_CHAN];
54 void ADC_flush(
void) {
55 while(ADC->FIFO_STATUSbits.EMPTY == 0) ADC->FIFO_READ;
58 uint16_t ADC_READ(
void) {
59 while(ADC->FIFO_STATUSbits.EMPTY);
60 return ADC->FIFO_READ;
64 void adc_service(
void) {
67 while (ADC->FIFO_STATUSbits.EMPTY == 0) {
68 value = ADC->FIFO_READ;
69 channel = value >> 12;
70 if (channel < NUM_ADC_CHAN) adc_reading[channel] = value & 0xFFF;
74 #define _adc_setup_chan(x) do { \
75 if ( channel == x ) { \
76 ADC->SEQ_1bits.CH##x = 1; \
77 GPIO->FUNC_SEL.ADC##x = 1; \
78 GPIO->PAD_DIR.ADC##x = 0; \
79 GPIO->PAD_KEEP.ADC##x = 0; \
80 GPIO->PAD_PU_EN.ADC##x = 0; \
83 void adc_setup_chan(uint8_t channel) {
95 ADC->CLOCK_DIVIDER = 80;
96 ADC->PRESCALE = ADC_PRESCALE_VALUE - 1;
118 ADC->CONVERT_TIME = 1000000 / (115200 / 8) - 1;
122 #if ADC_USE_INTERRUPTS
123 ADC->FIFO_CONTROL = 7;
125 ADC->FIFO_CONTROL = 0;
129 ADC->SR_1_HIGH = 0x0000;
130 ADC->SR_1_LOW = (REF_OSC / ADC_PRESCALE_VALUE) / (115200 / 8) + 1;
135 ADC->SEQ_1bits.SEQ_MODE = 1;
137 ADC->SEQ_1bits.SEQ_MODE = 0;
139 ADC->SEQ_1bits.BATT = 1;
141 ADC->CONTROL = 0xF001
146 ADC->OVERRIDE = (1 << 8);
void adc_init(void)
Initializes the ADC controller.