Hi,
I’m developing TDoA (OWR) system using with DW1000.
I’m doing a basic operation test to do this.
The test is like below.
Anchor#0 : Delayed TX in every 1000ms
Anchor#1 : Immediate RX in whole time.
Anchor#0 sends a packet in every 1000ms(1sec) with DW1000’s delayed TX function like below.
Source code is like below.
:
:
u64TxTime = get_tx_timestamp_u64() + convertmicrosectodevicetimeu((double)(TEST_DW1000_DELAY_TIME_US));
u64TxTime >>= 8; // 32 bit hi
dwt_setdelayedtrxtime(u64TxTime);
if(dwt_starttx(DWT_START_TX_DELAYED) == DWT_ERROR) //transmit the frame
{
DBG_MSG_L0("(dwt_starttx() == DWT_ERROR)\n");
}
u32BeginMs = portGetTickCount();
QUEUE_RECEIVE( g_hDwEventQueue, &u32Event, portMAX_DELAY);
u32EndMs = portGetTickCount();
u64TxTimeStamp = get_tx_timestamp_u64();
dw_event = instance_getevent(11); //get and clear this event
DBG_MSG_L0("\n---------------------------------------------------\n");
if(dw_event->type == DWT_SIG_TX_DONE)
{
DBG_MSG_L0("%s#%d, TX complete![#%d]\n", (inst->mode == TAG) ? "Tag" : "Anchor", u32AncAddr, ++u32Count);
DBG_MSG_L0("TS : tx=%lfms\n", u64TxTimeStamp*DWT_TIME_UNITS*1000);
DBG_MSG_L0("RngNum=%d\n", inst->rangeNum);
}
DBG_MSG_L0("elapsed = %dms\n", u32EndMs -u32BeginMs);
DBG_MSG_L0("---------------------------------------------------\n");
:
:
It works well and the result display screen via serial terminal is like below.
:
:
Anchor#0, TX complete![#4]
TS : tx=9760608.621795us
RngNum=3
elapsed = 1005ms
Anchor#0, TX complete![#5]
TS : tx=10760608.621795us
RngNum=3
elapsed = 1005ms
Anchor#0, TX complete![#6]
TS : tx=11760608.621795us
RngNum=3
elapsed = 1006ms
Anchor#0, TX complete![#7]
TS : tx=12760608.621795us
RngNum=3
elapsed = 1005ms
Anchor#0, TX complete![#8]
TS : tx=13760608.621795us
RngNum=3
elapsed = 1004ms
Anchor#0, TX complete![#9]
TS : tx=14760608.621795us
RngNum=3
elapsed = 1005ms
Anchor#0, TX complete![#10]
TS : tx=15760608.621795us
RngNum=3
elapsed = 1005ms
:
:
As you can see, TX timestamp has very consistent value.
It correctly sends a packet in every 1000ms without any difference like follow.
:
:
TS : tx=9760608.621795us
TS : tx=10760608.621795us
TS : tx=11760608.621795us
TS : tx=12760608.621795us
TS : tx=13760608.621795us
TS : tx=14760608.621795us
TS : tx=15760608.621795us
:
:
Anchor#1 receives this packet and display RX time stamp in all the time.
Source code is like below.
:
:
dwt_enableframefilter(DWT_FF_NOTYPE_EN); //allow data, ack frames;
// First time anchor listens we don't do a delayed RX
dwt_setrxaftertxdelay(0);
dwt_setrxtimeout(0);
dwt_setpreambledetecttimeout(0);
do
{
dwt_rxenable(DWT_START_RX_IMMEDIATE) ; // turn RX on, without delay
u32BeginMs = portGetTickCount();
QUEUE_RECEIVE( g_hDwEventQueue, &u32Event, portMAX_DELAY);
u32EndMs = portGetTickCount();
dw_event = instance_getevent(15); //get and clear this event
// su64RxTimeStamp = get_rx_timestamp_u64();
su64RxTimeStamp = dw_event->timeStamp;
u8SavedEventType = dw_event->type;
:
:
DBG_MSG_L0("\n========================================\n");
if(u8SavedEventType == DWT_SIG_RX_OKAY)
{
DBG_MSG_L0("%s#%d, RX complete![#%d]\n", (u32InstanceType == TAG) ? “Tag” : “Anchor”, u32AncAddr, ++u32Count);
DBG_MSG_L0(“TxAnchor=%d, RngNum=%d, TxAntDly=%d\n”, u32TxAncAddr, u32TxRngNum, u32TxAntDly);
sdbInterval = (su64RxTimeStamp - su64PreviousRxTimeStamp)*DWT_TIME_UNITS*1e6 - _TEST_DW1000_DELAY_TIME_US_;
DBG_MSG_L0("TS : rx=%lfms, interval=%lfus, diff intv.=%lfus\n", su64RxTimeStamp*DWT_TIME_UNITS*1e3, sdbInterval, (sdbPreviousInterval - sdbInterval));
DBG_MSG_L0("TA0A%d=%lfus\n", u32AncAddr, g_dbTimeDistanceFromAnchor0[u32AncAddr]);
}
else if(u8SavedEventType == DWT_SIG_RX_TIMEOUT)
{
DBG_MSG_L0("DWT_SIG_RX_TIMEOUT\n");
}
DBG_MSG_L0("elapsed = %dms\n", u32EndMs -u32BeginMs);
DBG_MSG_L0("========================================\n");
:
:
It works well and the result display screen via serial terminal is like below.
:
:
Anchor#1, RX complete![#556]
TxAnchor=0, RngNum=3, TxAntDly=0
TS : rx=12061.936409ms, interval=1.426564us, diff intv.=0.000610us
TA0A1=0.008875us
elapsed = 991ms
========================================
Anchor#1, RX complete![#557]
TxAnchor=0, RngNum=3, TxAntDly=0
TS : rx=13061.937838ms, interval=1.429522us, diff intv.=-0.002958us
TA0A1=0.008875us
elapsed = 992ms
========================================
Anchor#1, RX complete![#558]
TxAnchor=0, RngNum=3, TxAntDly=0
TS : rx=14061.939270ms, interval=1.431290us, diff intv.=-0.001768us
TA0A1=0.008875us
elapsed = 991ms
========================================
Anchor#1, RX complete![#559]
TxAnchor=0, RngNum=3, TxAntDly=0
TS : rx=15061.940704ms, interval=1.434138us, diff intv.=-0.002848us
TA0A1=0.008875us
elapsed = 991ms
========================================
Anchor#1, RX complete![#560]
TxAnchor=0, RngNum=3, TxAntDly=0
TS : rx=16061.942142ms, interval=1.437988us, diff intv.=-0.003850us
TA0A1=0.008875us
elapsed = 991ms
========================================
Anchor#1, RX complete![#561]
TxAnchor=0, RngNum=3, TxAntDly=0
TS : rx=17061.943570ms, interval=1.428536us, diff intv.=0.009453us
TA0A1=0.008875us
elapsed = 991ms
:
:
As you can see, RX timestamp has inconsistent value dislike to TX timestamp.
It’s RX time(timestamp) is different in every time like follow.
:
:
TS : rx=12061.936409ms, interval=1.426564us, diff intv.=0.000610us
TS : rx=13061.937838ms, interval=1.429522us, diff intv.=-0.002958us
TS : rx=14061.939270ms, interval=1.431290us, diff intv.=-0.001768us
TS : rx=15061.940704ms, interval=1.434138us, diff intv.=-0.002848us
TS : rx=16061.942142ms, interval=1.437988us, diff intv.=-0.003850us
TS : rx=17061.943570ms, interval=1.428536us, diff intv.=0.009453us
:
:
I think that RX timestamp also has a consistent value in every time, if the TX time is consistent.
Can anyone answer or explain why the RX timestamp is different in this case ?
Thank you.
DongWook Kim.