// DDS AD9850, encoder input // display on LCD 16 * 2 // encoder A = 2, C (centre) = GND & B = 3 #include "DDS.h" #include "Wire.h" #include "LiquidCrystal_I2C.h" #define ENCA 2 #define ENCB 3 // pin connections #define RST 4 // Pin RST #define DATA 5 // Pin DATA #define FQ 6 // Pin FQ #define CLK 7 // Pin CLK #define BUTTON 8 // pin Button // frequency change, by df #define NC 0 #define UP 1 #define DWN 2 // I2C connections #define SDA A4 #define SCL A5 // DDS object DDS dds(CLK, FQ, DATA, RST); // LCD object LiquidCrystal_I2C lcd(0x27, 16, 2); double freq = 3600000L; // start freq Hz double df = 100; // 100Hz change in frequency per click byte chg = NC; // flag NC = no change, UP = add df, DWN = subtract df byte dsw = 0; // delta freq = 10Hz char *dtxt[4] = { " 10", "100", " 1K", "10K"}; // delta freq display values void setup() { pinMode(ENCA, INPUT_PULLUP); // encoder inputs pinMode(ENCB, INPUT_PULLUP); pinMode(BUTTON, INPUT_PULLUP); // button input attachInterrupt(0, doEnc, CHANGE); // interrupt on any change of pin 2 dds.init(); dds.setFrequency(freq); lcd.init(); lcd.backlight(); show(freq); } void loop() { int state; switch (chg) { case NC: break; case UP: freq += df; show(freq); break; case DWN: freq -= df; show(freq); break; } chg = NC; dds.setFrequency(freq); if(digitalRead(BUTTON) == LOW) // button pressed? { if(dsw == 3) dsw = 0; else dsw++; } switch(dsw) { case 0: df = 10; break; case 1: df = 100; break; case 2: df = 1000; break; case 3: df = 10000; break; } while(!digitalRead(BUTTON)); // wait for button release showd(dsw); } // display freq in MHz void show(double f) { lcd.setCursor(0, 0); lcd.print("VHF"); lcd.setCursor(4, 0); lcd.print(f/1000000, 6); lcd.setCursor(13,0); lcd.print("MHz"); } // display delta freq void showd(byte d) { lcd.setCursor(0, 1); lcd.print("STEP"); lcd.setCursor(5,1); lcd.print(dtxt[d]); } void doEnc() { if(digitalRead(ENCA) == digitalRead(ENCB)) chg = UP; else chg = DWN; }
Saturday, 2 August 2014
DDS AD9850 with encoder input and LCD display
Here's a sketch to use an AD9850 DDS with input from an encoder and output to an LCD display. This sketch will be further developed to display more parameters and to have inputs to change the scanning speed. The current one, here, increments the frequency by 10, 100, 1kHz or 10kHz per step when you press the encoder knob, not the most practical way to tune a radio.. will have to give this some thought.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment