Mit dem AFD4351 von Analog Devices lassen sich Frequenzen von 35 MHz bis 4,4 GHz erzeugen. Er ist digital vom Arduino ansteuerbar. Die Frequenz und Ausgangsleistung kann eingestellt werden. Damit ist er prima als Synthesizer zur Frequenzerzeugung geeignet.
Der interne VCO erzeugt 2,2 – 4,4 GHz und ist PLL gesteuert stabil. Diese Frequenzen können direkt als Sinus ausgegeben werden. Die Frequenzen darunter werden über digitale Frequenzteiler erzeugt, das heißt es werden Rechteck Signale ausgegeben mit den entsprechenden Oberwellen nach der Fourier Reihe.
Vom PC ist das Programm über die serielle Ausgabe steuerbar. Mit der Eingabe von h im Seriellen Monitor des Arduino Programms oder einem anderen Terminal Programm gibt es die Hilfe für die akzeptierten Steuerbefehle.

Z.B. mit dem Kommando f1000 wird 1000MHz eingestellt und mit p5 die Ausgangsleistung auf den höchsten Wert eingestellt. Damit ist dieser Frequenzgenerator einfach einstellbar und läßt sich auch in ein Messsystem einbinden.

Zu den Anschlüssen:
Es gibt 3 Steuerleitungen vom Arduino, DATA, CLK und LE. Die digitalen Eingänge des ADF4351 sind nur für 3,3V ausgelegt. Das heißt bei meinem Arduino Uno muß ich einen Spannungsteiler oder Pegelwandler zwischen schalten.
Eine Leitung kommt vom ADF4351 zurück für lock detect, die 3,3V kann der Arduino aber direkt auswerten, da es auch in seinem HIGH Bereich liegt.

