ADF4351 Frequency Syntheziser, Frequenzeinstellung via Bascom

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • ADF4351 Frequency Syntheziser, Frequenzeinstellung via Bascom

      Vielleicht ist dieses Thema ein wenig Off-Topic, aber ich möchte dennoch einmal nachfragen, ob sich ein User schon mit einem solchen oder ähnlichen Syntheziser-Board befasst hat. Es wird via SPI eingestellt. Zur Ermittlung der einzelnen Registerwerte gibt es bei Analog Device auch ein kleines Windows-Programm, mit welchem die Registerwerte für einzelne Frequenzen ermitteln werden können.

      Bevor ich das "Rad" neu erfinde, würde ich mich freuen, wenn jemand mit diesem Baustein schon gearbeitet hat, und mir mit ersten Programmschnipseln behilflich sein könnte. Das ADF4351-Board ist ein China-Import (siehe Bild). Auf dem mir vorliegenden Board ist jedoch 100MHz Quarz verbaut.

      Im Internet finde ich lediglich Arduino xx.ino basierte Varianten. Mir sind die C-Clone aber ein Gräuel. Da lieb ich mir doch Bascom mit seiner jederzeit nachvollziehbaren und verständlichen Syntax.

      Hat jemand schon mit einem solchen oder ähnlichen Board Frequenzeinstellungen vorgenommen?

      Gruß

      Ulrich
      Dateien
    • Für User, die sich mit dem ADF4351 befassen möchten, hier nun meine ersten Tests, um die Funktion des Syntheziser-Boards zu überprüfen.
      Als Referenzfrequenz wird 50MHz (extern eingespeist) verwendet. Mit diesem Syntheziser sind Frequenzen im Bereich von 35MHz bis 4400MHz einstellbar. Alles weitere kann aus dem Listing zu entnommen werden.

      Quellcode

      1. '(
      2. Programm zur Ansteuerung des ADF4351-Frequency-Synthezisers, China-Import
      3. Dient zur Überprüfung der Funktion der gelieferten Baugruppe
      4. ')
      5. 'Datum: 26.04.2018
      6. $regfile = "m328pdef.dat"
      7. $hwstack = 64
      8. $swstack = 64
      9. $framesize = 128
      10. $crystal = 16000000 'QuarzFrequenz
      11. Dim Reg0 As Long
      12. Dim Reg1 As Long
      13. Dim Reg2 As Long
      14. Dim Reg3 As Long
      15. Dim Reg4 As Long
      16. Dim Reg5 As Long
      17. Dim Regx As Long
      18. Dim Hw As Word 'Higher-Word von Long-Register Regx
      19. Dim Lw As Word 'Lower-Word von Long-Register Regx
      20. Dim Ftw(4) As Byte '4 Bytes der Long-Registers Regx
      21. Dim I As Byte
      22. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
      23. Config Portb.2 = Output 'LE
      24. Le Alias Portb.2
      25. Set Portb.2 'LE auf high
      26. Spiinit
      27. 'Registerwerte Reg0 bis Reg5 aus ADF435x-Software von Analog Device
      28. 'Registereinstellungen für RF=100MHz, 50MHz Ref, Ch-spacing=10kHz,Aux Power+5dBm
      29. 'R-Counter: /1 , Ref/2=ok
      30. 'Mux-Out: Digital Lock Detect
      31. 'LD-Pin: Digital Lock Detect
      32. 'LDF: Frac-N
      33. Reg0 = &H400000
      34. Reg1 = &H8008011
      35. Reg2 = &H19004E42
      36. Reg3 = &H4B3
      37. Reg4 = &HDC80FC
      38. Reg5 = &H580005
      39. '6 Register werden an ADF4351 übertragen, laut Datenblatt Reg5 zuerst
      40. Regx = Reg5
      41. Gosub Makebytes 'aus long werden bytes
      42. Gosub Send_to_adf 'via SPI zum ADF4351
      43. Regx = Reg4
      44. Gosub Makebytes
      45. Gosub Send_to_adf
      46. Regx = Reg3
      47. Gosub Makebytes
      48. Gosub Send_to_adf
      49. Regx = Reg2
      50. Gosub Makebytes
      51. Gosub Send_to_adf
      52. Regx = Reg1
      53. Gosub Makebytes
      54. Gosub Send_to_adf
      55. Regx = Reg0
      56. Gosub Makebytes
      57. Gosub Send_to_adf
      58. End
      59. Makebytes:
      60. Hw = Highw(regx) ' Word 2
      61. Lw = Regx ' Word 1
      62. Ftw(1) = High(hw) ' Byte 4
      63. Ftw(2) = Low(hw) ' Byte 3
      64. Ftw(3) = High(lw) ' Byte 2
      65. Ftw(4) = Low(lw) ' Byte 1
      66. Return
      67. Send_to_adf:
      68. Reset Le 'LE vom ADF4351=low, Start Übertragung Registerwert
      69. Waitus 10
      70. For I = 1 To 4 ' 4 Bytes pro Register ins ADF4351 schreiben
      71. Spdr = Ftw(i) ' SPI Data Register
      72. While Spsr.7 = 0 ' SPI Status Register, Bit 7 = SPIF kontrollieren
      73. ' Warte bis SPIF = 1
      74. Wend
      75. Next I
      76. Set Le 'LE vom ADF4351=high, Ende Übertragung Registerwert
      77. Waitus 50
      78. Return
      Alles anzeigen
      Den Steuereingängen des ADF4351 sind Spannungsteilern/Levelshiftern vorzuschalten, da sie nur 3,3V vertragen, wenn sie einem Arduino-Board geliefert werden.

      Gruß
      Ulrich
      Dateien
    • zu meinem Bedauern hatte sich in der schematic.jpg aus Post#2 ein Vertauscher der Spannungsteilerwiderstände eingeschlichen. Der ADF4351 verträgt nur 3,3Volt Pegel. Im Bild unten ist es korrigiert.
      Desweiteren finden interessierte User mein Bascom-Programm zum Beschreiben der ADF4351-Register im Anhang. Es ist soweit fertiggestellt, dass über die manuelle Eingabe bzw. Vorgabe einer gewünschten Frequenz alle erforderlichen Registerwerte zusammengestellt und an den ADF4351 Baustein per SPI gesandt werden. Mein nächster Schritt soll die Eingabe der Parameter per 3,2" Touchdisplay werden, sodass ein kleiner Signalgenerator entsteht.

      Zu beachten ist, dass der ADF4351 lediglich im Bereich von 2200Mhz bis 4400Mhz sinusförmige Signale generiert; darunter liegende Frequenzen werden durch Teilung aus dem vorgenannten Bereich gewonnen und haben somit eher Rechteck-Charakter mit guten 3.-5.- usw Oberwellen.

      Die untere nutzbare Frequenz liegt bei 35MHz, die obere bei 4400MHz!
      Dateien
    • Update der Version 1-1 vom 26.5.2018 (aus Post#3) auf Version 1-2 vom 31.05.2018

      Ergänzungen:

      Wahl von anderen Referenz-Frequenzen als 25MHz
      Auto-Set vom "Band Select Clock Divider"
      Ausgabe der zurückgerechneten Ausgangsfrequenz auf Basis gewählter Einstellungen als Kontrolle gegen unzulässige Parameter-Vorgabewerte

      Diverse Texthinweise
      Dateien
    • Update der Version 1-2 vom 31.05.2018 auf Version 1-3 vom 10.06.2018

      Ergänzungen:

      Es hat sich herausgestellt, dass bei bestimmten Frequenzen, in Verbindung mit den gewählten Channel-Steps, der MOD-Wert unzulässige Werte (>4095) erreichen kann. Deshalb wurde in Anlehnung an das ADF4351-Tool von Analog-Device eine deutliche Warnung vorgesehen.
      In Falle, dass MOD>4095 ist, empfiehlt das ADF4351-Tool, dass eine andere Frequenz oder ein anderer Channel-Step (>1kHz) zu wählen ist.

      --- Suche nach optimalem FRAC-Wert um den MOD-Wert unter 4095 zu bringen
      --- deutliche Warnausgabe (Print), wenn trotz aller Suche der MOD-Wert > 4095 ist

      Ich hoffe nun, mittlerweile (fast) alle Eventualitäten erfasst zu haben.

      Gruß
      Ulrich

      P.S. Frage an Moderator: Dieser Thread gehört eigentlich nicht in die Display Schublade, vielleicht ins Hauptforum?
      Dateien
    • Hallo Bacom Mitstreiter, ;)

      1000 Dank für den Upload des Quellcodes. Ich konnte somit mit wenig Zeitaufwand mein Chinamodul zu verlässig zum Laufen bringen. Als Dankeschön möchte ich gern den erweiterten Quellcode zur Verfügung stellen.

      zusätzliche Funktion (siehe History):
      04.07.2018 update mit Version 1-4:
      -- Übergabe der Freq und der Ausgangsleistung mittels UART
      -- Flashen des µC mittels MCS Bootloader (Bd19200)
      -- zulässige Freq [34.5 ... 1700]MHz (>1,7GHz keine Ausgabe lt. Oszi)
      -- EEprom Speicherung der Übergabewerte
      -- Status LED (LED1 auf dem Pollin EvaBoard)

      to do:
      -- automatischer Freqsweep im gewünschten Bereich --> folgt
      Dateien
    • Für die Eingabe/Vorwahl von Frequenz, Channel-Step, Power-Out usw. sowie für die Darstellung von übertragenen Parametern zum ADF4351 kann auch ein LCD-Touchdisplay gewählt werden. Dazu sind die Programme von Hkipnik ideal geeignet.

      Da die meisten LCD-Displays über SPI-Bus angesteuert werden, macht es Sinn, für die Übertragung der 32-bit breiten ADF4351-Register-Werte (6 Stk) nicht einen SPI-Bus, sondern die Shiftout-Funktion von Bascom zu nutzen.

      Im Anhang ist eine kleine Routine (shiftout_to_adf) zu finden, die ersatzweise anstelle der Sub „Send_to_adf“ eingesetzt werden kann. Dazu sind zusätzliche Pins für SCK und Dat_out zu definieren und zu verwenden.

      BASCOM-Quellcode

      1. 'Ergänzung in ADF4351_definitions
      2. '------------------------------------------
      3. 'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
      4. Le Alias Portb.4
      5. Config Le = Output 'LE
      6. Sck Alias Portb.7
      7. Config Sck = Output 'SCK
      8. Dat_out Alias Portb.5
      9. Config Dat_out = Output 'Daten out
      10. '-------------------------------------------------
      11. 'Austausch Subroutine in ADF4351_subroutinen.inc
      12. Shiftout_to_adf:
      13. Reset Le
      14. Waitus 10
      15. Shiftout Dat_out , Sck , Regx , 0
      16. Set Le
      17. Waitus 10
      18. 'Reset Le 'LE vom ADF4351=low, Start Übertragung Registerwert
      19. ' Waitus 10
      20. ' For I = 1 To 4 ' 4 Bytes pro Register ins ADF4351 schreiben
      21. ' Spdr = Ftw(i) ' SPI Data Register
      22. ' While Spsr.7 = 0 ' SPI Status Register, Bit 7 = SPIF kontrollieren
      23. ' ' Warte bis SPIF = 1
      24. ' Wend
      25. ' Next I
      26. ' Set Le 'LE vom ADF4351=high, Ende Übertragung Registerwert
      27. ' Waitus 50
      28. Return
      Alles anzeigen
    • History V2:
      06.07.2018 update mit Version 2-0:
      -- add sweep function
      -- change Baudrate 37k8Bd
      -- change µC to atmega168
      -- add mux out
      -- add summer

      Befehle@Terminal:
      f[XXXX.X] new frequency --> [34.5 ... 1700] MHz
      p[X] new output power --> 0=-4dBm,1=-1dBm,2=+2dBm,3=+5dBm
      s[start] [stop] [incr] [time] frequnecy sweep --> [MHz] [MHz] [MHz] [ms]
      X RESET

      Have fun ;)
      Dateien
      • image001.jpg

        (149,8 kB, 58 mal heruntergeladen, zuletzt: )
      • image002.jpg

        (168,96 kB, 63 mal heruntergeladen, zuletzt: )
      • image003.jpg

        (160,06 kB, 61 mal heruntergeladen, zuletzt: )
      • image004.jpg

        (180,87 kB, 59 mal heruntergeladen, zuletzt: )
      • BootLoader m168.bas

        (16,72 kB, 47 mal heruntergeladen, zuletzt: )
      • Ansteuerung-V2-0 ADF4351-Board.bas

        (26,23 kB, 79 mal heruntergeladen, zuletzt: )
      • Schaltplan + PCB.pdf

        (140,91 kB, 94 mal heruntergeladen, zuletzt: )
    • Dein Frequenzgenerator ist schon sehr gelungen, auch mit galvanischer Trennung hin zum PC/Laptop. :thumbsup:
      Auf youtube findet sich eine Menge Videos mit dem ADF4351, das Video übers Sweepen schränkt den Sweep-Bereich ein.

      Bei mir wächst auch ein kleiner Frequenzgenerator heran; er bedient sich eines LCD-Touch-Displays und wird von einer kleinen Powerbank betrieben.
    • Hallo Ulrich, Danke für deinen Code, das hat mir erst mal Kopfzerbrechen erspart, DANKE!



      Den Bildern nach habe ich genau das selbe ADF4351 Board wie Du. Ich habe den Code soweit abgeändert das alles bis 4,4Ghz möglich ist. Mein Specki macht biss 3,2Ghz und der ADF auch, der fällt aber biss 3,2Ghz unter -10dbm ab. Mein Frequenzzähler zeigt noch biss 3,6Ghz an, der laut Spec aber nur biss 3Ghz spezifiziert ist. Also ich denke mal das die 4,4Ghz auch raus kommen, wie gut allerdings... Bei dem Layout... schwer zu raten. :)


      Das waren jetzt aber erst mal nur die ersten schnellen Tests um zu gucken ob es überhaupt hinhaut.


      Gruß

      Ps.:
      Sorry, das Board ist das gleiche wie auf den Bildern vom 4ever!
    • Anbei ein paar Bilder meiner Generator-Kiste. Sie enthält ein Touchdisplay (vielen Dank an Hkipnik) sowie einen LiPo-Akku, den ich aus einer Powerbank mitsamt seiner Lade-und Überwachungselektronik ausgebaut habe.
      Im Display (oben links) sieht man noch die X- und Y-Koordinaten (zur Kontrolle) eines Touchpunktes, ebenso sieht man in den Tastaturfeldern auch noch die An-Touchpunkte als Rückmeldung.
      In Bild 5 erkennt man die resultierenden Einstellungen des ADF-Chips nach einem SEND-(Touch) Befehl.
      Dateien
      • Bild 1.jpg

        (379,99 kB, 33 mal heruntergeladen, zuletzt: )
      • Bild 2.jpg

        (305,16 kB, 28 mal heruntergeladen, zuletzt: )
      • Bild 3.jpg

        (328,22 kB, 22 mal heruntergeladen, zuletzt: )
      • Bild 4.jpg

        (339,86 kB, 37 mal heruntergeladen, zuletzt: )
      • Bild 5.jpg

        (469,03 kB, 33 mal heruntergeladen, zuletzt: )
    • Moin. :)


      Ich habe mich gestern noch mal verpinselt, der Code war von 4ever, Sorry, wenn ich jetzt für Verwirrung gesorgt habe.


      Also auch noch mal ein dickes DANKE an 4ever.


      Ulrich, das sieht sehr gut aus, gefällt mir. :)



      Wie ich das bei mir genau mache weiß ich noch gar nicht und ich weiß auch noch nicht ob ich das Board mit dem ADF4351 selber noch mal neu entwerfe, soweit ich jetzt mit meinen Messungen gekommen bin... Murks. :(


      Das Phasenrauschen ist weit weg von dem was im Datenblatt angegeben ist. Das kann ich aber auch nicht genauer messen da der verbaute 10Mhz Oszillator schon so wild hin und her wandert das ich mit dem Specki keine Möglichkeit habe bei 1Hz oder 3Hz Bandbreite 2 gleiche Messungen zu erhalten.


      In 3 Punkten bin ich mir schon mal sicher.
      - Der verbaute LDO wird sehr viel rauschen verursachen.
      - Die 100n Block Cs alleine reichen nicht, die sind bei 2,2-4,4Ghz schon so was von Taub.
      - Und halt der 10Mhz Oszillator.


      Deshalb werde ich jetzt erst mal Systematisch nacheinander vorgehen, die 10Mhz werde ich vom GPSDO einspeisen damit ich überhaupt erst mal messen kann. Dann den LDO ersetzen und schauen ob ich noch 10p-20p Cs parallel an die vorhanden 100n bzw. direkt so kurz wie möglich an die IC Pins gefrickelt bekomme.



      Tja, doch wieder eine Baustelle mehr die nicht auf dem Plan stand. :D