How to extend range on DWM3000?

I’m currently trying to extend the range on my DWM3000. I tested the capability and it seems to be comfortable only up to ~20-30m, while I am looking for ~50m. So, I attempted to change the data rate to 850 KB/s to increase the range, but cannot seem to get it working. I assumed this was because of longer timeouts, but extending those did not seem to fix it. Any advice? Direction would be much appreciated.

Settings:

static dwt_config_t config = {
      5,                /* Channel number. */
      DWT_PLEN_128,     /* Preamble length. Used in TX only. */
      DWT_PAC8,         /* Preamble acquisition chunk size. Used in RX only. */
      9,                /* TX preamble code. Used in TX only. */
      9,                /* RX preamble code. Used in RX only. */
      1,                /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 symbol, 2 for non-standard 16 symbol SFD and 3 for 4z 8 symbol SDF type */
	  DWT_BR_850K,		/* Data rate (TEST). */
      DWT_PHRMODE_STD,  /* PHY header mode. */
      DWT_PHRRATE_STD,  /* PHY header rate. */
      (129 + 8 - 8),    /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
      DWT_STS_MODE_OFF, /* STS disabled */
      DWT_STS_LEN_64,   /* STS length see allowed values in Enum dwt_sts_lengths_e */
      DWT_PDOA_M0       /* PDOA mode off */
};

//Timeouts:
#define POLL_RX_TO_RESP_TX_DLY_UUS  5000   // 5 ms
#define RESP_TX_TO_FINAL_RX_DLY_UUS 5000   // 5 ms
#define POLL_TX_TO_RESP_RX_DLY_UUS  5000
#define RESP_RX_TO_FINAL_TX_DLY_UUS 5000

#define RESP_RX_TIMEOUT_UUS 10000  // 10 ms
#define FINAL_RX_TIMEOUT_UUS 10000 // 10 ms
#define UWB_RESP_TIMEOUT_MAX 10000  

//Original timeouts (using 6M8 data rate):
#define POLL_TX_TO_RESP_RX_DLY_UUS (300 + CPU_PROCESSING_TIME)
#define RESP_RX_TO_FINAL_TX_DLY_UUS (300 + CPU_PROCESSING_TIME)
#define RESP_RX_TIMEOUT_UUS 300
#define POLL_RX_TO_RESP_TX_DLY_UUS 900
#define RESP_TX_TO_FINAL_RX_DLY_UUS 500
#define FINAL_RX_TIMEOUT_UUS 220

Maybe try to use a longer preamble length and see if it helps, for example from 128 to 2048 DWT_PLEN_128

Using the non-standard 16 bit SFD can also give range benefits over the 8 bit version.

As for why it’s not working at all… Forgetting to change the timeouts is the normal reason people hit issues with this and you look to have remembered to do that.
Try playing with the timeout values. Rather than setting them all to the same values multiply the existing values by 8 (6.8 Mbit/s / 850 kbit/s)

I am assuming that in your code the original values are commented out rather than still being in there after the new ones as you posted above. :slight_smile:

Hi @TrainingRain ,

You can try using 850 kbps to improve the receiver sensitivity (for more information, please refer to Section 3.4 of the DW3000). However, this would also increase your frame duration and average transmitted power level. That means, you would need to decrease your Tx power level to remain regulatory compliant (-41.3 dBm/MHz). So when you do the math, the sensitivity improvement is compensated for by the increased frame duration, and therefore, there isn’t much improvement in the max range at the end.

If you still want to give this a try, you can use the frame properties for the low data rate in DW3000 Datasheet Section 3.4.

There are some other ways to improve the max range, such as using an external LNA ( QM14068 ). It can improve the receiver sensitivity significantly, and you can reach your max range requirement with the 6.8 Mbps data rate.

Kind regards,
Emre