chen
5 天以前 f34293f18e4fbfe4d0d025657d2bda505861066a
keil/dw_tag.c
@@ -8,7 +8,7 @@
#include "global_param.h"
static float clockOffsetRatio;
static double rtd_init, rtd_resp;
double tof,distance_tag;
double tof,distance;
#define SPEED_OF_LIGHT 299702547
#define DWT_TIME_UNITS          (1.0/499.2e6/128.0) //!< = 15.65e-12 s
static uint32_t anc_pollrx[MAX_NEARBASE_NUM],anc_resptx[MAX_NEARBASE_NUM],tag_resprx[MAX_NEARBASE_NUM],tag_polltx[MAX_NEARBASE_NUM];
@@ -36,34 +36,36 @@
    memcpy(&tag_resprx[i],&resprx,4);
    memcpy(&anc_distoffset[i],distoffset,2);
      memcpy(&tag_polltx[i],&polltx,4);
    //anc_clockoffset[i] = anc_clockoffset_from_MK;//MK8000修改
    anc_clockoffset[i] = freq_offset;//MK8000修改
}
//void CalculateDists1(int64_t poll_tx_ts)
//{
//for(int i=0;i<MAX_NEARBASE_NUM;i++)
//    {
//        //rec_anc_signalpower[i] = exsistbase_list[i];
//      if(exsistbase_list[i]==KEEP_TIMES)
//      {
//         // exsistbase_list[i]--;
//#ifdef _UWB_4G
//            clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_2 / 1.0e6) ;
//#else
//            clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_5 / 1.0e6) ;//MK8000修改
//#endif
//          rtd_init = tag_resprx[i] - (uint32_t)poll_tx_ts;
//          rtd_resp = anc_resptx[i] - anc_pollrx[i];
//          tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS;
//          distance_tag = tof * SPEED_OF_LIGHT/100;
//          if(distance_tag>-10&&distance_tag<1000)
//          {
//            nearbase_distlist[i]  = distance_tag+anc_distoffset[i];
//          }
//      }else{
//          nearbase_distlist[i] = 0x1ffff;
//      }
//    }
//}
void CalculateDists1(int64_t poll_tx_ts)
{
for(int i=0;i<MAX_NEARBASE_NUM;i++)
    {
        //rec_anc_signalpower[i] = exsistbase_list[i];
      if(exsistbase_list[i]==KEEP_TIMES)
      {
         // exsistbase_list[i]--;
#ifdef _UWB_4G
            clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_2 / 1.0e6) ;
#else
            clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_5 / 1.0e6) ;//MK8000修改
#endif
          rtd_init = tag_resprx[i] - (uint32_t)poll_tx_ts;
          rtd_resp = anc_resptx[i] - anc_pollrx[i];
          tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS;
          distance = tof * SPEED_OF_LIGHT/100;
          if(distance>-10&&distance<1000)
          {
            nearbase_distlist[i]  = distance+anc_distoffset[i];
          }
      }else{
          nearbase_distlist[i] = 0x1ffff;
      }
    }
}
// ts_a - ts_b
int64_t ranging_timestamp_diff(int64_t ts_a, int64_t ts_b)
{
@@ -78,10 +80,9 @@
}
void CalculateDists(int64_t poll_tx_ts)
{
   for(int i=0;i<MAX_NEARBASE_NUM;i++)
   for(int i=0;i<MAX_NEARBASE_NUM+10;i++)
    {
      if(exsistbase_list[i]==KEEP_TIMES)
      if(taglist_keeptime[i+taglist_current_index]==KEEP_TIMES)
      {
         //temp_freq_offset=freq_offset_filter;//测试
@@ -107,7 +108,7 @@
         // correct antenna delay
//    tround -= ranging_ant_delays_get(uwb_app_config.ppdu_params.rx_ant_id);
         // corrected by frequency offset
         tround = (int64_t)((double)tround * (1 - (double)freq_offset_filter / ch_center_freq_map[UWB_CH_NUM]));
         tround = (int64_t)((double)tround * (1 - (double)anc_clockoffset[i] / ch_center_freq_map[UWB_CH_NUM]));
         tround_temp=tround;
         treply_temp=treply;
         tof_i = (int32_t)(tround - treply) / 2;
@@ -120,17 +121,19 @@
//         }
         //tof_f = (double)TIMESTAMP_UNIT_TO_NS((uint32_t)tof_i);//yuan
         tof_f = (double)TIMESTAMP_UNIT_TO_NS(tof_i);
         //distance_tag=(uint16_t)(tof_f * 0.299702547 * VP_VAL - RANGING_CORR);//yuan
         distance_tag=tof_f * 0.299702547 * VP_VAL - RANGING_CORR;
         distance_tag=distance_tag+30;//测试加的offset
         //LOG_INFO(TRACE_MODULE_APP, "distance_tag is %lf\r\n",distance_tag);
         //distance=(uint16_t)(tof_f * 0.299702547 * VP_VAL - RANGING_CORR);//yuan
         distance=tof_f * 0.299702547 * VP_VAL - RANGING_CORR;
         distance=distance+30;//测试加的offset
         //LOG_INFO(TRACE_MODULE_APP, "distance is %lf\r\n",distance);
         
          if(distance_tag>-1000&&distance_tag<100000)
          if(distance>-1000&&distance<100000)
          {
            nearbase_distlist[i]  = distance_tag+(int16_t)g_com_map[OFFSET_AS_TAG];//offset加入上位机校准
          }
            taglist_dist[i+taglist_current_index]  = distance+(int16_t)g_com_map[DIST_OFFSET];//offset未加
          }else{
                  taglist_dist[i] = 0x2ffff;
               }
      }else{
          nearbase_distlist[i] = 0x1ffff;
          //nearbase_distlist[i] = 0x7fff;
      }
         }