change ADC clock

hello,

I needed set sampling frequency = 25 KHz . I used the sequinte code:

int ACTUAL_ADC_CLK;

void setup() {

Serial.begin(9600);

analogReadResolution(12);

//uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck, const uint32_t ul_adc_clock, const uint32_t ul_startuptime) // ul_mck Main clock of the device (value in Hz). // ul_adc_clock Analog-to-Digital conversion clock (in Hz). //ul_startuptime ADC startup time value (value in us).

adc_init(ADC, SystemCoreClock, 25000, 12);

}

void loop() {

//return adc clock ACTUAL_ADC_CLK = adc_get_actual_adc_clock(ADC, SystemCoreClock); Serial.println(ACTUAL_ADC_CLK); while (1) {}

}

The program output is 291666 Hz (292KHz).

The program output is 291666

ACTUAL_ADC_CLK is an int. How can an int be 291666?

I do not know the program must return the value of adc clock in Hz, ie should return 25000 and not 291666.

removing the following line of code (adc_init (ADC, SystemCoreClock, 25000, 12);) the return value would be 21000000 since it is the maximum frequency adc.

groundfungus:

The program output is 291666

ACTUAL_ADC_CLK is an int. How can an int be 291666?

Why not? An int is 32 bit.

any idea how sampling frequency to a specific value ?

I think you have to set the ul_mck to 25000 and ul_adc_clock to SystemCoreClock / 2

It doesn't work.

pedrolopes746: It doesn't work.

What is the frequency if you do that?

164004 Hz

Quote from: groundfungus on Today at 02:12:41 am Quote The program output is 291666

ACTUAL_ADC_CLK is an int. How can an int be 291666? Why not? An int is 32 bit.

int is 2 bytes. 16 bit, ±32K. Long is 4 bytes. 32 bits.

groundfungus:

Quote from: groundfungus on Today at 02:12:41 am Quote The program output is 291666

ACTUAL_ADC_CLK is an int. How can an int be 291666? Why not? An int is 32 bit.

int is 2 bytes. 16 bit, ±32K. Long is 4 bytes. 32 bits.

I thought that was on an original arduino. On a due int is 32bit as far as I know.

I think the clock in adc arduino due is limited to 164kHz.

the manual of arduino due says:

"The ADC clock range is between MCK/2, if PRESCAL is 0, and MCK/512, if PRESCAL is set to 255 (0xFF). PRESCAL must be programmed in order to provide an ADC clock frequency according to the parameters given in the product Electrical Characteristics section."

  ACTUAL_ADC_CLK = adc_get_actual_adc_clock(ADC, SystemCoreClock/11.6666);

the output is 1800120 I wanted 25000

the maximum I can get is 164000.

I overlooked you quote from the Atmel's manual but I believe you already gave yourself the answer: ADC can't be 25KHz. ADC minimum possible value is MCK/255 and the maximum is MCK/2. For 25000, your Master Clock Frequency should be 6375000. The function sysclk_get_main_hz() gives you the MCK for the SAM3X8E which is 84000000 (12nS). Thus, your desire ADC clock can be reached. May be we could help you a bit more if you tell us why you need 25KHz for your ADC clock? Regards!

for reading analog voltage signal and I need to take 500 sample signals for the voltage sine wave.

frequency voltage signal = 50hz sample rate = 25 khz

25000/50=500 samples for a period.

In a dedicated logic, given your current ADC clock (291666Hz), you should read the analog input 500 times per cycle using delayMicroseconds(11) between readings.