We are having another issues with our TwinRXs. A co-worker has been trying to
get this to work for a while, but has had no luck with the PPS timing. Here is
the notes:
We are running UHD_3.14.1.HEAD-12-g5f75f73f.
The setup is a single X310 (revision: 11, revision_compat: 7) with two TwinRX
boards. The device gets Ref/PPS from an Octoclock.
The attached script has a hard-coded IP address and clock rate. It works for
other X310s with UBX/SBX daughter boards as well as the E320.
Good results are (note line 5 below):
Synchronizing Radios to Reference Signals
Checking PPS synchronization
next_pps from 1569851984.633563 is 1569851985.000000
Setting time for radio `gr uhd usrp source`: 2019-09-30 09:59:45
PPS alignment PASSED!: [1569851986.0, 1569851986]
All radios are Synchronized
Bad results are:
Synchronizing Radios to Reference Signals
Checking PPS synchronization
next_pps from 1569851508.136703 is 1569851509.000000
Setting time for radio `gr uhd usrp source`: 2019-09-30 09:51:49
PPS alignment mismatch: [1569851509.9999995, 1569851509]
Any thoughts of why this might be happening?
#!/usr/bin/env python2
from gnuradio import uhd
import time
import sys
import math
from datetime import datetime
MAX_ATTEMPTS = 5
ADDR = '192.168.10.2'
CLKRATE = 200e6
# make sure we start the time reset iterations on the PPS Edge
def get_pps_edge(usrp):
last_pps_time = usrp.get_time_last_pps()
while last_pps_time == usrp.get_time_last_pps():
pass
#### START #####
try:
usrp = uhd.usrp_source('addr=' + ADDR,
uhd.stream_args(cpu_format='sc16',
channels=range(1)))
except Exception as e:
print str(e)
sys.exit()
# get external clock
try:
usrp.set_clock_source('external', 0)
except RuntimeError:
print "Radio " + ADDR + " is not seeing 10 MHz clock"
sys.exit()
# configure the usrp
usrp.set_clock_rate(CLKRATE, uhd.ALL_MBOARDS)
# check lock to 10 MHz reference signal
print "Synchronizing Radios to Reference Signals"
attempts = 0
ref_locked = ["not_queried_yet"]
while ref_locked != [" locked"]:
ref_locked[0] = str(usrp.get_mboard_sensor("ref_locked", 0)).split(':')[-1]
attempts += 1
if attempts >= MAX_ATTEMPTS:
print 'Unable to achieve ref lock. Exiting...'
sys.exit()
# check PPS synchronization
print "Checking PPS synchronization"
passed_test = False
attempts = 0
while not passed_test:
# re-align all radios
get_pps_edge(usrp)
# get far away from the "top of a second" so all clock sources will be on the same full second
time.sleep(.4)
time_real = time.time() # system time should be synced with GPS time
#Round up to the next whole second
next_pps = math.ceil(time_real)
print 'next_pps from %f is %f' % (time_real, next_pps)
# set_time_next_pps is non-blocking, so set all radios immediately after finding an edge
print 'Setting time for radio `{}`: {}'.format(
usrp.name(), datetime.fromtimestamp(next_pps))
usrp.set_time_next_pps(uhd.time_spec_t(next_pps))
# sleep through one pps edge so time is set correctly on all USRPs
time.sleep(1)
# check if the pps is correct for all radios
get_pps_edge(usrp)
# get pps for each radio
last_pps = []
last_pps.append(usrp.get_time_last_pps().get_real_secs())
last_pps.append(int(time.time()))
# compare pps for each radio
if last_pps and last_pps.count(last_pps[0]) != len(last_pps):
print "PPS alignment mismatch: {}".format(last_pps)
passed_test = False
else:
print "PPS alignment PASSED!: {}".format(last_pps)
passed_test = True
attempts += 1
if attempts >= MAX_ATTEMPTS:
print 'Failed to synchronize radios after %d attempts' % MAX_ATTEMPTS
print 'Exiting...'
sys.exit()
print "All radios are Synchronized"
_______________________________________________
USRP-users mailing list
[email protected]
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com