Arduino Due Sampling rate

Hello Everyone:

I am working on an Arduino borad and I have previously no experince with it, unfortunately. I need to sense the voltage signal from a sensor through ADC of the Arduino. I have an Arduino Due,manual of which says It has upto 12 useable bins for ADC input.I want to acquire 4 analog signal. However, I have two questions:

1: I want to fetch the data at high frequency. So Let's say if sampling time of Due is 60 uS, A)will it take all of 4 analog signals at T= 60 uS and then convert them to digital ? or B) it will take first signal at 60 uS and fetch second analog signal from pin 2 at 120 uS and so on from 4th pin at 240 uS? Which one of these is the correct scenario.

2: It says that Arduino Due can take 1M sample per seconds. Of course, this is an ideal figure. But, will these 4 analog signals count toward 1 sample of Due or 4 samples ?

Thank you in adavance guys

  • I want to fetch the data at high frequency*
    What frequency ?

For a precise sampling rate, you want to trigger conversions with a Timer Counter, In the sketch below, there is an internal connection between TIOA2 output and ADC peripheral to trigger conversions at 44.1 KHz:

/*****************************************************************/
/*             ADC conversions at 44.1 KHz                       */
/*****************************************************************/
volatile uint32_t lastConversion;
volatile boolean Flag;
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
  adc_setup();
  tc_setup();
}

void loop()
{
if (Flag== true)
{
  Flag = false;
  // A new conversion is available
}
}

/*************  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_MR_PRESCAL(1);
  ADC->ADC_ACR = ADC_ACR_IBCTL(0b01);                   // For frequencies > 500 KHz

  ADC->ADC_CHER = ADC_CHER_CH7;                        // Enable ADC CH7 = A0
  ADC->ADC_IER = ADC_IER_EOC7;                         // Interrupt on End of conversion
  NVIC_EnableIRQ(ADC_IRQn);                            // Enable ADC interrupt

}
void ADC_Handler()
{
  static uint32_t Count;
  lastConversion = ADC->ADC_CDR[7];
  //lastConversion = ADC->ADC_LCDR;//Do NOT clear EOC7 bit
  
  Flag = true;

  if(Count++ > 44117)
  {
    Count = 0;
    PIOB->PIO_ODSR ^= PIO_ODSR_P27;
  }
}
/*************  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 874

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

}

You set a sampling rate, you set the number of ADC channels you want to enable and automatically all enabled ADC channels will be sampled at the correct pace (provided that Enabled channels X The sampling rate < 1 Msps).

Note: Both Graynomad pinout diagram and Sam3x datasheet are most useful for direct register programming.

Thank you for your recommendation. I want to sample the data at about 50 kHz. Could you please elaborate a bit about the sampling? i.e. Is it possible to fetch each of these 4 analog signals at the same time?

Let's say you need a 50KHz sampling rate for each analog channel:

1/ You set the Timer Counter to output a 50KHz wave form at TIOA2
2/ Automatically ADC peripheral "knows" that each eanabled channel has to be sampled at 50 KHz

The ADC peripheral will sample, one after the other, each enabled channel. If 4 ADC channels have been enabled, the ADC peripheral will sample at 50 KHz * 4 = 200 KHz, AND select channel 0 for conversion then channel1, then channel 2, then channel3, then channel 0, etc...

Hi. Thank you so much. It is so helpful.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.