Hello,

We are experiencing a number of issues with our N300s. We would like to know if 
these are known issues and whether or not they are being addressed.

We have recently updated the filesystems, FPGA images and UHD/MPM to 3.13.1 
(currently up to date with UHD 3.13.1 release, commit 711ec8a). We are using 
our N300s in embedded mode. All software/rfnoc firmware has been previously 
tested and used on X300s and E312s.

I have uploaded a few supporting images to a google drive folder. (Link: 
https://drive.google.com/drive/folders/1b1T69G7AAA2-QlIByBYp9UQ_gs8_1253?usp=sharing)


1) GPSDO Locking and Synchronization:

- The time to obtain and GPS lock, even when outside is long and often 
unstable. Code used to query GPSDO lock:

> uhd::property_tree::sptr tree = _usrp->get_tree();
> uhd::fs_path path;
> std::vector mboard_names = tree->list("/mboards");
> path = "/mboards/" + mboard_names[0];
> try {
> path = "/mboards/" + mboard_names[0];
> try {
>  tree->access(path / "sensors" / "gps_locked").get().value;
> } catch (std::exception &) {
> } catch (std::exception &) {
>  std::cerr << "Error: No response from GPSDO" << std::endl;
>  return false;
> }
> //Check for GPS lock
> uhd::sensor_value_t gps_locked = tree->access(path / "sensors" / 
> "gps_locked").get();
> return(gps_locked.to_bool());
> }

This is a printout of the N300 sensor values when GPSDO is in a non-locked 
state:
> ----------------- Sensors -----------------
> Clock Source: gpsdo
> Time Source: gpsdo
> ref_locked: true
> gps_locked: false
> gps_time: 1548206414
> gps_tpv: {"ept": 0.0050000000000000001, "speed": 3.7040000000000002, "epv": 
> 73.599999999999994, "device": "/dev/ttyPS1", "eps": 141.21000000000001, 
> "lon": -118.169881667, "epy": 109.009, "epx": 101.339, "alt": 
> 367.69999999999999, "lat": 34.200626667000002, "class": "TPV", "epc": 92.0, 
> "track": 318.0, "time": "2019-01-23T01:20:14.000Z", "mode": 3, "climb": 
> 32.200000000000003}
> gps_sky: {"hdop": 9.3000000000000007, "class": "SKY", "device": 
> "/dev/ttyPS1", "pdop": 9.8000000000000007, "vdop": 3.2000000000000002, 
> "ydop": 7.2699999999999996, "tdop": 3.6200000000000001, "gdop": 11.09, 
> "satellites": [{"PRN": 30, "az": 53, "el": 71, "ss": 26, "used": false}, 
> {"PRN": 28, "az": 327, "el": 67, "ss": 0, "used": false}, {"PRN": 135, "az": 
> 205, "el": 47, "ss": 34, "used": false}, {"PRN": 7, "az": 101, "el": 44, 
> "ss": 33, "used": true}, {"PRN": 17, "az": 188, "el": 44, "ss": 32, "used": 
> true}, {"PRN": 13, "az": 308, "el": 38, "ss": 0, "used": false}, {"PRN": 11, 
> "az": 80, "el": 32, "ss": 34, "used": true}, {"PRN": 1, "az": 99, "el": 17, 
> "ss": 27, "used": false}, {"PRN": 19, "az": 199, "el": 17, "ss": 28, "used": 
> true}, {"PRN": 18, "az": 70, "el": 14, "ss": 28, "used": true}, {"PRN": 8, 
> "az": 39, "el": 11, "ss": 0, "used": false}, {"PRN": 9, "az": 164, "el": 10, 
> "ss": 27, "used": false}, {"PRN": 15, "az": 321, "el": 7, "ss": 0, "used": 
> false}, {"PRN": 5, "az": 255, "el": 4, "ss": 0, "used": false}], "xdop": 
> 6.7599999999999998}
> fan: 4320
> temp: 42.0

