Go Down

Topic: Clock (Read 5 times) previous topic - next topic

ref110

Hello,

I know that the Arduiono is running with a 16 mhz frequency. I want to connect the Arduino to the DDC 101. This element needs a frequency of 2 mhz. Now my question is, how can I create a 2mhz frequency?
Another possibility would be, that I take the 16 mhz and with ICs I chance this frequency into 2 mhz. But I do not really know where can I get the 16 Mhz pulse.

Thanks for your help!

PaulS

Hz is an abbreviation of Hertz. As a sign of respect to the man, you really should capitalize the H.

Quote
I know that the Arduiono is running with a 16 mhz frequency.

No, it doesn't. It runs at 16 MHz. M is an abbreviation of mega, while m is an an abbreviation of milli. A pendulum might swing at 16 milli-Hertz. The Arduino is a bit faster than that, though.

Quote
I want to connect the Arduino to the DDC 101.

Might be good to tell us what a DDC 101 is. It would be even better to provide a link.

Quote
This element needs a frequency of 2 mhz.

For what? This is pretty slow.

johnwasser

The ATmega168/328 has a clock output pin (CLK0) which will give you a buffered copy of the 16MHz clock when you program the CKOUT fuse.

There are also several counter/timers that can produce programmable signals on output pins.  I think you should be able to program one of those timers to generate a 2 MHz square wave.
Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

davekw7x

#3
Jun 04, 2011, 01:26 am Last Edit: Jun 04, 2011, 03:35 pm by davekw7x Reason: 1

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.
Code: [Select]

//
// 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

ref110

Hello,

thanks for your posts.

The Datasheet of the DDC101 can be found here:

http://www.datasheetcatalog.org/datasheet2/a/0afl0ect5614dah40t143t8gajky.pdf

I´m not really sure if the clock is very solid if I take your advice. What do you think?

The other possibility would be, that I create the 2MHz frequency with FlipFlops (ICs). A friend told me, that that would be better.
Where can I get an 16MHz frequency? Has the Arduino Uno a clock output, or how can I create 16MHz at a pin?#


Thanks for your answers.

Go Up