Hi,
I have been testing Channel Sounding precision and am experiencing difficulty achieving stable ranging results. Regardless of the configuration changes I make, the ranging measurements remain highly susceptible to interference, and the accuracy is rarely better than 0.5 m.
Are there any additional configuration options I can adjust to improve the ranging accuracy? Would any code changes help improve the stability or precision of the measurements?
I have included the relevant configuration files and a small snippet of the changes I made to main.c below.
Hardware setup:
- Initiator: nRF54L15 DK
- Reflector: nRF54L15 Tag
prj.conf for ras_initiator
# # Copyright (c) 2024 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # CONFIG_NCS_SAMPLES_DEFAULTS=y CONFIG_DK_LIBRARY=y CONFIG_BT=y CONFIG_BT_SMP=y CONFIG_BT_CENTRAL=y CONFIG_BT_MAX_CONN=1 CONFIG_BT_BONDABLE=n CONFIG_BT_GATT_CLIENT=y CONFIG_BT_GATT_DYNAMIC_DB=y CONFIG_BT_CHANNEL_SOUNDING=y CONFIG_BT_RAS=y CONFIG_BT_RAS_RREQ=y CONFIG_BT_SCAN=y CONFIG_BT_SCAN_FILTER_ENABLE=y CONFIG_BT_SCAN_UUID_CNT=1 # The Ranging Profile recommends a MTU of at least 247 octets. CONFIG_BT_L2CAP_TX_MTU=498 CONFIG_BT_BUF_ACL_TX_SIZE=502 CONFIG_BT_BUF_ACL_RX_SIZE=502 CONFIG_BT_ATT_PREPARE_COUNT=3 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 # This reduces RAM usage. Additional RAM is needed to support optional # features such as multiantenna. Change or remove these if using those features CONFIG_BT_RAS_MAX_ANTENNA_PATHS=4 CONFIG_BT_CS_DE_MAX_NUM_ANTENNA_PATHS=4 CONFIG_BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=4 CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1 CONFIG_BT_CTLR_SDC_CS_ROLE_INITIATOR_ONLY=y CONFIG_BT_RAS_MODE_3_SUPPORTED=y CONFIG_BT_CTLR_SDC_CS_STEP_MODE3=y CONFIG_BT_CTLR_SDC_CS_BOARD_DISTANCE_OFFSET=100 CONFIG_BT_CTLR_SDC_CS_T_PM_LEN_40_US=y CONFIG_SAMPLE_RAS_INITIATOR_STEP_MODE_3=y # Disabling the CS Test command reduces flash usage CONFIG_BT_CTLR_CHANNEL_SOUNDING_TEST=n # This allows CS and ACL to use different PHYs CONFIG_BT_TRANSMIT_POWER_CONTROL=y # This improves the performance of floating-point operations CONFIG_FPU=y CONFIG_FPU_SHARING=y CONFIG_CBPRINTF_FP_SUPPORT=y CONFIG_BT_CS_DE=y CONFIG_BT_CS_DE_1024_NFFT=y CONFIG_LOG=y CONFIG_LOG_DEFAULT_LEVEL=3 CONFIG_LOG_PRINTK=y CONFIG_LOG_BUFFER_SIZE=8192 # SEGGER RTT console + log backend. CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=n CONFIG_LOG_BACKEND_RTT=y
prj.conf for ras_reflector
# # Copyright (c) 2024 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # CONFIG_NCS_SAMPLES_DEFAULTS=y CONFIG_DK_LIBRARY=y CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_SMP=y CONFIG_BT_DEVICE_NAME="Nordic CS Reflector" CONFIG_BT_MAX_CONN=1 CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n CONFIG_BT_BONDABLE=n # The Ranging Profile recommends a MTU of at least 247 octets. CONFIG_BT_L2CAP_TX_MTU=498 CONFIG_BT_BUF_ACL_TX_SIZE=502 CONFIG_BT_BUF_ACL_RX_SIZE=502 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 CONFIG_BT_CTLR_PHY_2M=y # This reduces RAM usage. Additional RAM is needed to support optional # features such as multiantenna. Change or remove these if using those features CONFIG_BT_RAS_MAX_ANTENNA_PATHS=4 CONFIG_BT_CS_DE_MAX_NUM_ANTENNA_PATHS=4 CONFIG_BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=4 CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=2 CONFIG_BT_CTLR_SDC_CS_ROLE_REFLECTOR_ONLY=y # Required for Mode 3 CS procedures CONFIG_BT_RAS_MODE_3_SUPPORTED=y CONFIG_BT_CTLR_SDC_CS_STEP_MODE3=y # Disabling the CS Test command reduces flash usage CONFIG_BT_CTLR_CHANNEL_SOUNDING_TEST=n # This allows CS and ACL to use different PHYs CONFIG_BT_TRANSMIT_POWER_CONTROL=y # Let the initiating device control the PHY updates CONFIG_BT_AUTO_PHY_UPDATE=n CONFIG_BT_CHANNEL_SOUNDING=y CONFIG_BT_RAS=y CONFIG_BT_RAS_RRSP=y CONFIG_LOG=y CONFIG_LOG_DEFAULT_LEVEL=3 CONFIG_LOG_PRINTK=y CONFIG_LOG_BUFFER_SIZE=8192 # SEGGER RTT console + log backend. CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=n CONFIG_LOG_BACKEND_RTT=y
diff from main.c ras_initiator
#line ~955 in the ras_initiator main.c
const struct bt_le_cs_set_procedure_parameters_param procedure_params = {
.config_id = CS_CONFIG_ID,
.max_procedure_len = desired_max_procedure_length,
.min_procedure_interval = desired_procedure_interval,
.max_procedure_interval = desired_procedure_interval,
.max_procedure_count = 0,
.min_subevent_len = 16000,
.max_subevent_len = 16000,
--- .tone_antenna_config_selection = BT_LE_CS_TONE_ANTENNA_CONFIGURATION_A1_B1
+++ .tone_antenna_config_selection = BT_LE_CS_TONE_ANTENNA_CONFIGURATION_A1_B2,
.phy = BT_LE_CS_PROCEDURE_PHY_2M,
.tx_power_delta = 0x80,
--- .preferred_peer_antenna = BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_1,
+++ .preferred_peer_antenna = BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_1 |
BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_2,
.snr_control_initiator = BT_LE_CS_SNR_CONTROL_NOT_USED,
.snr_control_reflector = BT_LE_CS_SNR_CONTROL_NOT_USED,
};
nRF Connect SDK version: 3.4.0 (LTS)
Toolchain version: Zephyr SDK 1.0.1, GCC 14.3.0
Target boards: nRF54L15 DK and nRF54L15 Tag
Sample: Bluetooth Channel Sounding RAS initiator/reflector
West version: 1.5.0
Any guidance on recommended settings, antenna configuration, interference mitigation, or measurement filtering would be greatly appreciated.
Best regards,
Nikola Horvat