2 * A simple single freq AD9850 Arduino test script
3 * Original AD9851 DDS sketch by Andrew Smallbone at www.rocketnumbernine.com
4 * Modified for testing the inexpensive AD9850 ebay DDS modules
5 * Pictures and pinouts at nr8o.dhlpilotcentral.com
6 * 9850 datasheet at http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf
10 #define W_CLK 7 // connect to AD9850 module word load clock pin (CLK)
11 #define FQ_UD 6 // connect to freq update pin (FQ)
12 #define DATA 5 // connect to serial data load pin (DATA)
13 #define RESET 4 // connect to reset pin (RST).
18 #define encoder_click 9
20 #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
22 double user_freq = 1.e6; // 10.e6
24 // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
25 void tfr_byte(byte data)
27 for (int i=0; i<8; i++, data>>=1) {
28 digitalWrite(DATA, data & 0x01);
29 pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
34 // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
35 void sendFrequency(double frequency) {
36 int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850
37 for (int b=0; b<4; b++, freq>>=8) {
38 tfr_byte(freq & 0xFF);
40 tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
41 pulseHigh(FQ_UD); // Done! Should see output
43 Serial.print("Freq = ");
44 Serial.print((frequency / 1.e6), 4);
45 Serial.println(" MHz");
50 // configure arduino data pins for output
51 pinMode(FQ_UD, OUTPUT);
52 pinMode(W_CLK, OUTPUT);
53 pinMode(DATA, OUTPUT);
54 pinMode(RESET, OUTPUT);
58 pulseHigh(FQ_UD); // this pulse enables serial mode - Datasheet page 12 figure 10
62 pinMode(encoder_a, INPUT);
63 pinMode(encoder_b, INPUT);
64 pinMode(encoder_click, INPUT);
68 sendFrequency(user_freq);
71 double freq_step = 1.e5; // 0.1 MHz
72 int encoder_state = LOW;
73 int encoder_last = LOW;
78 if (Serial.available()) {
79 int inByte = Serial.read();
80 Serial.println(inByte, DEC);
81 if (inByte == 43 || inByte == 61 or inByte == 67) { // + = left
82 user_freq += freq_step;
83 sendFrequency(user_freq);
84 } else if ( inByte == 45 || inByte == 68) { // - right
85 user_freq -= freq_step;
86 sendFrequency(user_freq);
87 } else if ( inByte == 65 ) { // up
88 user_freq -= freq_step * 10;
89 sendFrequency(user_freq);
90 } else if ( inByte == 66 ) { // down
91 user_freq += freq_step * 10;
92 sendFrequency(user_freq);
93 } else if ( inByte >= 48 && inByte <= 57) { // 0 .. 9
94 user_freq = ( inByte - 48 ) * 1.e6;
95 sendFrequency(user_freq);
96 } else if ( inByte == 13 ) { // enter
97 Serial.print("enter Mhz = ");
98 while (Serial.available() == 0);
99 new_freq = Serial.parseFloat();
100 while (Serial.available() > 0) { Serial.read(); } // suck enter and just from partFloat
102 if ( new_freq == 0 ) {
103 Serial.println("# ignored");
105 user_freq = new_freq * 1.e6;
106 sendFrequency(user_freq);
112 encoder_state = digitalRead(encoder_a);
113 if ((encoder_last == LOW) && (encoder_state == HIGH)) {
114 if (digitalRead(encoder_b) == LOW) {
115 user_freq -= freq_step;
117 user_freq += freq_step;
119 sendFrequency(user_freq);
121 encoder_last = encoder_state;
123 if(digitalRead(encoder_click) == LOW) sendFrequency( 1.e6 ); // reset to 1MHz