ESP32 DAC signal

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)");
}