import c2_ulx3s_test from examples
[Arduino] / AD9850 / AD9850.ino
1 /*
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
7  * Use freely
8  */
9  
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).
14
15 #define ENCODER 0
16 #define encoder_a 7
17 #define encoder_b 8
18 #define encoder_click 9
19  
20 #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
21
22 double user_freq = 1.e6; // 10.e6
23  
24 // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
25 void tfr_byte(byte data)
26 {
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
30   }
31 }
32
33  
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);
39   }
40   tfr_byte(0x000);   // Final control byte, all 0 for 9850 chip
41   pulseHigh(FQ_UD);  // Done!  Should see output
42   
43   Serial.print("Freq = ");
44   Serial.print((frequency / 1.e6), 4);
45   Serial.println(" MHz");
46 }
47
48  
49 void setup() {
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);
55  
56   pulseHigh(RESET);
57   pulseHigh(W_CLK);
58   pulseHigh(FQ_UD);  // this pulse enables serial mode - Datasheet page 12 figure 10
59
60 #if ENCODER
61   // encoder
62   pinMode(encoder_a, INPUT);
63   pinMode(encoder_b, INPUT);
64   pinMode(encoder_click, INPUT);
65 #endif
66   
67   Serial.begin(9600);
68   sendFrequency(user_freq);
69 }
70
71 double freq_step = 1.e5; // 0.1 MHz
72 int encoder_state = LOW;
73 int encoder_last  = LOW;
74
75 double new_freq = 0;
76
77 void loop() {
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
101        Serial.println();
102        if ( new_freq == 0 ) {
103           Serial.println("# ignored");
104        } else {
105            user_freq = new_freq * 1.e6;
106            sendFrequency(user_freq);
107        }
108      }
109   }
110
111 #if ENCODER
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;
116     } else {
117       user_freq += freq_step;
118     }
119     sendFrequency(user_freq);
120   }
121   encoder_last = encoder_state;
122   
123   if(digitalRead(encoder_click) == LOW) sendFrequency( 1.e6 ); // reset to 1MHz
124 #endif
125
126 }