ADC convertion problems when changing ADC clock prescaler

Hi all,

I'm changing the ADC clock to acquire higher sampling rate and reduce the time cost in one loop, but I find the ADC convertion results changed a lot for the same signal when changing the clock. For example, when there is no change in clock (prescaler is 1024, which means the ADC clock is default clk/1024), the results for a DC power output is 2.50V, but when I changed it to clk/64, the result varies between 2.38 and 2.50, when the clock is clk/2, the result is 1.40V.

I use the following code in void setup() to change the clock:

bitSet(ADCSRA,ADPS0);
bitSet(ADCSRA,ADPS1);
bitClear(ADCSRA,ADPS2);

and use analogRead() in loop to perform ADC convertion,

I can't figure out what happened. Does anybody have some ideas?

Can you explain your setup in more detail. I had done some ADC speed tests (results somewhere on here) and found the values do change a bit but seem consistent so could be compensated.

On a floating pin the results were...

Default ADCSRA = 10010111
Arduino MEGA ADC Accuracy Tests Over 500 Iterations.

ADPS2 (ADCSRA = 10010001)
Baseline Reading: 560 Rolling Average: 574
Maximum Reading: 575 Minimum Reading: 560 Maximum Jitter: 15

ADPS4 (ADCSRA = 10010010)
Baseline Reading: 572 Rolling Average: 572
Maximum Reading: 572 Minimum Reading: 572 Maximum Jitter: 0

ADPS8 (ADCSRA = 10010011)
Baseline Reading: 568 Rolling Average: 568
Maximum Reading: 568 Minimum Reading: 568 Maximum Jitter: 0

ADPS16 (ADCSRA = 10010100)
Baseline Reading: 563 Rolling Average: 560
Maximum Reading: 563 Minimum Reading: 560 Maximum Jitter: 3

ADPS32 (ADCSRA = 10010101)
Baseline Reading: 559 Rolling Average: 509
Maximum Reading: 559 Minimum Reading: 509 Maximum Jitter: 50

ADPS64 (ADCSRA = 10010110)
Baseline Reading: 537 Rolling Average: 455
Maximum Reading: 537 Minimum Reading: 455 Maximum Jitter: 82

ADPS128 (ADCSRA = 10010111)
Baseline Reading: 514 Rolling Average: 426
Maximum Reading: 514 Minimum Reading: 426 Maximum Jitter: 88

On a pin with a trim pot the results are...

Default ADCSRA = 10010111
Arduino MEGA ADC Accuracy Tests Over 500 Iterations.

ADPS2 (ADCSRA = 10010001)
Baseline Reading: 768 Rolling Average: 768
Maximum Reading: 768 Minimum Reading: 768 Maximum Jitter: 0

ADPS4 (ADCSRA = 10010010)
Baseline Reading: 671 Rolling Average: 671
Maximum Reading: 671 Minimum Reading: 671 Maximum Jitter: 0

ADPS8 (ADCSRA = 10010011)
Baseline Reading: 675 Rolling Average: 675
Maximum Reading: 675 Minimum Reading: 675 Maximum Jitter: 0

ADPS16 (ADCSRA = 10010100)
Baseline Reading: 675 Rolling Average: 675
Maximum Reading: 676 Minimum Reading: 675 Maximum Jitter: 1

ADPS32 (ADCSRA = 10010101)
Baseline Reading: 675 Rolling Average: 675
Maximum Reading: 676 Minimum Reading: 675 Maximum Jitter: 1

ADPS64 (ADCSRA = 10010110)
Baseline Reading: 676 Rolling Average: 675
Maximum Reading: 676 Minimum Reading: 675 Maximum Jitter: 1

ADPS128 (ADCSRA = 10010111)
Baseline Reading: 675 Rolling Average: 675
Maximum Reading: 676 Minimum Reading: 675 Maximum Jitter: 1

The test code is attached.
Try double ADC reading the pin, especially if you change the analogue pin you are reading from each time.

AVR_ADC_Accuracy_Test.ino (2.15 KB)