Author Topic: ADC reading garbage SAMD20 (No ASF)  (Read 1006 times)

0 Members and 1 Guest are viewing this topic.

Offline matthew_zammitTopic starter

  • Newbie
  • Posts: 8
  • Country: mt
ADC reading garbage SAMD20 (No ASF)
« on: May 04, 2018, 05:14:32 pm »
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?

Code: [Select]
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. :(
 

Online ataradov

  • Super Contributor
  • ***
  • Posts: 11355
  • Country: us
    • Personal site
Re: ADC reading garbage SAMD20 (No ASF)
« Reply #1 on: May 04, 2018, 08:43:19 pm »
Alex
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf