Hello everyone,

I am trying to sweep through a range of frequencies from 1.475 GHz to 4.275 GHz in one experiment. At the moment I can go from +-200 MHz of 2.875 GHz (so I am able to get frequencies between 2.675 GHz to 3.075 GHz with the set_duc_frequency() function), and an additional +-10 MHz from the set_frequency() function in the oscillator class.

From a previous post I made some time ago, I learned that I can change the base frequency or f_trf, by changing the tx_div_sel parameter to either 0-3 in the device_db.py file. I have the upconverter variant and originally, my base is 2.875 GHz, so when I changed the tx_div_sel to either 1 to 3, the base frequency changes to 1437.5, 718.75, 359.375 MHz respectively.

However, when I measure the frequency coming out of the phaser board when I changed the tx_div_sel to either 1 to 3, the base frequency doesn't change from 2.875 GHz until I restart my artiq_master/dashboard. Additionally, when I change the output frequency with set_duc_frequency(), the highest frequency I can get is 2.875 GHz+210 MHz, which is not enough to get to the 4.275 GHz I need.

Is there a way to sweep through 1.475 GHz to 4.275 GHz in one experiment? The frequency step size I plan to use is probably 1 to 20 MHz.

I've been reading the trf372017 datasheet and I see that the register with tx_div_sel is Register 6, bit24, and was thinking of using the trf_write() and trf_read() functions under the Phaser channel class. Would this be the work around instead of modifying the device_db.py file? If so, the other issue still stands, where I am not sure how to get all the frequencies in between 1.475 GHz to 4.275 GHz.

Thanks

    11 days later

    jqt3
    Yes, the only way to sweep such a large range within an experiment is to directly write to the TRF registers.
    However, a lot more parameters need to be changed: pll_div_sel, rdiv, nint, prsc_sel, etc. Section 7.3.2 of the TRF datasheet provides some examples of how to set the TRF output range.
    We use the upconverter at low frequency (80 MHz) range, so my suggestions might be different for you, but my experience was that a lot of parameters need to be played with, e.g. tx_div_bias & lo_div_bias, to really make the output happy. Without those changes, you won't get the right amount of power where you want it and there'll be spurs everywhere.
    I don't recall ever finding any helpful guides that issue step by step instructions, and the vibe I got was that figuring out the TRF can only be done by playing with it and using some black magic; the issues section on the sinara phaser github was the closest I got to a guide.
    One important note: there's going to be a lot of spurs in the output spectrum, especially since you require such a large range (e.g. use at 1.475 GHz will cause spurs at 3.6 GHz, and vice versa). You may have to look into tunable filters or come up with a jank solution.

      2 months later

      Hi @claytonho thanks for your response - I was able to figure out how to calculate the parameters to output whatever frequency I like.

      6 days later

      claytonho When writing to the registers, are there any other parameters besides lo_div_sel, pll_div_sel, rdiv, nint, prsc_sel, and tx_div_sel that we have to change? I was able to successfully change the output frequency by setting those 6 values in the device_db.py file, but when I tried the same thing but using the trf_write() function, I don't get the same output.
      For instance, when I wanted to change the output frequency to 1655 MHz, I had these settings in my device_db.py, which worked:

      "trf0": {
          "lo_div_sel": 0b01,
          "pll_div_sel": 0b01,
          "rdiv": 25,
          "nint": 331,
          "prsc_sel": 1,
          "tx_div_sel": 0b01
      }

      But when using the trf_write() function, and using those same parameter values to output 1655 MHz, I get an output of 1.22 GHz instead. As of now I only write to trf registers 1, 2, and 6.