找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9795|回复: 8
收起左侧

DW1000的官方keil源程序,发上来给各位用一下

  [复制链接]
ID:311878 发表于 2018-4-19 18:28 | 显示全部楼层 |阅读模式
这是官方标准程序,还可以使用。

单片机源程序如下:
  1. /*! ----------------------------------------------------------------------------
  2. *  @file    main.c
  3. *  @brief   Double-sided two-way ranging (DS TWR) initiator example code
  4. *
  5. *           This is a simple code example which acts as the initiator in a DS TWR distance measurement exchange. This application sends a "poll"
  6. *           frame (recording the TX time-stamp of the poll), and then waits for a "response" message expected from the "DS TWR responder" example
  7. *           code (companion to this application). When the response is received its RX time-stamp is recorded and we send a "final" message to
  8. *           complete the exchange. The final message contains all the time-stamps recorded by this application, including the calculated/predicted TX
  9. *           time-stamp for the final message itself. The companion "DS TWR responder" example application works out the time-of-flight over-the-air
  10. *           and, thus, the estimated distance between the two devices.
  11. *
  12. * @attention
  13. *
  14. * Copyright 2015 (c) Decawave Ltd, Dublin, Ireland.
  15. *
  16. * All rights reserved.
  17. *
  18. * @author Decawave
  19. */
  20. #include <string.h>
  21. #include <stdio.h>
  22. #include "deca_device_api.h"
  23. #include "deca_regs.h"
  24. #include "deca_sleep.h"
  25. #include "lcd.h"
  26. #include "port.h"

  27. /* Example application name and version to display on LCD screen. */
  28. #define APP_NAME "DS TWR INIT v1.1"

  29. /* Inter-ranging delay period, in milliseconds. */
  30. #define RNG_DELAY_MS 100

  31. /* Default communication configuration. We use here EVK1000's default mode (mode 3). */
  32. static dwt_config_t config = {
  33.     2,               /* Channel number. */
  34.     DWT_PRF_64M,     /* Pulse repetition frequency. */
  35.     DWT_PLEN_1024,   /* Preamble length. */
  36.     DWT_PAC32,       /* Preamble acquisition chunk size. Used in RX only. */
  37.     9,               /* TX preamble code. Used in TX only. */
  38.     9,               /* RX preamble code. Used in RX only. */
  39.     1,               /* Use non-standard SFD (Boolean) */
  40.     DWT_BR_110K,     /* Data rate. */
  41.     DWT_PHRMODE_STD, /* PHY header mode. */
  42.     (1025 + 64 - 32) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
  43. };
  44. /* Default antenna delay values for 64 MHz PRF. See NOTE 1 below. */
  45. #define TX_ANT_DLY 0
  46. #define RX_ANT_DLY 32899
  47. static uint8 rx_poll_msg[] = {0x00, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x21, 0, 0};
  48. static uint8 tx_resp_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'V', 'E', 'W', 'A', 0x10, 0x02, 0, 0, 0, 0};
  49. static uint8 rx_final_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

  50.        
  51. /* Frames used in the ranging process. See NOTE 2 below. */
  52. static uint8 tx_poll_msg[] = {0x00, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x21, 0, 0};
  53. static uint8 rx_resp_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'V', 'E', 'W', 'A', 0x10, 0x02, 0, 0, 0, 0};
  54. static uint8 tx_final_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'W', 'A', 'V', 'E', 0x23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  55. /* Length of the common part of the message (up to and including the function code, see NOTE 2 below). */
  56. typedef signed long long int64;
  57. typedef unsigned long long uint64;
  58. static uint64 poll_rx_ts;
  59. static uint64 resp_tx_ts;
  60. static uint64 final_rx_ts;

  61. static double tof;
  62. static double distance,dist,dist2;
  63.        
  64. #define ALL_MSG_COMMON_LEN 10
  65. /* Indexes to access some of the fields in the frames defined above. */
  66. #define ALL_MSG_SN_IDX 2
  67. #define FINAL_MSG_POLL_TX_TS_IDX 10
  68. #define FINAL_MSG_RESP_RX_TS_IDX 14
  69. #define FINAL_MSG_FINAL_TX_TS_IDX 18
  70. #define FINAL_MSG_TS_LEN 4
  71. /* Frame sequence number, incremented after each transmission. */
  72. static uint32 frame_seq_nb = 0;

  73. /* Buffer to store received response message.
  74. * Its size is adjusted to longest frame that this example code is supposed to handle. */
  75. #define RX_BUF_LEN 20
  76. #define RX_BUF_LEN2 24
  77. static uint8 rx_buffer[RX_BUF_LEN+4];

  78. /* Hold copy of status register state here for reference, so reader can examine it at a breakpoint. */
  79. static uint32 status_reg = 0;

  80. /* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion factor.
  81. * 1 uus = 512 / 499.2 祍 and 1 祍 = 499.2 * 128 dtu. */
  82. #define UUS_TO_DWT_TIME 65536

  83. /* Delay between frames, in UWB microseconds. See NOTE 4 below. */
  84. /* 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. */
  85. #define POLL_TX_TO_RESP_RX_DLY_UUS 150
  86. /* 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
  87. * frame length of approximately 2.66 ms with above configuration. */
  88. #define RESP_RX_TO_FINAL_TX_DLY_UUS 3100
  89. /* Receive response timeout. See NOTE 5 below. */
  90. #define RESP_RX_TIMEOUT_UUS 2700

  91. #define POLL_RX_TO_RESP_TX_DLY_UUS 2600
  92. /* 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. */
  93. #define RESP_TX_TO_FINAL_RX_DLY_UUS 500
  94. /* Receive final timeout. See NOTE 5 below. */
  95. #define FINAL_RX_TIMEOUT_UUS 4300
  96. #define SPEED_OF_LIGHT 299702547
  97. /* Time-stamps of frames transmission/reception, expressed in device time units.
  98. * As they are 40-bit wide, we need to define a 64-bit int type to handle them. */
  99. typedef unsigned long long uint64;
  100. static uint64 poll_tx_ts;
  101. static uint64 resp_rx_ts;
  102. static uint64 final_tx_ts;

  103. /* Declaration of static functions. */
  104. static uint64 get_tx_timestamp_u64(void);
  105. static uint64 get_rx_timestamp_u64(void);
  106. static void final_msg_set_ts(uint8 *ts_field, uint64 ts);

  107. /*! ------------------------------------------------------------------------------------------------------------------
  108. * @fn main()
  109. *
  110. * @brief Application entry point.
  111. *
  112. * @param  none
  113. *
  114. * @return none
  115. */
  116. static void final_msg_get_ts(const uint8 *ts_field, uint32 *ts)
  117. {
  118.     int i;
  119.     *ts = 0;
  120.     for (i = 0; i < FINAL_MSG_TS_LEN; i++)
  121.     {
  122.         *ts += ts_field[i] << (i * 8);
  123.     }
  124. }
  125. void GPIO_Toggle(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  126. {
  127.         GPIO_WriteBit(GPIOx, GPIO_Pin, (BitAction)!GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin));
  128. }
  129. int fputc(int ch, FILE *f)

  130. {

  131. USART_SendData(USART1, (unsigned char) ch);// USART1 ???? USART2 ?

  132. while (!(USART1->SR & USART_FLAG_TXE));

  133. return (ch);


  134. }

  135. void USART_putc(char c)
  136. {
  137.         //while(!(USART2->SR & 0x00000040));
  138.         //USART_SendData(USART2,c);
  139.         /* e.g. write a character to the USART */
  140.         USART_SendData(USART1, c);

  141.         /* Loop until the end of transmission */
  142.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)        ;
  143. }

  144. void USART_puts(uint8_t *s,uint8_t len)
  145. {
  146.         int i;
  147.         for(i=0; i<len; i++)
  148.         {
  149.                 USART_putc(s[i]);
  150.         }
  151. }
  152. int ld[100];
  153. int LP(int tmp,uint8_t channel)
  154. {
  155. int data;
  156.         data = 0.7*ld[channel]+0.3*tmp;
  157.         ld[channel]=data;
  158.         return data;
  159. }
  160. uint16_t Checksum_u16(uint8_t* pdata, uint32_t len)
  161. {
  162.     uint16_t sum = 0;
  163.     uint32_t i;
  164.     for(i=0; i<len; i++)
  165.         sum += pdata[i];
  166.     sum = ~sum;
  167.     return sum;
  168. }
  169. void LED_blink(void)
  170. {
  171.         uint8_t ii;
  172.         for (ii=0;ii<10;ii++)
  173. {
  174.         GPIO_Toggle(GPIOA,LED_PIN);
  175.         deca_sleep(100);
  176. }
  177. }
  178. extern volatile unsigned long time32_reset;
  179. extern uint8_t Work_Mode;
  180. uint32 frame_len;
  181. uint8_t send[9];
  182. char dist_str[16] = {0};
  183. int32_t dis;
  184. double dID;
  185. uint8_t TAG_ID,ANCHOR_ID, jumptime=0;
  186. uint32_t rec_dist,hex_dist;
  187. uint16_t check;
  188. int main(void)
  189. {
  190.     /* Start with board specific hardware init. */
  191.     peripherals_init();//初始化外设

  192.     /* Display application name on LCD. */
  193.   //  lcd_display_str(APP_NAME);

  194.     /* Reset and initialise DW1000.
  195.      * For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum
  196.      * performance. */
  197.     reset_DW1000();//重启DW1000 /* Target specific drive of RSTn line into DW1000 low for a period. */
  198.     spi_set_rate_low();//降低SPI频率
  199.     dwt_initialise(DWT_LOADUCODE);//初始化DW1000
  200.     spi_set_rate_high();//回复SPI频率

  201.     /* Configure DW1000. See NOTE 6 below. */
  202.     dwt_configure(&config);//配置DW1000

  203.     /* Apply default antenna delay value. See NOTE 1 below. */
  204.     dwt_setrxantennadelay(RX_ANT_DLY);                //设置接收天线延迟
  205.     dwt_settxantennadelay(TX_ANT_DLY);                //设置发射天线延迟

  206.     /* Set expected response's delay and timeout. See NOTE 4 and 5 below.
  207.      * As this example only handles one incoming frame with always the same delay and timeout, those values can be set here once for all. */
  208.     dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);//设置发送后开启接收,并设定延迟时间
  209.     dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);                                                //设置接收超时时间

  210.                 send[0]=0x6D;                                                                                        //串口数据
  211.                 send[1]=0xD6;                                                                                        //串口数据

  212.                 tx_poll_msg[6] = ANCHOR_ID;        //UWB POLL 包数据
  213.                 rx_resp_msg[6] = ANCHOR_ID;        //UWB RESPONSE 包数据
  214.                 tx_final_msg[6] = ANCHOR_ID;//UWB Fianl 包数据
  215.                
  216.                 rx_poll_msg[6] = ANCHOR_ID;
  217.                 tx_resp_msg[6] = ANCHOR_ID;
  218.                 rx_final_msg[6] = ANCHOR_ID;
  219.                
  220.                 tx_poll_msg[5] = TAG_ID;//UWB POLL 包数据
  221.                 rx_resp_msg[5] = TAG_ID;//UWB RESPONSE 包数据
  222.                 tx_final_msg[5] = TAG_ID;//UWB Fianl 包数据
  223.     /* Loop forever initiating ranging exchanges. */
  224.                 LED_blink();
  225.                 if(!Work_Mode)   //选择发送模式(TAG标签)还是接收模式(ANCHOR基站)
  226.                 {
  227.     while (1)                        //发送模式(TAG标签)
  228.     {
  229.         /* Write frame data to DW1000 and prepare transmission. See NOTE 7 below. */
  230.         tx_poll_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
  231.         dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
  232.         dwt_writetxfctrl(sizeof(tx_poll_msg), 0);//设置超宽带发送数据长度

  233.         /* Start transmission, indicating that a response is expected so that reception is enabled automatically after the frame is sent and the delay
  234.          * set by dwt_setrxaftertxdelay() has elapsed. */
  235.         dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置

  236.         /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
  237.         while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误
  238.         { };

  239.         /* Increment frame sequence number after transmission of the poll message (modulo 256). */
  240.         frame_seq_nb++;

  241.         if (status_reg & SYS_STATUS_RXFCG)//如果成功接收
  242.         {
  243.             uint32 frame_len;

  244.             /* Clear good RX frame event and TX frame sent in the DW1000 status register. */
  245.             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位

  246.             /* A frame has been received, read it into the local buffer. */
  247.             frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;        //获得接收到的数据长度
  248.             if (frame_len <= RX_BUF_LEN)
  249.             {
  250.                 dwt_readrxdata(rx_buffer, frame_len, 0);   //读取接收数据
  251.             }

  252.             /* Check that the frame is the expected response from the companion "DS TWR responder" example.
  253.              * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
  254.             rx_buffer[ALL_MSG_SN_IDX] = 0;
  255.             if (memcmp(rx_buffer, rx_resp_msg, ALL_MSG_COMMON_LEN) == 0)//判断接收到的数据是否是response数据
  256.             {
  257.                 uint32 final_tx_time;

  258.                                                        
  259.                 /* Retrieve poll transmission and response reception timestamp. */
  260.                 poll_tx_ts = get_tx_timestamp_u64();                                                                                //获得POLL发送时间T1
  261.                 resp_rx_ts = get_rx_timestamp_u64();                                                                                //获得RESPONSE接收时间T4

  262.                 /* Compute final message transmission time. See NOTE 9 below. */
  263.                 final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//计算final包发送时间,T5=T4+Treply2
  264.                 dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5

  265.                 /* Final TX timestamp is the transmission time we programmed plus the TX antenna delay. */
  266.                 final_tx_ts = (((uint64)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay

  267.                 /* Write all timestamps in the final message. See NOTE 10 below. */
  268.                 final_msg_set_ts(&tx_final_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据
  269.                 final_msg_set_ts(&tx_final_msg[FINAL_MSG_RESP_RX_TS_IDX], resp_rx_ts);
  270.                 final_msg_set_ts(&tx_final_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts);

  271.                 /* Write and send final message. See NOTE 7 below. */
  272.                 tx_final_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
  273.                 dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);//将发送数据写入DW1000
  274.                 dwt_writetxfctrl(sizeof(tx_final_msg), 0);//设定发送数据长度
  275.                 dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送

  276.                 /* Poll DW1000 until TX frame sent event set. See NOTE 8 below. */
  277.                 while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成
  278.                 { };

  279.                 /* Clear TXFRS event. */
  280.                 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清楚标志位

  281.                 /* Increment frame sequence number after transmission of the final message (modulo 256). */
  282.                 frame_seq_nb++;
  283.                                                                 time32_reset = 0;
  284.                                                                 GPIO_Toggle(GPIOA,LED_PIN);//LED闪烁
  285.                                                                 jumptime = 0;
  286.             }else{
  287.                                                         jumptime =5;//如果通讯失败,将间隔时间增加5ms,避开因为多标签同时发送引起的冲突。
  288.                                                 }
  289.         }
  290.         else
  291.         {
  292.             /* Clear RX error events in the DW1000 status register. */
  293.             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
  294.                                                 jumptime =5;
  295.         }

  296.         /* Execute a delay between ranging exchanges. */
  297.         deca_sleep(RNG_DELAY_MS+jumptime);//休眠固定时间
  298.     }
  299.         }else{
  300.                 while (1)//接收模式(ANCHOR基站)
  301.     {
  302.         /* Clear reception timeout to start next ranging process. */
  303.         dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间

  304.         /* Activate reception immediately. */
  305.         dwt_rxenable(0);//打开接收

  306.         /* Poll for reception of a frame or error/timeout. See NOTE 7 below. */
  307.         while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到接收成功或者出现错误
  308.         { };

  309.         if (status_reg & SYS_STATUS_RXFCG)//成功接收
  310.         {
  311.            

  312.             /* Clear good RX frame event in the DW1000 status register. */
  313.             dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清楚标志位

  314.             /* A frame has been received, read it into the local buffer. */
  315.             frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度
  316.             if (frame_len <= RX_BUFFER_LEN)
  317.             {
  318.                 dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据
  319.             }

  320.             /* Check that the frame is a poll sent by "DS TWR initiator" example.
  321.              * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */
  322.             rx_buffer[ALL_MSG_SN_IDX] = 0;
  323.                                                         TAG_ID = rx_buffer[5];
  324.                                                         rx_poll_msg[5] = TAG_ID;//为多标签通讯服务,防止一次通讯中接收到不同ID标签的数据
  325.                                                         tx_resp_msg[5] = TAG_ID;
  326.                                                         rx_final_msg[5] = TAG_ID;
  327.             if (memcmp(rx_buffer, rx_poll_msg, ALL_MSG_COMMON_LEN) == 0)//判断是否是poll包数据
  328.             {
  329.                 uint32 resp_tx_time;

  330.                 /* Retrieve poll reception timestamp. */
  331.                 poll_rx_ts = get_rx_timestamp_u64();//获得Poll包接收时间T2

  332.                 /* Set send time for response. See NOTE 8 below. */
  333.                 resp_tx_time = (poll_rx_ts + (POLL_RX_TO_RESP_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//计算Response发送时间T3。
  334.                 dwt_setdelayedtrxtime(resp_tx_time);//设置Response发送时间T3

  335.                 /* Set expected delay and timeout for final message reception. */
  336.                 dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS);//设置发送完成后开启接收延迟时间
  337.                 dwt_setrxtimeout(FINAL_RX_TIMEOUT_UUS);//接收超时时间

  338.                 /* Write and send the response message. See NOTE 9 below.*/
  339.                                                 //                memcpy(&tx_resp_msg[11],&dis,4);
  340.                 tx_resp_msg[ALL_MSG_SN_IDX] = frame_seq_nb;
  341.                 dwt_writetxdata(sizeof(tx_resp_msg), tx_resp_msg, 0);//写入发送数据
  342.                 dwt_writetxfctrl(sizeof(tx_resp_msg), 0);//设定发送长度
  343.                 dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//延迟发送,等待接收

  344.                 /* We assume that the transmission is achieved correctly, now poll for reception of expected "final" frame or error/timeout.
  345.                  * See NOTE 7 below. */
  346.                 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))///不断查询芯片状态直到接收成功或者出现错误
  347.                 { };

  348.                 /* Increment frame sequence number after transmission of the response message (modulo 256). */
  349.                 frame_seq_nb++;

  350.                 if (status_reg & SYS_STATUS_RXFCG)//接收成功
  351.                 {
  352.                     /* Clear good RX frame event and TX frame sent in the DW1000 status register. */
  353.                     dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚标志位

  354.                     /* A frame has been received, read it into the local buffer. */
  355.                     frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;//数据长度
  356.                     if (frame_len <= RX_BUF_LEN2)
  357.                     {
  358.                         dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据
  359.                     }

  360.                     /* Check that the frame is a final message sent by "DS TWR initiator" example.
  361.                      * As the sequence number field of the frame is not used in this example, it can be zeroed to ease the validation of the frame. */
  362.                     rx_buffer[ALL_MSG_SN_IDX] = 0;
  363.                     if (memcmp(rx_buffer, rx_final_msg, ALL_MSG_COMMON_LEN) == 0)//判断是否为Fianl包
  364.                     {
  365.                         uint32 poll_tx_ts, resp_rx_ts, final_tx_ts;
  366.                         uint32 poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32;
  367.                         double Ra, Rb, Da, Db;
  368.                         int64 tof_dtu;

  369.                         /* Retrieve response transmission and final reception timestamps. */
  370.                         resp_tx_ts = get_tx_timestamp_u64();//获得response发送时间T3
  371.                         final_rx_ts = get_rx_timestamp_u64();//获得final接收时间T6

  372.                         /* Get timestamps embedded in the final message. */
  373.                         final_msg_get_ts(&rx_buffer[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);//从接收数据中读取T1,T4,T5
  374.                         final_msg_get_ts(&rx_buffer[FINAL_MSG_RESP_RX_TS_IDX], &resp_rx_ts);
  375.                         final_msg_get_ts(&rx_buffer[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);

  376.                         /* Compute time of flight. 32-bit subtractions give correct answers even if clock has wrapped. See NOTE 10 below. */
  377.                         poll_rx_ts_32 = (uint32)poll_rx_ts;//使用32位数据计算
  378.                         resp_tx_ts_32 = (uint32)resp_tx_ts;
  379.                         final_rx_ts_32 = (uint32)final_rx_ts;
  380.                         Ra = (double)(resp_rx_ts - poll_tx_ts);//Tround1 = T4 - T1  
  381.                         Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);//Tround2 = T6 - T3
  382.                         Da = (double)(final_tx_ts - resp_rx_ts);//Treply2 = T5 - T4  
  383.                         Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);//Treply1 = T3 - T2  
  384.                         tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));//计算公式

  385.                         tof = tof_dtu * DWT_TIME_UNITS;
  386.                         distance = tof * SPEED_OF_LIGHT;//距离=光速*飞行时间
  387.                                                                                                 dist2 = distance - dwt_getrangebias(config.chan,(float)distance, config.prf);//距离减去矫正系数
  388.                                                                                                
  389.                                                                                                 dis = dist2*100;//dis 为单位为cm的距离
  390.                                                                                                 dist = LP(dis,TAG_ID);//LP 为低通滤波器,让数据更稳定
  391.                                                                                                 time32_reset = 0;
  392.                                                                                                 GPIO_Toggle(GPIOA,LED_PIN);
  393.                                                                                         if (GPIO_ReadInputDataBit(GPIOA,SW2) != RESET)  //通过拨码开关判断数据输出格式
  394.                                                                                        
  395. ……………………

  396. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
1基站多标签V3.5.zip (982.82 KB, 下载次数: 165)
回复

使用道具 举报

ID:241425 发表于 2018-6-4 20:42 | 显示全部楼层
不知道能不能用哈,参考看看。有注释不错。
回复

使用道具 举报

ID:363360 发表于 2018-8-14 14:32 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:384234 发表于 2018-11-3 21:32 | 显示全部楼层
keil文件没找着啊,就看到了.cproj ,没有 .uvproj 么
回复

使用道具 举报

ID:321673 发表于 2018-12-26 16:48 | 显示全部楼层
我想问一下,你程序里面连中断函数都没配,是怎么能用的?
回复

使用道具 举报

ID:142681 发表于 2019-5-13 14:47 | 显示全部楼层
定位准么?
回复

使用道具 举报

ID:415174 发表于 2019-10-3 09:28 | 显示全部楼层
很需要这个,不知道能用不
回复

使用道具 举报

ID:194927 发表于 2019-10-3 15:43 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:644483 发表于 2019-11-18 18:42 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表