Go Down

Topic: A/D conversion and serial transmission with arduino Due (Read 383 times) previous topic - next topic

thiagoxmec


Hello guys, I'm using this code, but it is causing a discontinuity for each block of 1000 points. I am sure that this discontinuity is caused by the serial transfer time.

How could I correct this, to obtain a continuous transmission without loss of points during the discontinuity at the end of each block of 1000 points?

follow my code:



unsigned long k = 1000 ; // buffer size
unsigned long values[1000];

void setup() {
  Serial.begin(115200);
  ADC->ADC_MR |= 0x80;  // enable continuous acquisition
  ADC->ADC_CHER = 0X80; // Active PIN A0 INPUT
}
void loop() {
 unsigned int i;
   for(i=0;i<k;i++)
  {
    while((ADC->ADC_ISR & 0x80)==0); // wait for conversion     
    values=(ADC->ADC_CDR[7]);    //  adds the value to the buffer
   }
  delayMicroseconds(1);
 
  for(i=0;i<k;i++)
   { Serial.println(values); }} // Plot buffer

ard_newbie

#1
Sep 20, 2020, 06:36 pm Last Edit: Sep 20, 2020, 06:36 pm by ard_newbie
The best way to log smoothly ADC conversions is with a PDC DMA. Search in the DUE sub forum for example sketches of ADC conversions and DMA. Morover, IMO it's clearer to use uint16_t type variables for ADC conversions rather than long type.

Moreover, the ADC peripheral needs some calibration to improve accuracy:
http://ww1.microchip.com/downloads/en/Appnotes/doc11106.pdf

Some general rules to improve ADC conversions:
- Power the DUE with a powerbank since power thru the USB cable from a PC is unstable,
- Pay attention to wiring,
- Put a signal conditioning circuit on the analog input pin,
- Oversample and average ADC conversions,
- Write your code with PDC DMA (example sketches are provide in the DUE sub forum ADC with direct register programming).

Go Up