/*! ---------------------------------------------------------------------------- * @file main.c * @brief Double-sided two-way ranging (DS TWR) initiator example code * * * * @attention * * Copyright 2015 (c) Decawave Ltd, Dublin, Ireland. * * All rights reserved. * * @author Decawave */ #include #include #include "dw_app.h" #include "deca_device_api.h" #include "deca_regs.h" #include "dw_driver.h" #include "Spi.h" #include "led.h" #include "serial_at_cmd_app.h" #include "Usart.h" #include "global_param.h" #include "filters.h" #include #include "beep.h" #include "modbus.h" #include "CRC.h" //#define USART_INTEGRATE_OUTPUT /*------------------------------------ Marcos ------------------------------------------*/ /* Inter-ranging delay period, in milliseconds. */ #define RNG_DELAY_MS 100 /* Default antenna delay values for 64 MHz PRF. See NOTE 1 below. */ #define TX_ANT_DLY 0 #define RX_ANT_DLY 32899 /* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion factor. * 1 uus = 512 / 499.2 µs and 1 µs = 499.2 * 128 dtu. */ #define UUS_TO_DWT_TIME 65536 /* Delay between frames, in UWB microseconds. See NOTE 4 below. */ /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */ #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 /* Receive response timeout. See NOTE 5 below. */ #define RESP_RX_TIMEOUT_UUS 600 #define DELAY_BETWEEN_TWO_FRAME_UUS 400 #define POLL_RX_TO_RESP_TX_DLY_UUS 470 /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */ #define RESP_TX_TO_FINAL_RX_DLY_UUS 200 /* Receive final timeout. See NOTE 5 below. */ #define FINAL_RX_TIMEOUT_UUS 4300 #define SPEED_OF_LIGHT 299702547 /* Indexes to access some of the fields in the frames defined above. */ #define FINAL_MSG_POLL_TX_TS_IDX 10 #define FINAL_MSG_RESP_RX_TS_IDX 14 #define FINAL_MSG_FINAL_TX_TS_IDX 18 #define FINAL_MSG_TS_LEN 4 //#define _UWB_4G static dwt_config_t config = { #ifdef _UWB_4G 2, /* Channel number. */ #else 5, #endif DWT_PRF_64M, /* Pulse repetition frequency. */ DWT_PLEN_128, /* Preamble length. */ 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. */ 1, /* Use non-standard SFD (Boolean) */ DWT_BR_6M8, /* Data rate. */ DWT_PHRMODE_STD, /* PHY header mode. */ (129 + 8 - 8) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */ }; static uint8_t tx_poll_msg[20] = {0}; static uint8_t tx_sync_msg[14] = {0}; static uint8_t tx_final_msg[60] = {0}; static uint8_t tx_resp_msg[22] = {0}; uint8_t tx_near_msg[80] = {0}; static uint32_t frame_seq_nb = 0; static uint32_t status_reg = 0; static uint8_t rx_buffer[100]; static uint64_t poll_tx_ts; static uint64_t resp_rx_ts; static uint64_t final_tx_ts; static uint64_t poll_rx_ts; static uint64_t resp_tx_ts; static uint64_t final_rx_ts; int32_t anchor_dist_last_frm[TAG_NUM_IN_SYS],his_dist[TAG_NUM_IN_SYS]; ; uint32_t tag_id = 0; uint32_t tag_id_recv = 0; uint32_t anc_id_recv = 0; uint8_t random_delay_tim = 0; double distance, dist_no_bias, dist_cm; uint32_t g_UWB_com_interval = 0; float dis_after_filter; //µ±Ç°¾àÀëÖµ LPFilter_Frac* p_Dis_Filter; //²â¾àÓõĵÍͨÂ˲¨Æ÷ float range_lost_time = 0; static uint64_t get_tx_timestamp_u64(void) { uint8_t ts_tab[5]; uint64_t ts = 0; int i; dwt_readtxtimestamp(ts_tab); for (i = 4; i >= 0; i--) { ts <<= 8; ts |= ts_tab[i]; } return ts; } static uint64_t get_rx_timestamp_u64(void) { uint8_t ts_tab[5]; uint64_t ts = 0; int i; dwt_readrxtimestamp(ts_tab); for (i = 4; i >= 0; i--) { ts <<= 8; ts |= ts_tab[i]; } return ts; } static void final_msg_set_ts(uint8_t *ts_field, uint64_t ts) { int i; for (i = 0; i < FINAL_MSG_TS_LEN; i++) { ts_field[i] = (uint8_t) ts; ts >>= 8; } } static void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts) { int i; *ts = 0; for (i = 0; i < FINAL_MSG_TS_LEN; i++) { *ts += ts_field[i] << (i * 8); } } void Dw1000_Init(void) { /* Reset and initialise DW1000. * For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum * performance. */ Reset_DW1000();//ÖØÆôDW1000 /* Target specific drive of RSTn line into DW1000 low for a period. */ Spi_ChangePrescaler(SPIx_PRESCALER_SLOW); //ÉèÖÃΪ¿ìËÙģʽ dwt_initialise(DWT_LOADUCODE);//³õʼ»¯DW1000 Spi_ChangePrescaler(SPIx_PRESCALER_FAST); //ÉèÖÃΪ¿ìËÙģʽ /* Configure DW1000. See NOTE 6 below. */ dwt_configure(&config);//ÅäÖÃDW1000 /* Apply default antenna delay value. See NOTE 1 below. */ dwt_setrxantennadelay(RX_ANT_DLY); //ÉèÖýÓÊÕÌìÏßÑÓ³Ù dwt_settxantennadelay(TX_ANT_DLY); //ÉèÖ÷¢ÉäÌìÏßÑÓ³Ù // dwt_configcontinuousframemode(12480); // dwt_writetxdata(13, usart_send, 0);//½«Poll°üÊý¾Ý´«¸øDW1000£¬½«ÔÚ¿ªÆô·¢ËÍʱ´«³öÈ¥ // dwt_writetxfctrl(13, 0);//ÉèÖó¬¿í´ø·¢ËÍÊý¾Ý³¤¶È // dwt_starttx(DWT_START_TX_IMMEDIATE);//¿ªÆô·¢ËÍ£¬·¢ËÍÍê³ÉºóµÈ´ýÒ»¶Îʱ¼ä¿ªÆô½ÓÊÕ£¬µÈ´ýʱ¼äÔÚdwt_setrxaftertxdelayÖÐÉèÖà //while(1) //{} /* Set expected response's delay and timeout. See NOTE 4 and 5 below. * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */ //ÉèÖýÓÊÕ³¬Ê±Ê±¼ä } void Dw1000_App_Init(void) { //g_com_map[DEV_ID] = 0x0b; //tag_state=DISCPOLL; tx_poll_msg[MESSAGE_TYPE_IDX]=POLL; tx_resp_msg[MESSAGE_TYPE_IDX]=RESPONSE; tx_final_msg[MESSAGE_TYPE_IDX]=FINAL; tx_sync_msg[MESSAGE_TYPE_IDX]=SYNC; memcpy(&tx_poll_msg[TAG_ID_IDX], &dev_id, 2); memcpy(&tx_final_msg[TAG_ID_IDX], &dev_id, 2); memcpy(&tx_resp_msg[ANCHOR_ID_IDX], &dev_id, 2); memcpy(&tx_sync_msg[ANCHOR_ID_IDX], &dev_id, 2); memcpy(&tx_near_msg[ANCHOR_ID_IDX], &dev_id, 2); memcpy(&tx_near_msg[TAG_ID_IDX], &dev_id, 2); } uint16_t Checksum_u16(uint8_t* pdata, uint32_t len) { uint16_t sum = 0; uint32_t i; for(i=0; i>i)&0x1)==0) // { // return i; // } // } // // for(i=1;i>i)&0x1)==0) // { // return i; // } // } //return max_slotpos-1; //} //int32_t mainbase_dist,nearbase_distlist[MAX_NEARBASE_NUM],ancsync_time,nextpoll_delaytime,offsettimeus; //u8 anclost_times=0 , mainbase_lost_count=0; //u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0; //u8 flag_finalsend,flag_getresponse,flag_rxon; //uint16_t current_count,start_count,end_count,lastsync_timer; //u8 nearbase_num=0,last_nearbase_num,next_nearbase_num,last_slotnum, para_update,para_len,stationary_flag=0; //u32 rec_tagpos_binary; //int16_t offset=2700; //u8 current_freq,rec_freq; //u8 motor_state,rec_remotepara_state,rec_remotepara[80]; //extern u16 last_lpcount; float freqlost_count = 0; //void TagFreqProcess(u8 freq) //{ // if(freq>MAX_ANCFREQ||freq==0) // { // return; // } // if(freq==tag_frequency||freq>tag_frequency) // { // tag_frequency = freq; // freqlost_count = 0; // } //} //#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) //u16 rec_maxrangelen;//rec_anc_signalpower[MAX_NEARBASE_ANCNUM]; //float clockOffsetRatio; //double rtd_init, rtd_resp; //double tof,distance; //extern int32_t dwt_readcarrierintegrator(void) ; //uint32_t testtimer2,anc_pollrx[MAX_NEARBASE_NUM],anc_resptx[MAX_NEARBASE_NUM],tag_resprx[MAX_NEARBASE_NUM]; //int32_t anc_clockoffset[MAX_NEARBASE_NUM]; //int16_t anc_distoffset[MAX_NEARBASE_NUM]; //int32_t test2; //uint16_t u16_nearbase_distlist[MAX_NEARBASE_NUM]; //uint8_t get_newdist,notenoughdist_count; //void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset) //дÈëʱ¼ä´ÁÐÅÏ¢ //{ // memcpy(&anc_pollrx[i],pollrx,4); // memcpy(&anc_resptx[i],resptx,4); // memcpy(&tag_resprx[i],&resprx,4); // memcpy(&anc_distoffset[i],distoffset,2); // anc_clockoffset[i] = test2; //} //void CalculateDists(void) //¼ÆËã¾àÀë //{ // for(int i=0;i-10&&distance<1000) // nearbase_distlist[i] = distance*100+anc_distoffset[i]; // range_lost_time=0; // }else{ // // nearbase_distlist[i] = 0x1ffff; // } // // } //} //extern uint8_t module_power,imu_enable,motor_enable; //void Registor_Poll(void) //{ // static u8 regpoll_count=0; // u8 timeout; // // tx_near_msg[MESSAGE_TYPE_IDX] = MBX_REG; // tx_near_msg[REGP_TAGSTATE_INDEX] = !GET_USERKEY<<2|imu_enable<<1|motor_enable; // tx_near_msg[REGP_FREQUENCY_INDEX] = bat_percent; // tx_near_msg[REGP_POWER_INDEX] = module_power; // memcpy(&tx_near_msg[REGP_VERSION_INDEX],&g_com_map[VERSION],2); // memcpy(&tx_near_msg[REGP_IMUTHRES_INDEX],&g_com_map[GROUP_ID],2); // memcpy(&tx_near_msg[REGP_NOMOVESLEEPTIME_INDEX],&g_com_map[DIST_OFFSET],2); // memcpy(&tx_near_msg[REGP_HEIGHTOFFSET_INDEX],&g_com_map[MAX_REPORT_ANC_NUM],2); // dwt_writetxdata(23, tx_near_msg, 0);//½«Poll°üÊý¾Ý´«¸øDW1000£¬½«ÔÚ¿ªÆô·¢ËÍʱ´«³öÈ¥ // dwt_writetxfctrl(23, 0);//ÉèÖó¬¿í´ø·¢ËÍÊý¾Ý³¤¶È // dwt_starttx(DWT_START_TX_IMMEDIATE);//¿ªÆô·¢ËÍ£¬·¢ËÍÍê³ÉºóµÈ´ýÒ»¶Îʱ¼ä¿ªÆô½ÓÊÕ£¬µÈ´ýʱ¼äÔÚdwt_setrxaftertxdelayÖÐÉèÖà // start_count=HAL_LPTIM_ReadCounter(&hlptim1); // timeout=50; // end_count=start_count+(timeout<<2); // while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_TXFRS)))//²»¶Ï²éѯоƬ״ֱ̬µ½³É¹¦½ÓÊÕ»òÕß·¢Éú´íÎó // { // current_count=HAL_LPTIM_ReadCounter(&hlptim1); // if(current_count>=end_count&¤t_count=MAX_NEARBASE_NUM) // { // nearbase_num = MAX_NEARBASE_NUM-1; // } // recbase_num=0; // for(uint8_t i=0;ipoll_startcount+16384) // { // current_count=HAL_LPTIM_ReadCounter(&hlptim1); // if(current_count=32768) // {end_count-=32768;} // mainbase_dist=100000; // mainbase_lost_count++; // current_count=HAL_LPTIM_ReadCounter(&hlptim1); // while(current_countend_count+15000) // // while(1) // { // current_count=HAL_LPTIM_ReadCounter(&hlptim1); // while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//²»¶Ï²éѯоƬ״ֱ̬µ½³É¹¦½ÓÊÕ»òÕß·¢Éú´íÎó // { // current_count=HAL_LPTIM_ReadCounter(&hlptim1); // if(current_count>=end_count&¤t_count>4; // if(rec_remotepara_state != 0) // { // para_update = rec_remotepara_state; // memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],7); // if(para_update==2) // { // flag_ancreadpara = 1; // } // } // if(last_nearbase_num==0) // { // get_newbase=1; // nearbaseid_list[0]=rec_nearbaseid; // nearbase_num=1; // memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2); // } // if(rec_nearbaseid==nearbaseid_list[0]) // { // exsistbase_list[0]=KEEP_TIMES; // SetANCTimestap(0,&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],resp_rx_ts,&rx_buffer[RESP_MSG_ANC_DISTOFFSET]); // //////////////////////////////////ʱ¼äͬ²½ // memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2); // memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2); // current_count=HAL_LPTIM_ReadCounter(&hlptim1); //// memcpy(&tagslotpos,&rx_buffer[TAGSLOTPOS],2); // tmp_time=tmp_time+450; // if(tmp_time>999) // { // tmp_time-=999; // sync_timer++; // if(sync_timer>=1010) // {sync_timer=0;} // } // rec_nearbasepos=0; // exsistbase_list[rec_nearbasepos]=KEEP_TIMES; // if((rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) // motor_state=rx_buffer[MOTORSTATE_INDEX]&0xf; // // // mainbase_lost_count=0; // flag_finalsend=1; // }else{ // rec_nearbasepos=FindNearBasePos(rec_nearbaseid); // SetANCTimestap(rec_nearbasepos,&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],resp_rx_ts,&rx_buffer[RESP_MSG_ANC_DISTOFFSET]); // if(rec_nearbasepos>=last_nearbase_num) //·¢ÏÖеĻùÕ¾ // { // get_newbase=1; // nearbase_num++; // nearbaseid_list[rec_nearbasepos] = rec_nearbaseid; // memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2); // } // // exsistbase_list[rec_nearbasepos]=KEEP_TIMES; // // if(motor_state<(rx_buffer[MOTORSTATE_INDEX]&0xf)&&(rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) // { // motor_state=rx_buffer[MOTORSTATE_INDEX]; // } // final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts); // // dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//½«·¢ËÍÊý¾ÝдÈëDW1000 // dwt_writetxfctrl(28+nearbase_num*4, 0);//É趨·¢ËÍÊý¾Ý³¤¶È // } // } // }else{ // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); // if(flag_rxon) // {dwt_rxenable(0); // } // } // // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); // } // dwt_forcetrxoff(); // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); // CalculateDists(); // dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG); ////HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_RESET); // //} u8 regpoll_count; u32 id; void UWB_Wkup(void) { SPIx_CS_GPIO->BRR = SPIx_CS; delay_us(600); SPIx_CS_GPIO->BSRR = SPIx_CS; id = dwt_readdevid() ; while (0xDECA0130!=id) { u8 iderror_count = 0; id = dwt_readdevid() ; if(iderror_count++>100) { printf("UWBоƬID´íÎó"); break; } } } void Tag_App(void)//·¢ËÍģʽ(TAG±êÇ©) { MBXANCPoll(); dwt_entersleep(); bat_percent=Get_VDDVlotage(); }