The output would then be fed to a tuned circuit, and the response measured by an RF probe and fed to the analog input of the Arduino.
The Analog input would be plotted against frequency to show the tuned circuit's response curve.
Here's the setup:
The control is the rotary encoder. First turn it to select the start frequency, then push the button, now select the end frequency. A further push starts the scan. Like this
The result is shown on the Monitor, like this
Code
// CONNECTIONS // A5-A0 side // ------ // encoder KY-040 // o Grey 2 CK // o White 3 DT // o Blue 8 SW // o Violet +5 // o Black GND // // display I2C LCD 16 * 2 // o Green A5 SCL // o Yellow A4 SDA // o Red GND // o Orange +5 // ------ // D0-D13 side // // RF bus hardware output // o GND // o DSB out // o I to SDR // o Q to SDR // o S0 to DSB in // o S1 to TX (selectable S1 ad9850 or DSB out) // // selector output to S1: CW-S1-DSB #include "Encoder.h" #include "DDS.h" #include "Wire.h" #include "LiquidCrystal_I2C.h" // encoder pin connections and +5V & GND #define CK 2 #define DT 3 #define BUTTON 8 // pin Button // DDS pin connections #define RST 4 // Pin RST #define DATA 5 // Pin DATA #define FQ 6 // Pin FQ #define CLK 7 // Pin CLK // input connection #define IN A0 // I2C connections #define SDA A4 #define SCL A5 // commands #define SF 0 // set start freq #define EF 1 // set end freq #define SC 2 // scan start // output print scale factor #define FACTOR 2 // Encoder object Encoder enc(DT, CK); // DDS object DDS dds(CLK, FQ, DATA, RST); // LCD object LiquidCrystal_I2C lcd(0x27, 16, 2); double freq; // scan frequency double freq1 = 6500000L; // init start & end double freq2 = 7500000L; long tune = 10000L; // fix button tune step and scan delta steps long delta = 50000L; long pos = 0; // enc positions long newpos; byte act = 0; // init set freq1 void setup() { pinMode(BUTTON, INPUT_PULLUP); // button input Serial.begin(9600); // serial comms enc.write(0); // init encoder dds.init(); // init DDS dds.setFrequency(freq1); // set start freq lcd.init(); // init LCD lcd.backlight(); } void loop() { byte tag; if(digitalRead(BUTTON) == LOW) // button pressed? { while(!digitalRead(BUTTON)); // wait for button release if(act == 2) act = 0; // chose actions else act++; } switch(act) // change delta freq { case SF: // change start freq1 in 100kHz steps tag = 0; freq1 = change(freq1); break; case EF: // change end freq2 in 100kHz steps tag = 1; freq2 = change(freq2); break; case SC: // start scan tag = 2; for(freq = freq1; freq <= freq2; freq += delta) { delay(50); dds.setFrequency(freq); // output freq show(tag, freq1, freq); // display scan freq volts(freq, analogRead(IN)); // output to monitor } act = 0; break; } show(tag, freq1, freq2); } // change freq, returns new freq long change(long f) { // encoder read, updates freq newpos = enc.read(); if(newpos != pos) f += tune * (newpos - pos) / 4; // enc gives 4 pulses per click! pos = newpos; return f; } // display start & end freqs in MHz void show(byte t, double f1, double f2) { if(t == 0) // line 1 delete ">", line 0 put ">" { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,0); lcd.print(">"); } if(t == 1) // line 0 delete ">", line 1 put ">" { lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(">"); } if(t == 0 || t == 1) // line 0 f1 or "SCAN" { lcd.setCursor(4,0); lcd.print(f1/1000000, 6); lcd.setCursor(13,0); lcd.print("MHz"); } else if(t == 2) { lcd.setCursor(4,0); lcd.print("SCAN "); } lcd.setCursor(4,1); lcd.print(f2/1000000, 6); lcd.setCursor(13,1); lcd.print("MHz"); } // output freq & A0 to monitor void volts(long f, int in) { int n; Serial.print(f); n = in/FACTOR; while(n-- > 0) { Serial.print(" "); } Serial.println("X"); }
No comments:
Post a Comment