Clock

ref110:
DDC101...how can I create a 2mhz frequency?...

To create a jitter-free constant frequency like that ADC likes to see, you can use one of the ATmega Output Compare register output pins. The exact frequency isn't terribly critical, but you want the clock to be as "clean" as possible. I mean, this is a 20-bit converter for goodness sake!

Understanding the timer registers from the data sheets takes a little (maybe more than a little for some of us) study, but the knowledge will make stuff like this "easy."

To get you started, here's a program that I use to create 2 MHz on Arduino Pin 11 of my Duemilanove. Experiment with the timer register settings to see some of the things you can do with the simplest timer in its simplest mode. Larger values of ocr2aval slow the clock down. Sometimes that makes things quieter.

//
// Use of timer2 to generate a signal for a particular frequency on pin 11
//
// davekw7x
//

const int freqOutputPin = 11;   // OC2A output pin for ATmega328 boards
//const int freqOutputPin = 10; // OC2A output for Mega boards

// Constants are computed at compile time

// If you change the prescale value, it affects CS22, CS21, and CS20
// For a given prescale value, the eight-bit number that you
// load into OCR2A determines the frequency according to the
// following formulas:
//
// With no prescaling, an ocr2val of 3 causes the output pin to
// toggle the value every four CPU clock cycles. That is, the
// period is equal to eight slock cycles.
//
// With F_CPU = 16 MHz, the result is 2 MHz.
//
// Note that the prescale value is just for printing; changing it here
// does not change the clock division ratio for the timer!  To change
// the timer prescale division, use different bits for CS22:0 below
const int prescale  = 1;
const int ocr2aval  = 3; 
// The following are scaled for convenient printing
//

// Period in microseconds
const float period    = 2.0 * prescale * (ocr2aval+1) / (F_CPU/1.0e6);

// Frequency in Hz
const float freq      = 1.0e6 / period;

void setup()
{
    pinMode(freqOutputPin, OUTPUT);
    Serial.begin(9600);
 
    // Set Timer 2 CTC mode with no prescaling.  OC2A toggles on compare match
    //
    // WGM22:0 = 010: CTC Mode, toggle OC 
    // WGM2 bits 1 and 0 are in TCCR2A,
    // WGM2 bit 2 is in TCCR2B
    // COM2A0 sets OC2A (arduino pin 11 on Uno or Duemilanove) to toggle on compare match
    //
    TCCR2A = ((1 << WGM21) | (1 << COM2A0));

    // Set Timer 2  No prescaling  (i.e. prescale division = 1)
    //
    // CS22:0 = 001: Use CPU clock with no prescaling
    // CS2 bits 2:0 are all in TCCR2B
    TCCR2B = (1 << CS20);

    // Make sure Compare-match register A interrupt for timer2 is disabled
    TIMSK2 = 0;
    // This value determines the output frequency
    OCR2A = ocr2aval;

    Serial.print("Period    = ");
    Serial.print(period); 
    Serial.println(" microseconds");
    Serial.print("Frequency = ");
    Serial.print(freq); 
    Serial.println(" Hz");
}


void loop()
{
    // Do (almost) anything you want here.  Just don't do analogWrite to
    // pins controlled by Timer 2.  In fact, don't do anything that messes
    // with the registers in Timer 2.
}

In addition to creating a jitter-free clock, using this method requires no program intervention after the initial setup, so the "good stuff" in your program will not be bothered by anything here.

I recommend a small resistor between the Arduino Pin 11 output and the external device. I usually use 100 Ohms or so to keep the ringing off of the output clock for short runs. Don't forget to connect the external device ground to Arduino ground.

Regards,

Dave