Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
DW1000Utils.h
00001 #pragma once 00002 00003 #include <mbed.h> 00004 #include "DW1000.h" 00005 00006 class DW1000Utils 00007 { 00008 public: 00009 // Recommended settings: 00010 // Data rate 110 kbps - Preamble length 2048 or 4096. 00011 // Data rate 850 kbps - Preamble length 256, 512 or 1024. 00012 // Data rate 6.8 Mbps - Preamble length 64. 00013 00014 const static uint32_t PREAMBLE_LENGTH_64 = (1 << 18); 00015 const static uint32_t PREAMBLE_LENGTH_128 = (1 << 18) | (1 << 20); 00016 const static uint32_t PREAMBLE_LENGTH_256 = (1 << 18) | (1 << 21); 00017 const static uint32_t PREAMBLE_LENGTH_512 = (1 << 18) | (1 << 20) | (1 << 21); 00018 const static uint32_t PREAMBLE_LENGTH_1024 = (1 << 19); 00019 const static uint32_t PREAMBLE_LENGTH_2048 = (1 << 19) | (1 << 21); 00020 const static uint32_t PREAMBLE_LENGTH_4096 = (1 << 18) | (1 << 19); 00021 00022 enum PrfSetting 00023 { 00024 PRF_16_MHz = 1, 00025 PRF_64_MHz, 00026 }; 00027 00028 enum DataRateSetting 00029 { 00030 RATE_110_kbps = 1, 00031 RATE_850_kbps, 00032 RATE_6_8_Mbps, 00033 }; 00034 00035 // Set pulse repetition frequency 00036 static void setPulseRepetitionFrequency(DW1000* dw_ptr, PrfSetting prf_setting) 00037 { 00038 // Transmit PRF setting (see page 75 of user manual) 00039 uint32_t prf_value; 00040 if (prf_setting == PRF_16_MHz) 00041 { 00042 prf_value = (1 << 16); 00043 } 00044 else 00045 { 00046 prf_value = (1 << 17); 00047 } 00048 uint32_t prf_mask = (1 << 16) | (1 << 17); 00049 uint32_t tx_ctrl = dw_ptr->readRegister32(DW1000_TX_FCTRL, 0x00); 00050 tx_ctrl &= ~prf_mask; 00051 tx_ctrl |= (prf_value & prf_mask); 00052 dw_ptr->writeRegister32(DW1000_TX_FCTRL, 0x00, tx_ctrl); 00053 00054 // Receive PRF setting (see page 109 and of user manual) 00055 if (prf_setting == PRF_16_MHz) 00056 { 00057 prf_value = (1 << 18); 00058 } 00059 else 00060 { 00061 prf_value = (1 << 19); 00062 } 00063 prf_mask = (1 << 18) | (1 << 19); 00064 uint32_t chan_ctrl = dw_ptr->readRegister32(DW1000_CHAN_CTRL, 0x00); 00065 chan_ctrl &= ~prf_mask; 00066 chan_ctrl |= (prf_value & prf_mask); 00067 dw_ptr->writeRegister32(DW1000_CHAN_CTRL, 0x00, chan_ctrl); 00068 } 00069 00070 // Set preamble length (see page 76 of user manual) 00071 static void setPreambleLength(DW1000* dw_ptr, uint32_t preamble_setting) 00072 { 00073 uint32_t preamble_mask = (1 << 18) | (1 << 19) | (1 << 20) | (1 << 21); 00074 uint32_t tx_ctrl = dw_ptr->readRegister32(DW1000_TX_FCTRL, 0x00); 00075 tx_ctrl &= ~preamble_mask; 00076 tx_ctrl |= (preamble_setting & preamble_mask); 00077 dw_ptr->writeRegister32(DW1000_TX_FCTRL, 0x00, tx_ctrl); 00078 } 00079 00080 // Set data rate 00081 static void setDataRate(DW1000* dw_ptr, DataRateSetting rate_setting) 00082 { 00083 // Transmit data rate (see page 73 of user manual) 00084 uint32_t rate_value; 00085 if (rate_setting == RATE_110_kbps) 00086 { 00087 rate_value = 0; 00088 } 00089 else if (rate_setting == RATE_850_kbps) 00090 { 00091 rate_value = (1 << 13); 00092 } 00093 else 00094 { 00095 rate_value = (1 << 14); 00096 } 00097 uint32_t rate_mask = (1 << 13) | (1 << 14); 00098 uint32_t tx_ctrl = dw_ptr->readRegister32(DW1000_TX_FCTRL, 0x00); 00099 tx_ctrl &= ~rate_mask; 00100 tx_ctrl |= (rate_value & rate_mask); 00101 dw_ptr->writeRegister32(DW1000_TX_FCTRL, 0x00, tx_ctrl); 00102 00103 // Receive data rate (see page 72 of user manual) 00104 if (rate_setting == RATE_110_kbps) 00105 { 00106 rate_value = (1 << 18); 00107 rate_value = (1 << 22); 00108 } 00109 else if (rate_setting == RATE_850_kbps) 00110 { 00111 rate_value = (1 << 18); 00112 } 00113 else 00114 { 00115 rate_value = 0; 00116 } 00117 rate_mask = (1 << 18) | (1 << 22); 00118 uint32_t sys_cfg = dw_ptr->readRegister32(DW1000_SYS_CFG, 0x00); 00119 sys_cfg &= ~rate_mask; 00120 sys_cfg |= (rate_value & rate_mask); 00121 dw_ptr->writeRegister32(DW1000_SYS_CFG, 0x00, sys_cfg); 00122 00123 if (rate_setting == RATE_110_kbps) 00124 { 00125 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x02, 0x000A); // DRX_TUNE0b for 110 kbps 00126 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x06, 0x0064); // DRX_TUNE1b for 110 kbps & > 1024 symbols 00127 } 00128 else if (rate_setting == RATE_850_kbps) 00129 { 00130 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x02, 0x0001); // DRX_TUNE0b for 850 kbps 00131 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x06, 0x0020); // DRX_TUNE1b for 850 kbps & 128 - 1024 symbols 00132 } 00133 else 00134 { 00135 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x02, 0x0001); // DRX_TUNE0b for 6.8 Mbps 00136 dw_ptr->writeRegister16(DW1000_DRX_CONF, 0x06, 0x0010); // DRX_TUNE1b for 6.8 Mbps & 64 symbols 00137 } 00138 } 00139 00140 // Improved settings for direct path detection in non-line-of-sight environments. 00141 // See DecaWave Application Note APS006. 00142 static void setNLOSSettings(DW1000* dw_ptr, DataRateSetting rate_setting = RATE_850_kbps, PrfSetting prf_setting = PRF_16_MHz, uint32_t preamble_setting = PREAMBLE_LENGTH_1024) 00143 { 00144 setDataRate(dw_ptr, rate_setting); 00145 setPulseRepetitionFrequency(dw_ptr, prf_setting); 00146 setPreambleLength(dw_ptr, preamble_setting); 00147 00148 // Setting for Noise Threshold Multiplier 1 00149 dw_ptr->writeRegister8(DW1000_LDE_CTRL, 0x0806, 0x07); // LDE_CFG1 00150 // Setting for Noise Threshold Multiplier 2 00151 if (prf_setting == PRF_16_MHz) 00152 { 00153 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x0003); // LDE_CFG2 for 16 MHz PRF 00154 } 00155 else 00156 { 00157 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1603); // LDE_CFG2 for 64 MHz PRF 00158 } 00159 } 00160 00161 // Default settings for line-of-sight environments 00162 static void setLOSSettings(DW1000* dw_ptr, DataRateSetting rate_setting = RATE_850_kbps, PrfSetting prf_setting = PRF_16_MHz, uint32_t preamble_setting = PREAMBLE_LENGTH_1024) 00163 { 00164 setDataRate(dw_ptr, rate_setting); 00165 setPulseRepetitionFrequency(dw_ptr, prf_setting); 00166 setPreambleLength(dw_ptr, preamble_setting); 00167 00168 // Setting for Noise Threshold Multiplier 1 00169 dw_ptr->writeRegister8(DW1000_LDE_CTRL, 0x0806, 0x0c); // LDE_CFG1 00170 // dw_ptr->writeRegister8(DW1000_LDE_CTRL, 0x0806, 0x0d); // LDE_CFG1 00171 // Setting for Noise Threshold Multiplier 2 00172 if (prf_setting == PRF_16_MHz) 00173 { 00174 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x1607); // LDE_CFG2 for 16 MHz PRF 00175 } 00176 else 00177 { 00178 dw_ptr->writeRegister16(DW1000_LDE_CTRL, 0x1806, 0x0607); // LDE_CFG2 for 64 MHz PRF 00179 } 00180 } 00181 };
Generated on Mon Jul 18 2022 09:33:46 by
1.7.2