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
