Go Down

Topic: Arduino Due Dac configuration (Read 9158 times) previous topic - next topic

giogiannis

Hello to all.
I want to use DAC to get a sin wavwform of 200KHZ!

I read this example
http://arduino.cc/en/Tutorial/DueSimpleWaveformGenerator#.UwSaQKp5MxA

and the maximum waveform frequency is 170Hz.

I am new user of arduino. What settings of clock i have to do in order to get a waveform of 200HKZ?

I have seen that arduino due saw max sampling rate of 1Mhz.So for 1 period i can get 5 samples.
Is this true?
Thank you

MarkT

Where did you get the 1MHz sample rate from?  The raw DAC hardware takes 50 clock cycles
to convert.

The overheads of calling analogWrite will be a lot higher though.

Configuring the DAC to be timer triggered and feeding if from the DMA hardware
is the only reliable way to get high speed operation in the face of interrupts flying
about, and that's quite complex.

I've not programmed the DMA system yet but have got a 48kHz clocked timer and
interrupt generated stream going:

http://forum.arduino.cc/index.php?topic=205096.0
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

kbrown

#2
Feb 21, 2014, 12:55 am Last Edit: Feb 21, 2014, 12:57 am by kbrown Reason: 1
Hi,

I've been using the link in the previous reply as the basis of my wavetable based function generator project. I've got it working fairly well at 48kHz 12bit. It's even doing a linear interpolation between the samples as needed. But from my experience this is pretty much at the limit of what this hardware can do. I've had to really hand optimize my code to get all the necessary processing  done within the clocked time period. I'm still trying to squeeze out more spare cycles to get the rest of my application to work nicely as well. It is not easy and getting something like 200kHz sounds like a day dream to me. Maybe with some clever use of the digital outputs instead and an external DAC but still I think it would be a challenge...

EDIT: Just realized it was you Mark who replied before me. Thanks a lot for your post in the link. Really helpfull!
Cheers,
Kari

MarkT

An I2S DAC might be a possibility, some of them clock at 192kHz (WM8524 being
one example).  Haven't tried directly interfacing one yet, there is hardware support,
the synchronous serial interface, but clocking might be an issue.
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

giogiannis

Thank you very much for your answers.
From the datashhet of SAM3X.
45.6.1 Digital-to-Analog Conversion
The DACC uses the master clock (MCK) divided by two to perform conversions. This clock is
named DACC Clock. Once a conversion starts the DACC takes 25 clock periods to provide the
analog result on the selected analog output.

Anyone knows what is the default MCK value?

If we choose prescaler 2 i suppose we can get very haig sampling rate.
Maybe if i cant make it i try to make a 200khz signal with PWM.

For the ad converter what is the max sampling rate that i can get?Can i go above 500ksample/sec?

Thank you very much again for your help


kbrown

One option for generating high frequency signals would be to use one of these DDS chips. They usually have an SPI interface for microcontroller connection: http://www.analog.com/en/content/glp_dds/fca.html?gclid=CNPzoJDg3bwCFWLHtAod-TkAzw
Cheers,
Kari

Palliser

As a reference, here a BareMinimum sketch that generates a decent 1.4kHz sinewave (120 samples) using DUE's DAC1.

Code: [Select]
int i = 0;
void setup() {
  analogWriteResolution(12);
}

static int sine[] = {
    0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1,
    0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4,
    0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc,
    0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f,
    0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a,
    0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a,
    0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d,
    0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a,
    0x112, 0xdf, 0xb1, 0x87, 0x64, 0x45, 0x2c, 0x19, 0xb, 0x2,
    0x0, 0x2, 0xb, 0x19, 0x2c, 0x45, 0x64, 0x87, 0xb1, 0xdf,
    0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4,
    0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794
};

void loop() {
  analogWrite(DAC1, sine[i]);
  i++;
  if(i == 120)
    i = 0;
}


Regards, palliser

MarkT


Anyone knows what is the default MCK value?

The Due is clocked at 84MHz, this is explained on the Due page and isn't hard to look up!
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

bgentles

I think the key fact that giogiannis has overlooked is that to reconstruct a sine wave using the DAC, in the examples referenced above, it takes 120 conversions (i.e. 120 data points) to reconstruct one complete cycle of the waveform. If the DAC uses the the MCK divided by two, and the DAC requires 25 clock periods for one conversion, and there are 120 conversions in one cycle, by my calculation, the theoretical maximum frequency sinewave the DAC could put out would be 14 KHz. Allowing for the processor overhead to increment counters, read values from memory, and send them to the DAC, a frequency of 1.4KHz as demonstrated by palliser sounds entirely reasonable.  You could push this a bit higher by reducing the number of points you use to reconstruct the wave, but cutting the number of points in half will only get you a 2.8 KHz maximum. I agree with kbrown, you need to use a dedicated chip to get high frequencies, not a general purpose microprocessor.

MarkT


I think the key fact that giogiannis has overlooked is that to reconstruct a sine wave using the DAC, in the examples referenced above, it takes 120 conversions (i.e. 120 data points) to reconstruct one complete cycle of the waveform. If the DAC uses the the MCK divided by two, and the DAC requires 25 clock periods for one conversion, and there are 120 conversions in one cycle, by my calculation, the theoretical maximum frequency sinewave the DAC could put out would be 14 KHz. Allowing for the processor overhead to increment counters, read values from memory, and send them to the DAC, a frequency of 1.4KHz as demonstrated by palliser sounds entirely reasonable.  You could push this a bit higher by reducing the number of points you use to reconstruct the wave, but cutting the number of points in half will only get you a 2.8 KHz maximum. I agree with kbrown, you need to use a dedicated chip to get high frequencies, not a general purpose microprocessor.


For higher frequencies you'd use DDS and a similar table lookup - can go up towards the
Nyquist limit then, given a good analog output filter.

Direct digital synthesis is basically:
Code: [Select]

while (true)
{
  phase += frequency ;
  output (sine_table [phase >> shift]) ;
  delayMicroseconds (sample_period) ;
}
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

kbrown

Just posted my take on a Due based function generator. See here.
Cheers,
Kari

Go Up