AD9951 - Clock multiplier

  • Hallo zusammen,
    folgendes Problem beschäftigt mich gerade: Ich baue ein DDS.Modul mit dem AD9951. Die Schaltung arbeitet soweit perfekt, REFCLK ist 100MHz (externer Oszillator). Die Frequengenauigkeit liegt bei wenigen hundert Hz Abweichung vom Sollwert, soweit alles OK.

    Weil ich aber ein Ausgangssignal mit hoher Frequenz benötige, habe ich probehalber mal den internen "Clock mulitplier" aktiviert und das Taktsignal von 100MHz um den Faktor 4 erhöht. Das Ausgangssignal erscheint daraufhin mit einer Frequenzabweichung von bis zu 5% (unterhalb des Sollwertes). Die Funktion, welche die Frequenz einstellt, wurde exakt auf die Clockrate justiert, hier kann der Fehler nicht liegen.
    Hat vielleicht jemand Erfahrung mit dem AD9951 und kann zu der Beobachtung etwas beitragen?
    73 de Peter

  • Hallo,

    ohne weitere Infos zu haben .. hast du an Pin 12 die entsprechenden Bauteile angeschlossen um den Loopfilter zu kompensieren?

  • Hallo Peter,

    welche Frequenz moechtest du denn ausgeben?

    Kannst du mir CFR1 und CFR2 + FTW auslesen, bzw ein Codesnippet zur Verfuegung stellen, wo du das ganze setzt? 5% liest sich fuer mich so, als ob die PLL nicht lockt - aus dem Datenblatt erkenne ich gerade aber auch nicht, woran es haengen soll.

    Hast du CFR2[2] (VCO Range Control Bit) auch angepasst?

    Bitfehler passieren sehr leicht! Es reicht eine Verschiebung um eine Position nach rechts (Multiplier 2 statt 4), dann ist die PLL deaktiviert. Genauso, eins zu weit links, dann ist die PLL auch out of range und wird nicht locken koennen. :)

    Edit: Verwendest du wirklich einen 100MHz Clock oder einen 120MHz Oszillator? Auf dem Schema stehen 120MHz :)

  • Hallo Jan,
    ich benutze folgenden Code um den Clock-Multiplier auf den Faktor 4 zu setzen:
    void set_clock_multiplier(void)

    {

    //Start transfer to DDS
    DDSPORT &= ~(IO_UD); //IO_UD lo

    //Send CFR2
    spi_send_byte(0x01);

    //Multiply by 4
    spi_send_byte(0x00);
    spi_send_byte(0x00);
    spi_send_byte(0x20); //0x04 << 3


    //End transfer sequence
    DDSPORT |= (IO_UD); //IO_UD hi

    }

    Die Funktion spi_send_byte() funktioniert, denn die wird auch benutzt um das "Frequency word" zu setzen. Da beim Transfer "MSB first" gilt, übertrage ich erst die Bytes 23:16, dann 15:8 und zum Schluss 7:0 wobei ich das Bitmuster 0x04 um drei Bits nach links verschiebe, damit es auf den Bits 7:3 abgelegt wird.

    Des Weiteren gelingt das Umschalten des Clock_multipliers m. E., denn sonst würde das DDS nicht auf die neue Freuqenzberechnung reagieren. Bei einer Clockrate von nach wie vor 100MHz wäre die nämlich vollkommen fehl am Platze, wenn nicht mit 400MHz getaktet würde.


    Ach ja, und die Schaltung enthält einen Generator mit 120 MHz, weil die aus meinem 5-Band-TRX ist Aber sonst sind die Schaltungen identisch.

    Edit: Ich wollte 40MHz erzeugen, aber nur aus akademischen Gründen (Forscherdrang). ;)
    73 de Peter

  • Hallo Jan,

    danke für den Tipp, ich hatte das Bit "VCO range" nicht auf 1 gesetzt. Jetzt arbeitet die Schaltung wie vorgesehen!
    :D :D :D :D

    73 de Peter