This is a printout of the N300 sensor values when GPSDO is in a locked state:

> ----------------- Sensors -----------------
> Clock Source: gpsdo
> Time Source: gpsdo
> ref_locked: true
> gps_locked: true
> gps_time: 1548215759
> gps_tpv: {"lat": 34.200188333, "class": "TPV", "speed": 0.0, "device": 
> "/dev/ttyPS1", "epv": 112.7, "ept": 0.0050000000000000001, "alt": 
> 341.10000000000002, "mode": 3, "time": "2019-01-23T03:55:57.000Z", "climb": 
> 0.69999999999999996, "lon": -118.169401667, "epc": 225.40000000000001, 
> "track": 148.09999999999999}
> gps_sky: {"hdop": 3.2999999999999998, "class": "SKY", "satellites": [{"used": 
> false, "el": 80, "az": 318, "PRN": 19, "ss": 12}, {"used": false, "el": 58, 
> "az": 32, "PRN": 17, "ss": 13}, {"used": true, "el": 49, "az": 199, "PRN": 
> 133, "ss": 35}, {"used": false, "el": 47, "az": 205, "PRN": 135, "ss": 31}, 
> {"used": true, "el": 42, "az": 159, "PRN": 6, "ss": 31}, {"used": false, 
> "el": 36, "az": 311, "PRN": 24, "ss": 0}, {"used": true, "el": 35, "az": 75, 
> "PRN": 28, "ss": 29}, {"used": true, "el": 24, "az": 221, "PRN": 13, "ss": 
> 32}, {"used": false, "el": 19, "az": 258, "PRN": 15, "ss": 17}, {"used": 
> false, "el": 17, "az": 189, "PRN": 2, "ss": 23}, {"used": false, "el": 16, 
> "az": 146, "PRN": 30, "ss": 21}, {"used": false, "el": 8, "az": 290, "PRN": 
> 12, "ss": 15}, {"used": false, "el": 5, "az": 35, "PRN": 1, "ss": 0}], 
> "vdop": 4.9000000000000004, "device": "/dev/ttyPS1", "pdop": 
> 5.9000000000000004}
> fan: 4320
> temp: 38.0

We note that in the ‘unlocked’ state, based on the gps_sky and gps_tpv reports, 
there are actually more satellites being used for the position calculation 
(‘used’ set to ‘true’). Additionally, the signal strengths (’ss’) in general 
are as good, if not better, than those in the ‘locked’ state.

This is a consistent problem across multiple N300s. In some cases, gps_locked 
is not being asserted for hours despite good signal reception.

2) GPSDO/GPS PPS drifts in both ‘gps_locked=true’ and ‘gps_locked=false’ states 
significantly.

We have setup 2 N300s with RX/TX channels cross connected in a bistatic 
loopback to test GPSDO synchronization.

N300 A: TX0 -> N300 B: RX0
N300 B: TX0 -> N300 A: RX0

We transmit 100MHz LFM chirps and plot the autocorrelation peak as a function 
of time (X axis is ‘Free space range’). The TX/RX is ‘triggered’ by the every 
second by GPS PPS. The result is the same whether or not the individual N300s 
report as being locked to gps: Over 20 seconds, the relative drift is .5 us. 
Orders of magnitude worse than what the jackson labs GPSDO should be capable 
of. (See n300_bistatic_gpsdo_drift_plot.png)

For reference, we have attached plots of relative 50MHz LFM chirp waveform 
autocorrelation peak drift obtained using similar software, environment and 
setup but with two E312s: The relative peak drift is contained to ~+-10ns using 
the PLL locked to the GPS pps signal, as expected. (See sync_pps_drift_e312.png)

