Here is the Itsy Bitsy M4 code
#include <SPI.h>
#include <Wire.h>
#define SAMPLES_TO_READ 2000L
char getGoing = 'N';
unsigned long timeStartReading,timeEndReading;
int sampleValue[SAMPLES_TO_READ];
void ADC_Init(void)
{
//////////////////////////////////////////////////////////////////////////
///ADC Clock Config
//////////////////////////////////////////////////////////////////////////
MCLK->APBDMASK.bit.ADC0_ = 1;
//Use GCLK1, channel it for ADC0, select DFLL(48MHz) as source and make sure no divider is selected
GCLK->PCHCTRL[ADC0_GCLK_ID].reg = GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos); // enable gen clock 1 as source for ADC channel
GCLK->GENCTRL[0].reg = GCLK_GENCTRL_SRC_DFLL | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV(1);
GCLK->GENCTRL[0].bit.DIVSEL = 0;
GCLK->GENCTRL[0].bit.DIV = 0;
//Divide 8MHz clock by 4 to obtain 2MHz clock to adc
ADC0->CTRLA.bit.PRESCALER = ADC_CTRLA_PRESCALER_DIV4_Val;
//Choose 12-bit resolution
ADC0->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_12BIT_Val;
//Ensuring freerun is activated
ADC0->CTRLB.bit.FREERUN = 1;
//waiting for synchronisation
while(ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_CTRLB);
//Sampletime set to 0
ADC0->SAMPCTRL.reg = 0;
//Waiting for synchronisation
while(ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_SAMPCTRL);
ADC0->INPUTCTRL.reg = ADC_INPUTCTRL_MUXNEG_GND; // No Negative input (Internal Ground)
while( ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_INPUTCTRL ); //wait for sync
// Averaging (see datasheet table in AVGCTRL register description)
ADC0->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_1 | // 1 sample only (no oversampling nor averaging)
ADC_AVGCTRL_ADJRES(0x0ul); // Adjusting result by 0
//Wait for synchronisation
while(ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_AVGCTRL)
//Select VDDANA (3.3V chip supply voltage as reference)
ADC0->REFCTRL.reg = ADC_REFCTRL_REFSEL_INTVCC1;
//Enable ADC
ADC0->SWTRIG.bit.START = 1;
ADC0->CTRLA.bit.ENABLE = 1;
//wait for ADC to be ready
while(ADC0->SYNCBUSY.bit.ENABLE);
}
void setup()
{
ADC_Init();
Serial.begin(115200);
while(!Serial);
Serial.println("Begin ...");
}
void loop()
{
if (Serial.available() > 0 )
{
getGoing = Serial.read();
if (getGoing=='x') {
readNOAnalogRead(SAMPLES_TO_READ);
Serial.write('K');
}
if(getGoing=='z')
{
//Serial.println("BUFFER CONTENTS:");
for(int i=0;i<SAMPLES_TO_READ;i++)
{
Serial.print(sampleValue[i]);
if(i<SAMPLES_TO_READ-1)
Serial.print(",");
}
}
while(Serial.available()> 0)
Serial.read();
}
}
void readNOAnalogRead(int numberSamples)
{
timeStartReading = micros();
for(int i=0;i<numberSamples;i++)
{
// Reading ADC
ADC0->SWTRIG.bit.START = 1;
while(!ADC0->INTFLAG.bit.RESRDY);
sampleValue[i] = ADC0->RESULT.reg;
}
timeEndReading = micros();
Serial.print("Time per read (analogRead): "); Serial.print((float((timeEndReading-timeStartReading))/SAMPLES_TO_READ),2); Serial.print(" us (");
Serial.print(SAMPLES_TO_READ); Serial.println(" samples)");
}