From a6e5c60a9ec30574bf7c3d584046444b15f8680f Mon Sep 17 00:00:00 2001
From: zhyinch <zhyinch@gmail.com>
Date: 星期四, 10 二月 2022 16:29:20 +0800
Subject: [PATCH] V1.61 修改成中断模式,测试不丢包。
---
源码/核心板/Src/application/dw_app.c | 164 +++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 129 insertions(+), 35 deletions(-)
diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
index 7c3db08..5b14703 100644
--- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
+++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
@@ -1,5 +1,6 @@
#include "dw_app.h"
#include "ADC.h"
+#include "modbus.h"
#define TDFILTER
enum enumtagstate
{
@@ -127,9 +128,8 @@
/* Configure DW1000. See NOTE 6 below. */
dwt_configure(&config);//配置DW1000
-
-
-
+ dwt_setinterrupt( DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+
/* Apply default antenna delay value. See NOTE 1 below. */
dwt_setrxantennadelay(RX_ANT_DLY); //设置接收天线延迟
dwt_settxantennadelay(0); //设置发射天线延迟
@@ -182,10 +182,11 @@
u8 g_start_sync_flag;
void SyncPoll(u8 sync_seq,uint32_t sync_baseid)
{u8 result;
- g_start_sync_flag=1; //中断模式,退出终端后,需要重新来过
+ //g_start_sync_flag=1; //中断模式,退出终端后,需要重新来过
dwt_forcetrxoff(); //关闭接收,以防在RX ON 状态
+ tx_sync_msg[GROUP_ID_IDX] = group_id;
tx_sync_msg[SYNC_SEQ_IDX]=sync_seq;
memcpy(&tx_sync_msg[ANCHOR_ID_IDX],&sync_baseid,4);
dwt_writetxdata(sizeof(tx_sync_msg), tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
@@ -197,6 +198,10 @@
{ };
}
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清楚标志位
+ // UART_CheckSend();
+ //dwt_setinterrupt( DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+ dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+ dwt_rxenable(0);//打开接收
}
uint16_t g_Resttimer;
uint8_t result;
@@ -215,13 +220,13 @@
u16 nearbaseid_list[MAX_NEARBASE_NUM],mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM];
int32_t mainbase_dist,nearbase_distlist[MAX_NEARBASE_NUM],true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM];
uint8_t trygetnearmsg_times;
-u16 current_slotnum,total_slotnum,target_time,last_time;
+u16 current_slotnum,total_slotnum,target_time,last_time,record_time[10],record_i;
u32 rec_tagpos_binary;
extern uint32_t tagpos_binary;
void SetNextPollTime(u16 time)
{
current_slotnum++;
- if(current_slotnum==total_slotnum)
+ if(current_slotnum>=total_slotnum)
current_slotnum-=total_slotnum;
//time=5;
target_time=((current_slotnum*g_com_map[COM_INTERVAL])+time);
@@ -238,7 +243,11 @@
{target_time-=1000;}
if(target_time<0)
{target_time+=1000;}
-
+record_time[record_i++]=target_time;
+ if(record_i>=10)
+ {
+ record_i=0;
+ }
}
u8 FindNearBasePos(u16 baseid)
{
@@ -421,7 +430,7 @@
memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2);
- if(g_com_map[DEV_ROLE]!=0)
+ //if(g_com_map[DEV_ROLE]!=0)
{
sync_timer=temp_sync_timer1;
//// memcpy(&tagslotpos,&rx_buffer[TAGSLOTPOS],2);
@@ -464,10 +473,10 @@
dwt_writetxdata(28+nearbase_num*4, tx_nearfinal_msg, 0);//将发送数据写入DW1000
dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
- if(temp_dist!=0x1ffff&&g_com_map[ALARM_DISTANCE1] == 1)
+ if(temp_dist!=0x1ffff)
{
g_Resttimer=0;
- IWDG_Feed();
+ IWDG_Feed();
#ifdef USART_SINGLE_OUTPUT
usart_send[2] = 1;//正常模式
usart_send[3] = 17;//数据段长度
@@ -485,6 +494,7 @@
usart_send[14] = button;
checksum = Checksum_u16(&usart_send[2],17);
memcpy(&usart_send[19],&checksum,2);
+ if(g_com_map[MODBUS_MODE]!=1)
UART_PushFrame(usart_send,21);
#endif
@@ -516,7 +526,7 @@
LED0_BLINK;
// memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
// tagslotpos=GetRandomSlotPos(rec_tagpos_binary);
- if(temp_dist!=0x1ffff&&g_com_map[ALARM_DISTANCE1] == 1)
+ if(temp_dist!=0x1ffff)
{
#ifdef USART_SINGLE_OUTPUT
usart_send[2] = 1;//正常模式
@@ -535,6 +545,7 @@
usart_send[14] = button;
checksum = Checksum_u16(&usart_send[2],17);
memcpy(&usart_send[19],&checksum,2);
+ if(g_com_map[MODBUS_MODE]!=1)
UART_PushFrame(usart_send,21);
#endif
@@ -716,6 +727,7 @@
{
//LED0_ON;
dwt_forcetrxoff();
+ dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 0);
GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);
switch(tag_state)
{
@@ -733,12 +745,16 @@
SetNextPollTime(tyncpoll_time);
g_start_send_flag = 0;
GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_RESET);
+ UART_CheckSend();
+ dwt_setinterrupt( DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+ dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+ dwt_rxenable(0);//打开接收
}
int8_t correction_time,new_tagid=0;
extern uint8_t sync_seq;
u16 taglist_num=0,taglist_pos;
-u16 tagid_list[TAG_NUM_IN_SYS];
+u16 tagid_list[TAG_NUM_IN_SYS],tagstate_list[TAG_NUM_IN_SYS];
u8 tagofflinetime[TAG_NUM_IN_SYS];
int32_t tagdist_list[TAG_NUM_IN_SYS];
void TagListUpdate(void)
@@ -842,6 +858,28 @@
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
}
}
+ double firstpath_power, rx_power,rec_firstpath_power;
+ double f1, f2, r1, r2;
+uint16_t F1,F2,F3,N,C;
+double B = 131072;
+double A = 121.74;
+double min_power;
+ dwt_rxdiag_t d1;
+double LOS(dwt_rxdiag_t *dia) {
+ F1 = dia->firstPathAmp1;
+ F2 = dia->firstPathAmp2;
+ F3 = dia->firstPathAmp3;
+ N = dia->rxPreamCount;
+ C = dia->maxGrowthCIR;
+
+ firstpath_power=10* log10((F1*F1+F2*F2+F3*F3)/(N*N))-A;
+ rx_power=10*log10(C*B/(N*N))-A;
+
+ // min_power = - 10 * log10((F1 *F1 + F2 * F2 + F3 * F3) / (C *B));
+ return min_power;
+ }
+u8 testt[100],testt2[100],testt3[100],testt4[100],testt6[100],ti;
+u16 testt5[100];
u16 smallcar_idlist[10]={0x4052,0x4032,0x4055,0x4034,0x4016,0x4010,0x4036,0x4027,0x4024,0x4047};
extern u16 dist_threshold;
u8 misdist_num[TAG_NUM_IN_SYS],seize_anchor,getrange_success=0;
@@ -896,11 +934,11 @@
dwt_writetxfctrl(22, 0);//设定发送长度
}
result = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//延迟发送,等待接收
-
+testt2[ti]=frame_seq_nb2;
if(result==0)
{
- while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_sync_flag)///不断查询芯片状态直到接收成功或者出现错误
+ while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))///不断查询芯片状态直到接收成功或者出现错误
{ };
}else{
result++;
@@ -908,7 +946,7 @@
if (status_reg & SYS_STATUS_RXFCG)//接收成功
{
-
+ testt3[ti]=frame_seq_nb2;
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);//读取接收数据
@@ -940,7 +978,9 @@
tof = tof_dtu * DWT_TIME_UNITS;
distance = tof * SPEED_OF_LIGHT;//距离=光速*飞行时间
dist_no_bias = distance - dwt_getrangebias(config.chan, (float)distance, config.prf); //距离减去矫正系数
- dist_cm = dist_no_bias * 1000; //dis 为单位为cm的距离
+ dist_cm = dist_no_bias * 1000; //dis 为单位为cm的距离
+ dwt_readdiagnostics(&d1);
+ LOS(&d1);
/*--------------------------以下为非测距逻辑------------------------*/
//dist_cm=33000;
getrange_success = 1;
@@ -955,11 +995,12 @@
}
g_flag_Taggetdist[taglist_pos]=0;
-
+ testt4[ti]=frame_seq_nb2;
+ testt5[ti] = hex_dist/10;
if(hex_dist>-100000&&hex_dist<2000000)
{
if(abs(hex_dist-his_dist[taglist_pos])<dist_threshold||misdist_num[taglist_pos]>3)
- {
+ {u8 i=0;
g_Resttimer=0;
IWDG_Feed();
@@ -991,14 +1032,46 @@
memcpy(&usart_send[9],&tagdist_list[taglist_pos],4);
usart_send[13] = battary;
usart_send[14] = button;
+ usart_send[15] = firstpath_power;
+ usart_send[16] = rx_power;
checksum = Checksum_u16(&usart_send[2],17);
memcpy(&usart_send[19],&checksum,2);
+ if(g_com_map[MODBUS_MODE]!=1)
UART_PushFrame(usart_send,21);
+ //USART_puts(usart_send,21);
+ testt6[ti]=frame_seq_nb2;
+ tagstate_list[taglist_pos] = button<<8|battary;
#else
memcpy(&usart_send_anc[4+6*anc_report_num],&tag_id_recv,2);
memcpy(&usart_send_anc[6+6*anc_report_num],&tagdist_list[taglist_pos],4);
anc_report_num++;
#endif
+ for(i=0;i<taglist_num-1;i++)
+ {
+ if( tagdist_list[i]>tagdist_list[i+1]&&tagdist_list[i+1]!=0)
+ {
+ int32_t tempdist;
+ u16 tempid,tempstate;
+ tempdist = tagdist_list[i];
+ tempid = tagid_list[i];
+ tempstate = tagstate_list[i];
+
+ tagdist_list[i] = tagdist_list[i+1];
+ tagid_list[i] = tagid_list[i+1];
+ tagstate_list[i] = tagstate_list[i+1];
+
+ tagdist_list[i+1] = tempdist;
+ tagid_list[i+1] = tempid;
+ tagstate_list[i+1] = tempstate;
+ }
+ }
+ for(i=0;i<taglist_num;i++)
+ {
+ Modbus_HoldReg[i*4] = tagid_list[i];
+ Modbus_HoldReg[i*4+1] = tagstate_list[i];
+ memcpy(&Modbus_HoldReg[i*4+2],&tagdist_list[i],4);
+ }
+
}else{
// printf("%d",hex_dist);
misdist_num[taglist_pos]++;
@@ -1014,6 +1087,20 @@
extern u8 flag_syncbase;
u8 tagpos_rec[50],tagpos_send[50],ancidlist_num;
u16 ancidlist_rec[20],ancidlist_send[20],rec_ancidlist[20],rec_ancdistlist[20];
+void Anchor_Start(void)
+{
+
+dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
+ g_start_sync_flag=0;
+dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+ dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+ dwt_rxenable(0);//打开接收
+// while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
+// {
+// //IdleTask();
+// };
+}
+
void Anchor_App(void)
{
@@ -1021,23 +1108,24 @@
u16 tempid;
uint32_t rec_syncid;
- dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
- g_start_sync_flag=0;
+// dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
+// g_start_sync_flag=0;
- dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
- dwt_rxenable(0);//打开接收
-// GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);
- while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
- {
-
- IdleTask();
- };
+// dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+// dwt_rxenable(0);//打开接收
+//// GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);
+// while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
+// {
+//
+// IdleTask();
+// };
+ dwt_setinterrupt(DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 0);
+ status_reg = dwt_read32bitreg(SYS_STATUS_ID);
//GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_RESET);
if (status_reg & SYS_STATUS_RXFCG)//成功接收
{ u16 tag_recv_interval;
float temp_tagpos;
-
-
+
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清除标志位
frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度
recpoll_len = frame_len;
@@ -1096,10 +1184,13 @@
case NEAR_POLL:
frame_seq_nb2 = rx_buffer[SEQUENCE_IDX];
+ testt[ti++]=frame_seq_nb2;
+ if(ti>100)
+ ti=0;
battary = rx_buffer[BATTARY_IDX];
button = rx_buffer[BUTTON_IDX];
rec_nearbase_num=rx_buffer[NEARBASENUM_INDEX];
- memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2);
+ memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2);
memcpy(&rec_ancidlist,&rx_buffer[NEARBASEID_INDEX],2*rec_nearbase_num);
memcpy(&rec_ancdistlist,&rx_buffer[NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num);
memcpy(&rec_antdelay,&rx_buffer[NEARBASEID_INDEX+nearbase_num*4],2);
@@ -1123,8 +1214,7 @@
if(taglist_pos==taglist_num)
{
taglist_pos=taglist_num;
- tagid_list[taglist_num++]=tag_id_recv;
-
+ tagid_list[taglist_num++]=tag_id_recv;
new_tagid=1;
}else{
new_tagid=0;
@@ -1159,9 +1249,13 @@
break;
}
- }else{
+ }
+}else{
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
}
-}
+UART_CheckSend();
+ dwt_setinterrupt( DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+ dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+ dwt_rxenable(0);//打开接收
}
--
Gitblit v1.9.3