The code that performs the pps clock synchronization is:
> uhd::property_tree::sptr tree = _usrp->get_tree();
> uhd::fs_path path;
> std::vector<std::string> mboard_names = tree->list("/mboards");
> path = "/mboards/" + mboard_names[0];
> double rate = _radio_ctrl->get_rate();
> double time_set = 0;
>
> std::vector<std::string> sensor_names = tree->list(path / "sensors");
> int gps_time=0;
> if(std::find(sensor_names.begin(), sensor_names.end(), "gps_time") != 
> sensor_names.end()) {
>     gps_time = tree->access<uhd::sensor_value_t>(path / "sensors" / 
> "gps_time").get().to_int();
> }
> else if(std::find(sensor_names.begin(), sensor_names.end(), 
> "get_gps_time_sensor") != sensor_names.end()) {
>     try{
>         gps_time = tree->access<uhd::sensor_value_t>(path / "sensors" / 
> "get_gps_time_sensor").get().to_int();
>     }
>     catch (std::exception &e) {
>         std::cerr<<“Error: caught exception while accessing 
> get_gps_time_sensor: "<<e.what()<<std::endl;
>         return -1;
>     }
> }
> else{
>     std::cerr<< "Error: gps_time sensor field not found"<<std::endl;
>     return -1;
> }
> uint64_t last_pps = _radio_ctrl->get_time_last_pps().to_ticks(rate);
> uint64_t curr_pps = last_pps;
> while (curr_pps ==last_pps){
>     curr_pps = _radio_ctrl->get_time_last_pps().to_ticks(rate);
>     boost::this_thread::sleep(boost::posix_time::milliseconds(20));
> }
> double gps_time_next_d = (double)gps_time+2.0;
> uhd::time_spec_t new_gps_time = uhd::time_spec_t(gps_time_next_d);
> _radio_ctrl->set_time_next_pps(new_gps_time);
> time_set = gps_time_next_d;
> return 0;

3) Spectrum asymmetry for TX gain >= 35 dB.
- When the TX gain of the N300 is >=35 dB, the spectrum becomes asymmetric 
w/r/t DC. This is true for LFM chirp waveforms of any bandwidth and with zeros 
pre-appended. Here we have configured a single N300 in external loopback:

N300 A: TX0 -> N300 A: RX0

 We've attached plots of 100MHz and 25MHz bandwidth chirp spectra. Reducing TX 
gain to 34.5 dB solves this and the spectrum looks normal. We have 30dB 
attenuators in all paths and are far from receiver saturation. This problem is 
consistent for both channels across multiple N300s. Plots show the spectrum of 
the RX waveform as well as the expected waveform spectrum.  (See 
n300_chirp100mhz_trim.png, n300_chirp25mhz_trim.png)

4) Randomly appearing impulse with magnitude ~255 at multiples of 2048 samples.
- An impulse will appear in the time domain RX signal randomly, but often, at 
multiples of 2048 samples. Again, this behavior is seen on multiple N300s. I've 
included plots of the RX signal, when only noise is present (no TX). (See 
spp_impulse_two.png, spp_edge_impulse_zoom.png).

5) MPM Speed and Performance
- In general MPM and operations (frequency tuning, streaming, etc) and 
communication with the N300s in embedded mode is slow compared to E312's. With 
identical pulsed waveform sample lengths, algorithms and pulsed streaming 
operations that run smoothly on the E312 cause late stream commands and need to 
be throttled to run on the N300.

6) Complete phase incoherence for tuning frequencies <300MHz
- Within a single tuning, the low frequency/low band conversion path of the 
N300 seems to be unstable. The phase varies rapidly with time making the 
<300MHz band completely unusable. We have not completely characterized the 
statistics of this phase incoherence, but for a time-coherent/timed TX/RX 
pulsed waveform loopback on a single N300 the phase seems to be random from 
pulse to pulse.

If anyone is able to provide insight to these issues, it would be greatly 
appreciated. We are happy to provide additional details about the problems we 
are seeing.

Thanks,

Sam

_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to