From d2de620b25574ea7a0c47ef7b00ef5b7c3751e12 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期日, 31 十月 2021 17:00:00 +0800 Subject: [PATCH] V2.41 时间片解决,有蓝灯长亮BUG --- Src/application/dw_app.c | 258 +++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 198 insertions(+), 60 deletions(-) diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c index e38a85a..eb43c67 100644 --- a/Src/application/dw_app.c +++ b/Src/application/dw_app.c @@ -50,7 +50,7 @@ #define RESP_RX_TO_FINAL_TX_DLY_UUS 510 /* Receive response timeout. See NOTE 5 below. */ -#define RESP_RX_TIMEOUT_UUS 1000 +#define RESP_RX_TIMEOUT_UUS 4000 #define DELAY_BETWEEN_TWO_FRAME_UUS 240 @@ -70,7 +70,7 @@ #define FINAL_MSG_TS_LEN 4 #define STARTPOLL REGPOLL//#define SWITCHBASE_DIST -//#define SWITCHBASE_ZHUANDIAN +#define SWITCHBASE_ZHUANDIAN #define SWITCHBASE_DIST enum enumtagstate { @@ -249,7 +249,7 @@ u16 mainbase_id; int32_t mainbase_dist,base_mindist; uint8_t trygetnearmsg_times; -u16 mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM],nearbaseid_list[MAX_NEARBASE_NUM],nearbaseid_list2[MAX_NEARBASE_NUM]; +u16 mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM],nearbaseid_list0[MAX_NEARBASE_NUM],nearbaseid_list[MAX_NEARBASE_NUM],nearbaseid_list2[MAX_NEARBASE_NUM]; u8 FindNearBasePos(u16 baseid) { u8 i; @@ -553,16 +553,16 @@ {sync_timer=0;} } ancsync_time=((sync_timer)*1000+tmp_time); - last_slotnum=current_slotnum; - temptimer = sync_timer-10; - if(temptimer<0) - {temptimer+=1000;} - //current_slotnum=((float)temptimer/(SLOTTIME_MS*bigslot_num))+1; - if(current_slotnum==last_slotnum-1) - {flag_getresponse=1;} - lastsync_timer=sync_timer; +// last_slotnum=current_slotnum; +// temptimer = sync_timer-10; +// if(temptimer<0) +// {temptimer+=1000;} +// //current_slotnum=((float)temptimer/(SLOTTIME_MS*bigslot_num))+1; +// if(current_slotnum==last_slotnum-1) +// {flag_getresponse=1;} +// lastsync_timer=sync_timer; //offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; - SetNextPollTime(tagslotpos); +// SetNextPollTime(tagslotpos); } memcpy(&temp_dist, &rx_buffer[DIST_IDX], 4); @@ -624,22 +624,118 @@ // mainbase_id=minid; // mainbase_id = 0x4; } +int16_t target_offsettime = 850; +//#define TAGET_OFFSETTIME 940 +#define MAX_NEARBASE_ANCNUM 11 +u16 rec_maxrangelen,rec_anc_signalpower[MAX_NEARBASE_ANCNUM]; +u8 outrange_times; +extern u32 synctimer; +u32 target_time=100; +u8 pd_i; +u32 temptime,delaytime,expect_anctime; +int32_t error_time; +u16 delaycount; +int16_t poll_offsettime=-6900,clockoffset; +extern u16 slotpos_intoatl, slotpos; +void NextPollDelay(u32 anchor_time) +{ + //tagslotpos = 0; + error_time = anchor_time-expect_anctime; + if(error_time<2000&&error_time>0) + clockoffset += (target_offsettime-error_time)*0.1; + for(pd_i=0;pd_i<tag_frequency;pd_i++) + { + slotpos_intoatl = pd_i*bigslot_num+tagslotpos; + temptime = (slotpos_intoatl*SLOTTIME_MS+100)*100; + if(anchor_time<temptime-5000) + { + current_slotnum = pd_i; + delaytime = temptime-anchor_time+poll_offsettime+clockoffset; + expect_anctime = temptime; + return ; + } + } + temptime = (tagslotpos*SLOTTIME_MS+100+10000)*100; + expect_anctime = temptime-1000000; + delaytime = temptime-anchor_time+poll_offsettime+clockoffset; + return ; +} +u16 lpcount,poll_startcount,last_lpcount; +u16 waketopolltimeus = 3200; +#define BASENUM_COMTIME 244 +u32 last_anchor_time; +void SetLPTimer(u32 anchor_time) +{ + NextPollDelay(anchor_time); + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + lpcount = current_count+delaytime/LPTIMER_LSB+(10-nearbase_num)*8; + poll_startcount = lpcount+(waketopolltimeus)/LPTIMER_LSB; + if(poll_startcount>=32768) + { + poll_startcount -=32768; + } + if(lpcount>=32768) + { + lpcount -=32768; + } + __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount); + last_lpcount = lpcount; + } + +void NextSlotDelayMs(int16_t delayms) +{ + current_slotnum++; + if(current_slotnum>=tag_frequency) + { + current_slotnum = 0; + lpcount = last_lpcount+31457/tag_frequency+1311+32.767*delayms;//(float)(delayms+40)*32.767 ;//(200/tag_frequency+delayms)*4.8*1000/LPTIMER_LSB + }else{ + lpcount = last_lpcount+31457/tag_frequency+32.767*delayms;//(float)(200/tag_frequency*48+delayms*10)*3.3 ; + } + if(lpcount>=32768) + { + lpcount -=32768; + } + poll_startcount = lpcount+(waketopolltimeus)/LPTIMER_LSB; + if(poll_startcount>=32768) + { + poll_startcount -=32768; + } + __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount); + last_lpcount = lpcount; +} + u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32],mainbase_type;; void GetNearMsg(void) { u32 start_poll,frame_len; - -//mainbase_id = 0x9724; + u8 nearmsg_i=0; + NextSlotDelayMs(0); + for(nearmsg_i=0;nearmsg_i<20;nearmsg_i++) + { + nearbase_distlist[nearmsg_i] = 0x1ffff; + } +//mainbase_id = 0x9818; memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); memcpy(&tx_near_msg[TAG_ID_IDX],&dev_id,2); tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); dwt_writetxdata(12, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 dwt_writetxfctrl(12, 0);//设置超宽带发送数据长度 + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + while(current_count<poll_startcount||current_count>poll_startcount+16384) + { + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + if(current_count<poll_startcount-300) + { + break; + } + } dwt_starttx(DWT_START_TX_IMMEDIATE| DWT_RESPONSE_EXPECTED); - + NextSlotDelayMs(0); /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */ while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误 { @@ -688,6 +784,8 @@ { next_nearbase_num = MAX_NEARBASE_NUM-1; } + if(nearbase_num>10) + {nearbase_num = 10;} // HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_SET); recbase_num=0; @@ -696,25 +794,37 @@ tx_near_msg[BATTARY_IDX] = bat_percent; tx_near_msg[BUTTON_IDX] = userkey_state|stationary_flag<<1|gotosleep_flag<<2; tx_near_msg[SEQUENCE_IDX] = frame_seq_nb; - tx_near_msg[SEQUENCEH_IDX] = (frame_seq_nb++)>>8; + tx_near_msg[SEQUENCEH_IDX] = (frame_seq_nb++)>>8; tx_near_msg[NEARBASENUM_INDEX] = nearbase_num; memcpy(&tx_near_msg[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2); - memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2],&nearbase_distlist,nearbase_num*4+4); + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2],&nearbase_distlist,nearbase_num*4+4); + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*6+4],&rec_anc_signalpower,nearbase_num*2+2); + if(intheight!=0) intheight+=g_com_map[HEIGHTOFFEST_INDEX]; - memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*6+4],&intheight,2); + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*8+6],&intheight,2); tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_POLL; tx_near_msg[NEARP_TAGFREQ_INDEX] = tag_frequency; tx_near_msg[NEARP_TAGSLOTPOS_INDEX] = tagslotpos; memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); - dwt_writetxdata(28+6*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 - dwt_writetxfctrl(28+6*nearbase_num, 0);//设置超宽带发送数据长度 + dwt_writetxdata(29+8*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(29+8*nearbase_num, 0);//设置超宽带发送数据长度 + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + + while(current_count<poll_startcount||current_count>poll_startcount+16384) + { + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + if(current_count<poll_startcount-300) + { + break; + } + } dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 - + HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_RESET); // for(i=0;i<nearbase_num+1;i++) // { // nearbase_distlist[i] = 0x1ffff; @@ -727,7 +837,7 @@ flag_getresponse=0; start_count=HAL_LPTIM_ReadCounter(&hlptim1); recbase_num=0; - timeout=ceil((float)nearbase_num*SLOT_SCALE)+2; + timeout=ceil((float)nearbase_num*SLOT_SCALE)+3; end_count=start_count+(timeout<<5); if(end_count>=32768) {end_count-=32768;} @@ -750,11 +860,11 @@ if (status_reg & SYS_STATUS_RXFCG)//如果成功接收 { dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 - dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);//设定接收超时时间,0位没有超时时间 - dwt_rxenable(0);//打开接收 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 - + dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间 + dwt_rxenable(0);//打开接收 + //HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_SET); if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 { u16 rec_nearbaseid,rec_nearbasepos; poll_tx_ts = get_tx_timestamp_u64(); //获得POLL发送时间T1 @@ -774,7 +884,7 @@ final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+nearbase_num*4], resp_rx_ts); final_msg_set_ts(&tx_near_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts); tx_near_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL; - + rec_remotepara_state=rx_buffer[MOTORSTATE_INDEX]>>4; if(rec_remotepara_state&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) { para_update = 1; @@ -794,7 +904,22 @@ base_mindist = temp_dist; if((rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) motor_state=rx_buffer[MOTORSTATE_INDEX]&0xf; - rec_remotepara_state=rx_buffer[MOTORSTATE_INDEX]>>4; + if(frame_len==28) + { + memcpy(&rec_maxrangelen,&rx_buffer[MAXRANGE_DISTANCE],2); + memcpy(&rec_anc_signalpower[0],&rx_buffer[ANC_SIGNALPOWER],2); + if(mainbase_dist>rec_maxrangelen&&mainbase_dist>0&&rec_maxrangelen!=0) + { + if(outrange_times++>OUTRANGE_RESTARTTIMES) + { + // tag_state = STARTPOLL; + } + }else{ + outrange_times = 0; + } + } + + mainbase_lost_count=0; flag_finalsend=1; @@ -812,40 +937,39 @@ {sync_timer=0;} } ancsync_time=((sync_timer)*1000+tmp_time); - last_slotnum=current_slotnum; - current_slotnum=((float)(sync_timer*10 - tagslotpos*SLOTTIME_MS)/(SLOTTIME_MS*bigslot_num))+1; - if(current_slotnum==last_slotnum-1) - {flag_getresponse=1;} - lastsync_timer=sync_timer; - offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; - SetNextPollTime(tagslotpos); + SetLPTimer(ancsync_time); if(result==0) {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 - { };} + { };} +//HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_RESET); break; }else{ rec_nearbasepos=FindNearBasePos(rec_nearbaseid); exsistbase_list[rec_nearbasepos]=KEEP_TIMES; memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); + if(frame_len==28) + memcpy(&rec_anc_signalpower[rec_nearbasepos+1],&rx_buffer[ANC_SIGNALPOWER],2); memcpy(&nearbase_switchdistlist[rec_nearbasepos],&rx_buffer[NR_NEARSWITCH_DISTANCE],2); nearbase_distlist[rec_nearbasepos+1]=temp_dist; // nearbase_distlist[1]对应 rec_nearbaseid[0]的距离 final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts); - if(temp_dist<salvebase_mindist) + if(temp_dist<salvebase_mindist&&nearbase_switchdistlist[rec_nearbasepos]==1) { salvebase_mindist = temp_dist; mindist_slavebaseid = rec_nearbaseid; } #ifdef SWITCHBASE_ZHUANDIAN - if(temp_dist<nearbase_switchdistlist[rec_nearbasepos]&&nearbase_switchdistlist[rec_nearbasepos]!=0&&temp_dist>0) - { + if(temp_dist<nearbase_switchdistlist[rec_nearbasepos]&&nearbase_switchdistlist[rec_nearbasepos]>1&&temp_dist>0) + { mainbase_id = rec_nearbaseid; tag_state = GETNEARMSG; + trygetnearmsg_times = 0; } #endif } } + // HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_RESET); }else{ dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); if(recbase_num!=nearbase_num+1) @@ -860,8 +984,8 @@ if(flag_finalsend!=1) {flag_finalsend = 2;} dwt_forcetrxoff(); -dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); - + dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); + HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_SET); if(mainbase_lost_count==0) { #ifdef SWITCHBASE_DIST @@ -872,15 +996,24 @@ { mainbase_id = mindist_slavebaseid; tag_state = GETNEARMSG; + trygetnearmsg_times = 0; } }else{ changemainbase_count = 0; } #endif - }else if(mainbase_lost_count>10*tag_frequency) + }else if(mainbase_lost_count>5*tag_frequency) { tag_state = STARTPOLL; - } + } + if(mainbase_lost_count!=0) + { + if(mainbase_lost_count<=tag_frequency*1) + {NextSlotDelayMs(0); + }else{ + NextSlotDelayMs(0); + } + } if(para_update) { @@ -912,6 +1045,8 @@ if(nearbaseid_list[i]!=nearbaseid_list2[i]) { tag_state = GETNEARMSG; + trygetnearmsg_times = 0; + nearbaseid_list0[i]=1; } } dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG); @@ -919,10 +1054,10 @@ } extern uint8_t module_power,imu_enable,motor_enable; - void Registor_Poll(void) { static u8 regpoll_count=0; + mainbase_lost_count = 0; tag_frequency = REGISTER_FREQUENCY; bigslot_num = TOTAL_SLOTNUM/tag_frequency; regpoll_count++; @@ -931,7 +1066,9 @@ if(tagslotpos--<2) tagslotpos=TOTAL_SLOTNUM; } - SetNextPollTime(tagslotpos); + //SetNextPollTime(tagslotpos); + NextSlotDelayMs(-2); + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); @@ -942,7 +1079,7 @@ memcpy(&tx_near_msg[REGP_VERSION_INDEX],&g_com_map[VERSION],2); memcpy(&tx_near_msg[REGP_IMUTHRES_INDEX],&g_com_map[IMU_THRES],2); memcpy(&tx_near_msg[REGP_NOMOVESLEEPTIME_INDEX],&g_com_map[NOMOVESLEEP_TIME],2); - memcpy(&tx_near_msg[REGP_HEIGHTOFFSET_INDEX],&g_com_map[HEIGHTOFFEST_INDEX],2); + memcpy(&tx_near_msg[REGP_HEIGHTOFFSET_INDEX],&g_com_map[HEIGHTOFFEST_INDEX],2); dwt_writetxdata(23, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 dwt_writetxfctrl(23, 0);//设置超宽带发送数据长度 dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 @@ -980,16 +1117,17 @@ if(sync_timer>=1010) {sync_timer=0;} } - ancsync_time=((sync_timer)*1000+tmp_time); - last_slotnum=current_slotnum; - temptimer = sync_timer-10; - if(temptimer<0) - {temptimer+=1000;} - current_slotnum=((float)temptimer/(SLOTTIME_MS*bigslot_num))+1; - if(current_slotnum==last_slotnum-1) - {flag_getresponse=1;} - lastsync_timer=sync_timer; - offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; + ancsync_time=((sync_timer)*1000+tmp_time); + SetLPTimer(ancsync_time); +// last_slotnum=current_slotnum; +// temptimer = sync_timer-10; +// if(temptimer<0) +// {temptimer+=1000;} +// current_slotnum=((float)temptimer/(SLOTTIME_MS*bigslot_num))+1; +// if(current_slotnum==last_slotnum-1) +// {flag_getresponse=1;} +// lastsync_timer=sync_timer; +// offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; // SetNextPollTime(tagslotpos); mainbase_id=rec_nearbaseid; nearbase_num=rx_buffer[NEARBASENUM_INDEX]; @@ -1009,8 +1147,8 @@ //LED0_ON; SPIx_CS_GPIO->BRR = SPIx_CS; delay_us(700); - GetPressAndHeight(); - intheight = Height*100; + // GetPressAndHeight(); + // intheight = Height*100; SPIx_CS_GPIO->BSRR = SPIx_CS; id = dwt_readdevid() ; while (DWT_DEVICE_ID != id) @@ -1038,11 +1176,11 @@ LED_LG_OFF; break; case GETNEARMSG: - trygetnearmsg_times--; - LED_LG_ON; + trygetnearmsg_times++; + LED_LG_ON; GetNearMsg(); LED_LG_OFF; - if(trygetnearmsg_times==0) + if(trygetnearmsg_times>5) { tag_state = STARTPOLL; } -- Gitblit v1.9.3