Bei der Versorgung des ADF4351 hat sich gezeigt, daß die höchste Ausgangsleistung eine Versorgungsspannung von mindestens 7,5 V benötigt, dann fliessen ca. 120mA.
Die Versorgung vom Arduino 5V Ausgang funktioniert zum Testen auch, nur wird der ADF die Ausgangsleistung reduzieren.
Das IC hat 6 Register für alle Einstellungen. Die meisten Einstellungen davon sind uninteressant für diese Anwendung, deshalb werden die Register am Programm Anfang mit Standard Werten gesetzt und nur die gewünschten Einträge werden im Programm geändert. Das sind die Frequenz und Ausgangsleistung. Nach der Frequenzänderung wartet das Programm bis Lock Detect vom IC zurück kommt und somit die Frequenz am Ausgang wirklich anliegt.
Hier nun das Programm:
// Den ADF4351 Frequenzgenerator ansteuern vom Arduino Uno
// Ausgang 35 MHz bis 4,4 GHz
//
// Spannungsteiler Uno 5V > ADF4351 Daten 3V:
// MOSI (pin 11) über Spannungswandler auf ADF DATA
// SCK (pin13) über Spannungswandler auf ADF CLK
// Select (PIN 3) über Spannungswandler auf ADF LE
//
// Direkt AFD4351 Daten > Uno
// ADF MUXOUT direkt an Arduino Pin 2 für Lock detect
// http://shelvin.de/den-adf4351-frequenzgenerator-35mhz-bis-44ghz-vom-arduino-uno-ansteuern/
//
// von Matthias Busse 10.3.2018 Version 1.0 auf shelvin.de
#include <SPI.h>
#define LE 3 // Load Enable Pin 3
// die 6 Register einfach für 500 MHz mit einem 25 MHz Quarz vorbelegen
uint32_t registers[6]={0x500000, 0x8011, 0x4E42, 0x04B3, 0xBC802C, 0x580005};
byte RFDivider; // Ausgangs-Frequenzteiler
unsigned int long MOD, FRAC, INT; // INT FRAC MOD Werte lt. Datenblatt
unsigned int long quarzFreq=25; // Quarzfrequenz
double FRACF;
double RFout; // Ausgangsfrequenz
int RFpower=5; // Ausgangsleistung
double RFoutSchrittweite=0.01; // 10 kHz
int lockdetect=2; // MIX Pin für Lock Detect
void setup() {
Serial.begin (38400);
pinMode(lockdetect, INPUT); // MUX Eingang für lock detect
pinMode(LE, OUTPUT); // Load Enable Pin
digitalWrite(LE, HIGH);
SPI.begin(); // Init SPI bus
SPI.setDataMode(SPI_MODE0); // CPHA = 0 Clock positive
SPI.setBitOrder(MSBFIRST);
SetFrequencyADF4351(437.0); //437 MHz Startwert
SetPowerADF4351(5);
}
void loop() {
int ser, len, p;
char buf[10];
double freq;
if (Serial.available() > 0) {
ser = Serial.read();
if(ser == 'h') { // Hilfe Text ausgeben
Serial.println("Help");
Serial.println(" f: set frequency 34...4400 MHz. Examples: f1000 | f300.35 | f 2000 | f99.99 ");
Serial.println(" g: get frequency");
Serial.println(" p: set output power (dBm). Allowed values are: p-4 | p-1 | p2 | p5");
Serial.println(" o: get output Power");
Serial.println(" d: device class");
Serial.println(" w: who");
Serial.println(" v: version");
Serial.println(" 1: min. frequency");
Serial.println(" 2: max. frequency");
Serial.println(" 3: min. power");
Serial.println(" 4: max. power");
Serial.println(" 5: power step width");
}
if(ser == 'd') Serial.println("Sythesizer"); // device ?
if(ser == 'w') Serial.println("ADF4351"); // who ?
if(ser == 'v') Serial.println("1.0"); // version ?
if(ser == '1') Serial.println("35000000"); // 35 MHz fmin
if(ser == '2') Serial.println("4400000000"); // 4.4 GHz fmax
if(ser == '3') Serial.println("-4"); // -4 dB Pout min.
if(ser == '4') Serial.println("5"); // +5 dB Pout max.
if(ser == '5') Serial.println("3"); // Pout step
if(ser == 'o') Serial.println(RFpower); // Ausgangsleistung in dBm
if(ser == 'g') Serial.println(RFout); // Frequenz in MHz
if(ser == 'f') { // Frequenz einstellen: f437 | f 1000
Serial.setTimeout(15);
len = Serial.readBytes(buf,12);
if((len>2) && (len<11)) { // f und was dahinter ?
freq = atof (buf);
if((freq >= 34.0) && (freq <= 4400.0)) {
SetFrequencyADF4351(freq);
}
}
}
if(ser == 'p') { // Ausgangsleistung einstellen : p-4 | p-1 | p2 | p5
Serial.setTimeout(15);
len = Serial.readBytes(buf,8);
//Serial.println(len);
if((len>2) && (len<6)) { // p und was dahinter ?
p = atoi (buf);
if(p==-4) {RFpower=-4; SetPowerADF4351(RFpower);}
if(p==-1) {RFpower=-1; SetPowerADF4351(RFpower);}
if(p==2) {RFpower=2; SetPowerADF4351(RFpower);}
if(p==5) {RFpower=5; SetPowerADF4351(RFpower);}
}
}
Serial.setTimeout(500);
}
}
void SetPowerADF4351(int power) {
// Die Ausgangsleistung einstellen.
// Datenblatt Seite 17
if( power == -4) {
bitWrite (registers[4], 4, 0);
bitWrite (registers[4], 3, 0);
WriteRegADF();
}
if( power == -1) {
bitWrite (registers[4], 4, 0);
bitWrite (registers[4], 3, 1);
WriteRegADF();
}
if( power == 2) {
bitWrite (registers[4], 4, 1);
bitWrite (registers[4], 3, 0);
WriteRegADF();
}
if( power == 5) {
bitWrite (registers[4], 4, 1);
bitWrite (registers[4], 3, 1);
WriteRegADF();
}
}
void SetFrequencyADF4351(double FreqMHz) {
// Die Frequenz einstellen.
RFout = FreqMHz; // aktuelle Frequenz speichern
if (FreqMHz >= 2200) {
RFDivider = 1; // keín Teiler, das heisst Sinus Frequenz Ausgang 2,2 ... 4,4 GHz
bitWrite (registers[4], 22, 0);
bitWrite (registers[4], 21, 0);
bitWrite (registers[4], 20, 0);
}
if (FreqMHz < 2200) {
RFDivider = 2; // Frequenzteiler, das heisst Rechteck Ausgang mit entsprechenden Oberwellen
bitWrite (registers[4], 22, 0);
bitWrite (registers[4], 21, 0);
bitWrite (registers[4], 20, 1);
}
if (FreqMHz < 1100) {
RFDivider = 4;
bitWrite (registers[4], 22, 0);
bitWrite (registers[4], 21, 1);
bitWrite (registers[4], 20, 0);
}
if (FreqMHz < 550) {
RFDivider = 8;
bitWrite (registers[4], 22, 0);
bitWrite (registers[4], 21, 1);
bitWrite (registers[4], 20, 1);
}
if (FreqMHz < 275) {
RFDivider = 16;
bitWrite (registers[4], 22, 1);
bitWrite (registers[4], 21, 0);
bitWrite (registers[4], 20, 0);
}
if (FreqMHz < 137.5) {
RFDivider = 32;
bitWrite (registers[4], 22, 1);
bitWrite (registers[4], 21, 0);
bitWrite (registers[4], 20, 1);
}
if (FreqMHz < 68.75) {
RFDivider = 64;
bitWrite (registers[4], 22, 1);
bitWrite (registers[4], 21, 1);
bitWrite (registers[4], 20, 0);
}
INT = (FreqMHz * RFDivider) / quarzFreq; // PLL Teiler
MOD = (quarzFreq / RFoutSchrittweite);
FRACF = (((FreqMHz * RFDivider) / quarzFreq) - INT) * MOD;
FRAC = round(FRACF);
registers[0] = 0; // Datenblatt Seite 15
registers[0] += INT << 15;
registers[0] += FRAC << 3;
registers[1] = 1;
registers[1] += MOD << 3;
bitSet (registers[1], 27); // Prescaler 8/9
bitSet (registers[2], 28); // Datenblatt Seite 16
bitSet (registers[2], 27); // Digital Lock Detect ist 110
bitClear (registers[2], 26);
WriteRegADF();
while(digitalRead(lockdetect)==0) {} // warten bis lock detect erkannt wird
}
void WriteRegADF() {
for (int i = 5; i >= 0; i--){ // die 6 Register schreiben
WriteRegister32(registers[i]);
}
}
void WriteRegister32(const uint32_t value) { // 32 Bit Register schreiben
digitalWrite(LE, LOW);
for (int i = 3; i >= 0; i--) {
SPI.transfer((value >> 8 * i) & 0xFF);
}
digitalWrite(LE, HIGH);
digitalWrite(LE, LOW);
}
Hier die Messungen der Ausgangsleistung in dBm über den Frequenzbereich von 35MHz bis 4480 MHz für alle 4 Ausgangsleistungen des ADF4351.

