Arduino Due frecuencia de muestreo

Hola soy un alumno de Electrónica, y estoy metido en un proyecto que necesito muestrear una señal con una frecuencia de muestreo de 44.1 kHz o similar, a partir del ADC del Arduino. ¿Cómo podría controlar la frecuencia de muestreo?

La frecuencia de muestreo la controlas indicando el momento preciso en que el ad toma la muestra.
La forma mas cómoda es usando un timer que controle esto.
Fijas la frecuencia de interrupcion del timer, y en cada tick o interrupción se toma una muestra.

Hola prueba esto (44.117 HZ):

void setup()
{

  adc_setup();
  tc_setup();
}

void loop()
{

}

/*************  Configure ADC function  *******************/
void adc_setup() {

  PMC->PMC_PCER1 |= PMC_PCER1_PID37;                    // ADC power on
  ADC->ADC_CR = ADC_CR_SWRST;                           // Reset ADC
  ADC->ADC_MR |=  ADC_MR_TRGEN_EN                       // Hardware trigger select
                  | ADC_MR_TRGSEL_ADC_TRIG3;            // Trigger by TIOA2

  ADC->ADC_CHER = ADC_CHER_CH7;                        // Enable ADC CH7 = A0

}

/*************  Timer Counter 0 Channel 2 to generate PWM pulses thru TIOA2  ************/
void tc_setup() {

  PMC->PMC_PCER0 |= PMC_PCER0_PID29;                      // TC2 power ON : Timer Counter 0 channel 2 IS TC2
  TC0->TC_CHANNEL[2].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK2  // MCK/8, clk on rising edge
                              | TC_CMR_WAVE               // Waveform mode
                              | TC_CMR_WAVSEL_UP_RC        // UP mode with automatic trigger on RC Compare
                              | TC_CMR_ACPA_CLEAR          // Clear TIOA2 on RA compare match
                              | TC_CMR_ACPC_SET;           // Set TIOA2 on RC compare match


  TC0->TC_CHANNEL[2].TC_RC = 238;  //<*********************  Frequency = (Mck/8)/TC_RC  Hz = 44.117 Hz
  TC0->TC_CHANNEL[2].TC_RA = 40;  //<********************   Any Duty cycle in between 1 and 238

  TC0->TC_CHANNEL[2].TC_CCR = TC_CCR_SWTRG | TC_CCR_CLKEN; // Software trigger TC2 counter and enable

}

En la ultima respuesta, ¿como haría para utilizar el timer y llamar a una función que es la que mide el voltaje? La llamada a esa funcion es necesaria

Use ADC Handler para recuperar conversiones :

volatile uint16_t LastValueRead;
volatile boolean FlagReadAvailable;
const uint32_t BufferSize = 1000;    
uint16_t Buffer[BufferSize];        // For 12_bit conversions

void setup()
{
  Serial.begin(250000);
  adc_setup();
  tc_setup();
}

void loop()
{
  uint32_t Index;
  Index = 0;
  printf(" Start of %d conversions\n", BufferSize);
  while (Index < BufferSize) {
    if (FlagReadAvailable == true) {
      FlagReadAvailable = false;
      Buffer[Index] = LastValueRead;
      Index++;
    }
  }
  printf(" End of %d conversions\n", BufferSize);
  delay(1000);
}

/*************  Configure ADC function  *******************/
void adc_setup() {

  PMC->PMC_PCER1 |= PMC_PCER1_PID37;                    // ADC power on
  ADC->ADC_CR = ADC_CR_SWRST;                           // Reset ADC
  ADC->ADC_MR |=  ADC_MR_TRGEN_EN                       // Hardware trigger select
                  | ADC_MR_TRGSEL_ADC_TRIG3;            // Trigger by TIOA2


  ADC->ADC_IER = ADC_IER_EOC7;                         // Interrupt on End of Conversion channel 7
  ADC->ADC_CHER = ADC_CHER_CH7;                        // Enable ADC CH7 = A0

  NVIC_EnableIRQ(ADC_IRQn);                            // Enable ADC interruptions

}

void ADC_Handler(void) {
  LastValueRead = ADC->ADC_CDR[7];   // Read ADC conversion of channel 7
  FlagReadAvailable = true;
}

/*************  Timer Counter 0 Channel 2 to generate PWM pulses thru TIOA2  ************/
void tc_setup() {

  PMC->PMC_PCER0 |= PMC_PCER0_PID29;                      // TC2 power ON : Timer Counter 0 channel 2 IS TC2
  TC0->TC_CHANNEL[2].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK2  // MCK/8, clk on rising edge
                              | TC_CMR_WAVE               // Waveform mode
                              | TC_CMR_WAVSEL_UP_RC        // UP mode with automatic trigger on RC Compare
                              | TC_CMR_ACPA_CLEAR          // Clear TIOA2 on RA compare match
                              | TC_CMR_ACPC_SET;           // Set TIOA2 on RC compare match


  TC0->TC_CHANNEL[2].TC_RC = 238;  //<*********************  Frequency = (Mck/8)/TC_RC  Hz = 44.117 Hz
  TC0->TC_CHANNEL[2].TC_RA = 40;  //<********************   Any Duty cycle in between 1 and 238

  TC0->TC_CHANNEL[2].TC_CCR = TC_CCR_SWTRG | TC_CCR_CLKEN; // Software trigger TC2 counter and enable

}