From e182f6082db427bf3c130d2459cabd4f2eb35a3e Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期五, 05 一月 2024 15:18:46 +0800 Subject: [PATCH] 版本v1.0 --- Src/application/dw_app.c | 74 ++++++++++++++++++++++++++++++++----- 1 files changed, 64 insertions(+), 10 deletions(-) diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c index b9a358d..6489121 100644 --- a/Src/application/dw_app.c +++ b/Src/application/dw_app.c @@ -48,7 +48,7 @@ #define POLL_TX_TO_RESP_RX_DLY_UUS 150 /* This is the delay from Frame RX timestamp to TX reply timestamp used for calculating/setting the DW1000's delayed TX function. This includes the * frame length of approximately 2.66 ms with above configuration. */ -#define RESP_RX_TO_FINAL_TX_DLY_UUS 410 +#define RESP_RX_TO_FINAL_TX_DLY_UUS 6410 /* Receive response timeout. See NOTE 5 below. */ #define RESP_RX_TIMEOUT_UUS 600 @@ -78,7 +78,7 @@ NEARPOLL, } tag_state=GETNEARMSG; static dwt_config_t config = { - 5, /* Channel number. */ + 2, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ DWT_PLEN_128, /* Preamble length. */ DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ @@ -383,6 +383,42 @@ sync_anc_id = ancid; } } +#define RESP_MSG_POLL_RX_TS_IDX 26 +#define RESP_MSG_RESP_TX_TS_IDX 30 +#define RESP_MSG_ANC_DISTOFFSET 34 +#define FREQ_OFFSET_MULTIPLIER (998.4e6/2.0/1024.0/131072.0) +#define FREQ_OFFSET_MULTIPLIER_110KB (998.4e6/2.0/8192.0/131072.0) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_1 (-1.0e6/3494.4e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_2 (-1.0e6/3993.6e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_3 (-1.0e6/4492.8e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_5 (-1.0e6/6489.6e6) +int32_t test2; +float clockOffsetRatio; +double rtd_init, rtd_resp; +double distance; +int32_t twociceju; +uint32_t anc_pollrx1,anc_resptx1,tag_resprx1; +int16_t anc_distoffset1; +void CalculateDists_two(uint32_t resprx,uint8_t* resptx,uint8_t* pollrx,uint8_t * distoffset) +{ + + memcpy(&anc_pollrx1,pollrx,4); + memcpy(&anc_resptx1,resptx,4); + memcpy(&tag_resprx1,&resprx,4); + memcpy(&anc_distoffset1,distoffset,2); + + + clockOffsetRatio = test2 * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_2 / 1.0e6) ; + rtd_init = tag_resprx1 - poll_tx_ts; + rtd_resp = anc_resptx1 - anc_pollrx1; + tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS; + distance = tof * SPEED_OF_LIGHT; + if(distance>-1000&&distance<100000) + twociceju= distance*100+anc_distoffset1; +} +uint8_t acc_buff1[4100]; +uint16_t changdu; +uint16_t fp1; void NearPoll(void) { @@ -439,7 +475,7 @@ flag_getresponse=0; start_count=HAL_LPTIM_ReadCounter(&hlptim1); recbase_num=0; - timeout=ceil((float)nearbase_num*SLOT_SCALE)+3; + timeout=ceil((float)nearbase_num*SLOT_SCALE)+13; end_count=start_count+(timeout<<5); if(end_count>=32768) { @@ -480,6 +516,9 @@ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 + test2 = dwt_readcarrierintegrator(); + fp1 = dwt_read16bitoffsetreg(0x15, 5); + dwt_readaccdata(acc_buff1,4064,0); dwt_setrxtimeout(0);//DELAY_BETWEEN_TWO_FRAME_UUS*(nearbase_num+1-recbase_num)+10);//设定接收超时时间,0位没有超时时间 dwt_rxenable(0);//打开接收 if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)&&rx_buffer[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据 @@ -495,6 +534,7 @@ nearbase_num=1; memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2); } +// CalculateDists_two(resp_rx_ts,&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_ANC_DISTOFFSET]); if(rec_nearbaseid==nearbaseid_list[0]) { //////////////////////////////////时间同步 @@ -618,6 +658,20 @@ } // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); } + CalculateDists_two(resp_rx_ts,&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_ANC_DISTOFFSET]); + usart_send[0] = 0x55; + usart_send[1] = 0xAA; + usart_send[2] = 1;//正常模式 + changdu=1+2+2+4+2+10+4064; + memcpy(&usart_send[3],&changdu,2); + memcpy(&usart_send[5],&dev_id,2); + memcpy(&usart_send[7],&twociceju,4); + memcpy(&usart_send[11],&fp1,2); + USART_puts(usart_send,23); + USART_puts(acc_buff1,4064); + usart_send[0] = 0x55; + usart_send[1] = 0xBB; + USART_puts(usart_send,2); if(mainbase_lost_count>tag_frequency*BASELOST_STOPMOTOR_TIME) { motor_state=0; @@ -682,13 +736,13 @@ } } #ifdef USART_INTEGRATE_OUTPUT - usart_send[0] = 0x55; - usart_send[1] = 0xAA; - usart_send[2] = 4;//正常模式 - usart_send[3] = report_num*6+2;//正常模式 - checksum = Checksum_u16(&usart_send[2],report_num*6+2); - memcpy(&usart_send[4+report_num*6],&checksum,2); - USART_puts(usart_send,6+report_num*6); +// usart_send[0] = 0x55; +// usart_send[1] = 0xAA; +// usart_send[2] = 4;//正常模式 +// usart_send[3] = report_num*6+2;//正常模式 +// checksum = Checksum_u16(&usart_send[2],report_num*6+2); +// memcpy(&usart_send[4+report_num*6],&checksum,2); +// USART_puts(usart_send,6+report_num*6); #endif for(i=0; i<MAX_NEARBASE_NUM; i++) -- Gitblit v1.9.3