NRF52840 UWB PDoA fluctuating unexpectedly

I'm working on a project where I want to integrate AoA into the DS TWR templates provided in the DW3000 api.

My hardware is made up of the QM33120WDK1 Ultra-Wideband (UWB) Transceiver Development Kit, which has two NRF52840 boards (one AoA mounted).

I am using the AoA mounted board as the responder and the non AoA mounted board as the initiator.

This is the config I used:

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. */
3, /* 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_6M8, /* Data rate. */
DWT_PHRMODE_STD, /* PHY header mode. */
DWT_PHRRATE_STD, /* PHY header rate. */
(128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
DWT_STS_MODE_1, /* Mode 1 STS enabled */
DWT_STS_LEN_128, /* (STS length in blocks of 8) - 1*/
DWT_PDOA_M3 /* PDOA mode off */
};


After the STS quality check on response in the initiator, I print out the PDoA ad AoA values and find that despite the two boards being completely stationary, the values fluctuate.
Debugger Output:
DS TWR INIT v1.0
PDOA val = 88, Degrees = 2.461928
PDOA val = 199, Degrees = 5.567314
PDOA val = -32, Degrees = -0.895247
PDOA val = 40, Degrees = 1.119058
PDOA val = -349, Degrees = -9.763783
PDOA val = 247, Degrees = 6.910184
PDOA val = -491, Degrees = -13.736439
PDOA val = 729, Degrees = 20.394835
PDOA val = 94, Degrees = 2.629787
PDOA val = 403, Degrees = 11.274511
PDOA val = -56, Degrees = -1.566681
PDOA val = 88, Degrees = 2.461928
PDOA val = 143, Degrees = 4.000633

Main AoA Code:

   /* A frame has been received, read it into the local buffer. */
            frame_len = dwt_getframelength(0);
            if (frame_len <= sizeof(rx_buffer))
            {
                dwt_readrxdata(rx_buffer, frame_len, 0);

                /* Check that the frame is the expected response from the companion "DS TWR responder STS" example.
                 * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
                rx_buffer[ALL_MSG_SN_IDX] = 0;
                if (memcmp(rx_buffer, rx_resp_msg, ALL_MSG_COMMON_LEN) == 0)
                {
                    uint32_t final_tx_time;
                    uint64_t poll_tx_ts, resp_rx_ts, final_tx_ts;
                    int ret = DWT_ERROR;
                    
                    //Calculate AOA from the initiator
                    pdoa_val = dwt_readpdoa();
                    degrees = ((float) pdoa_val / (1<<11)) * 180 / PI; // To log corresponding degrees.
                    sprintf((char *)&pdoa_message_data, "PDOA val = %d, Degrees = %f", pdoa_val, degrees);
                    test_run_info((unsigned char *)&pdoa_message_data);



  • Hi

    Unfortunately, the nRF52840 doesn't support AoA within the Bluetooth specification, and you will have to contact Qorvo regarding an AoA solution for this board, as they provide both HW and application code for this kit and the proprietary protocol they're using. We only have software solutions for the nRF52833 and nRF5340 I'm afraid.

    Best regards,

    Simon

Related