Hi Lukas,

I've had success doing a TX tune at some exec_time_tx (where exec_time_tx
is time_now() + some_delay) and then tuning RX at some exec_time_rx which
is exec_time_tx + trx_offset. As long as the trx_offset is the same between
runs, you should see phase coherence. I also like to use
get_time_last_pps() instead of get_time_now() to allow this to work across
distributed nodes.

p.s. make sure you sleep the thread until after your command time to make
sure the LOs are locked.

V/r,
Mitch

On Thu, Mar 12, 2020 at 1:13 PM Lukas Haase via USRP-users <
[email protected]> wrote:

> Hi,
>
> After being able to tune RX and TX separately, I still do not get phase
> coherency.
>
> To debug, I added the following debug statements to set_tx_freq and
> set_rx_freq in uhd/host/lib/usrp/multi_usrp.cpp:
>
>     tune_result_t set_tx_freq(const tune_request_t &tune_request, size_t
> chan){
> #if 1
>         try {
>             time_spec_t now  = _tree->access<time_spec_t>(mb_root(0) /
> "time/now").get();
>             time_spec_t when = _tree->access<time_spec_t>(mb_root(0) /
> "time/cmd").get();
>             UHD_LOGGER_WARNING("MULTI_USRP") << boost::format("Tune TX at
> %d:%f for %d:%f") % now.get_full_secs() % now.get_frac_secs() %
> when.get_full_secs() % when.get_frac_secs();
>         } catch(...) {}
> #endif
>
> and for RX:
>
> #if 1
>         try
>         {
>             time_spec_t now  = _tree->access<time_spec_t>(mb_root(0) /
> "time/now").get();
>             time_spec_t when = _tree->access<time_spec_t>(mb_root(0) /
> "time/cmd").get();
>             UHD_LOGGER_WARNING("MULTI_USRP") << boost::format("Tune RX at
> %d:%f for %d:%f") % now.get_full_secs() % now.get_frac_secs() %
> when.get_full_secs() % when.get_frac_secs();
>         } catch(...){}
> #endif
>
> I use the following python code to send the timed commands from within
> gnuradio:
>
>   tune_req_rx = uhd.tune_request()
>   tune_req_rx.rf_freq_policy = uhd.tune_request.POLICY_NONE
>   tune_req_rx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
>   tune_req_rx.dsp_freq = -dsp_freq
>
>   tune_req_tx = uhd.tune_request()
>   tune_req_tx.rf_freq_policy = uhd.tune_request.POLICY_NONE
>   tune_req_tx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
>   tune_req_tx.dsp_freq = dsp_freq
>
>   exec_time = usrp_sink.get_time_now() + uhd.time_spec(1)
>   usrp_sink.set_command_time(exec_time)
>   usrp_source.set_command_time(exec_time)
>
>   res1 = usrp_source.set_center_freq(tune_req_rx, 1)
>   res2 = usrp_sink.set_center_freq(tune_req_tx)
>
>   usrp_sink.clear_command_time()
>   usrp_source.clear_command_time()
>
> As can be seen, I request the commands to be executed 1s from now. I only
> have one MBoard but two channels (X310+2xUBX160).
>
> Now when I execute this code I can see:
>
> [WARNING] [MULTI_USRP] Tune RX at 16:0.423319 for 16:0.423318
> [WARNING] [MULTI_USRP] Tune TX at 16:0.423493 for 16:0.423318
>
> It can be seen that the command time (while being the same for RX+TX) is
> NOT in the future as compared to the current time. If this is true then
> it's no surprise I don't see phase coherence (=constant phase offset for
> one dsp_freq).
>
>
> HOW ON EARTH can that be?
>
>
> Lukas
>
>
> PS: I tried adding larger time offsets but no change
>
>
>
> _______________________________________________
> USRP-users mailing list
> [email protected]
> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
>
_______________________________________________
USRP-users mailing list
[email protected]
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to