So, I have an ADC which is software triggered every 30ms via the RTC interrupt handler. The problem is that the ADC produces garbage results no matter the voltage applied at the input. Am I setting it up wrongly?
void init_ADC(){
//ADC INPUT PIN INIT
PORT->Group[1].PINCFG[4].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // INPUT ENABLE AND PERIPHERAL MULTIPLEXING FOR ADC_INPUT
PORT->Group[1].PMUX[2].reg = PORT_PMUX_PMUXE_B; // ENABLE ANLOUGE INPUT FOR ADC_INPUT
//Clock ADC by GCLK0
REG_GCLK_CLKCTRL = GCLK_CLKCTRL_WRTLOCK |
GCLK_CLKCTRL_CLKEN |
GCLK_CLKCTRL_ID_ADC |
GCLK_CLKCTRL_GEN_GCLK0;
REG_PM_APBCMASK |= PM_APBCMASK_ADC; // enable ADC APB clock BUS
NVIC_SetPriority(ADC_IRQn,0); // SET TO HIGHEST PRIORITY INTERRUPT
NVIC_EnableIRQ( ADC_IRQn ); // enable interrupts for ADC
// 1.65V reference Voltage and (Reference buffer gain compensator -- REMOVE COMMENTS TO ENABLE)
REG_ADC_REFCTRL |= ADC_REFCTRL_REFSEL_INT1V;// | ADC_REFCTRL_REFCOMP;
while(ADC->STATUS.bit.SYNCBUSY); //wait for synchronization
REG_ADC_CTRLB |= ADC_CTRLB_PRESCALER_DIV4 | ADC_CTRLB_RESSEL_10BIT | ADC_CTRLB_LEFTADJ; //| ADC_CTRLB_CORREN;
while(ADC->STATUS.bit.SYNCBUSY); //wait for synchronization
//INTERRUPT SET FOR WINDOW MONITOR or result is ready
REG_ADC_INTENSET |= ADC_INTFLAG_RESRDY;
while(ADC->STATUS.bit.SYNCBUSY); //wait for synchronization
REG_ADC_INPUTCTRL |= ADC_INPUTCTRL_MUXPOS_PIN12 | ADC_INPUTCTRL_GAIN_1X | ADC_INPUTCTRL_MUXNEG_GND; //PIN MULTIPLEXING FOR ADC INPUT
while(ADC->STATUS.bit.SYNCBUSY); //wait for synchronization
//Use this to calibrate Adc --- REG_ADC_CALIB = ADC_CALIB_BIAS_CAL() | ADC_CALIB_LINEARITY_CAL();
//This can be adjusted post testing -- REG_ADC_SAMPCTRL = ADC_SAMPCTRL_SAMPLEN(SOME SAMPLE LENGTH);
REG_ADC_CTRLA |= ADC_CTRLA_ENABLE; //ENABLE ADC
while(ADC->STATUS.bit.SYNCBUSY); //wait for synchronization
}
The Result register is read in the ADC interrupt handler. I've also tried enabling an LED at different Voltage thresholds but still no luck.