Unter 2,2GHz wird die Leistung des Rechtecksignals gemessen und darüber die des Sinus Signals. Auffällig ist der Anstieg der Leistung wenn der Teiler weg fällt und das Sinus Signal ausgegeben wird ab 2,2GHz und dann der Abfall der Leistung über 3,5GHz.
Der 3dB Abstand der 4 verschiedenen Ausgangsleistungen wird dabei relativ gut über den gesamten Frequenzbereich eingehalten und liegt immer innerhalb von 2-4 dB, meist nahe an 3dB.
Und der Vergleich zwischen den Ausgangsleistungen 1 und 2 in dBm. Einmal bei maximaler eingestellter Ausgangsleistung und bei minimaler Ausgangsleistung über den Frequenzbereich von 35MHz bis 4.4GHz.

Bei einem Meßfehler von ca. 0,1-0,2 dB hier kann man die Ausgangsleistungen als fast identisch ansehen. Nur bei voller Ausgangsleistung ab 4GHz unterscheiden sich die Leistungen um 0,6-0,9 dB.
Verwendet wurden:
ADF-4351 Platine
ADF-4351 Datenblatt
Pegelwandler 5V > 3,3V für 3 Datenleitungen
Arduino Uno
Arduino Software 1.8.0
Frequenzzähler AE20401
HP Powermeter 437B mit Messkopf HP8481H
von Matthias Busse

danke, war eine tolle Geschenk Ergänzung
Pingback: Ein Tiefpassfilter 5. Ordnung mit 69 MHz aufgebaut für den ADF4351 | Shelvin – Elektronik ausprobiert und erläutert