UWB-DW1000的TWR测距及代码(五)

这篇具有很好参考价值的文章主要介绍了UWB-DW1000的TWR测距及代码(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UWB测距过程很简单,两个设备(A和B)。设备A先发送,设备B等待接收

  1. 设备A 发送 P 给 设备B,此时读取时间戳,也可以等收到应答再进行读取,发送时间戳和接收时间戳都会保留最新一次,只要没有被覆盖(发送两次,或者接收两次),都是可以随时读取的。
  2. 设备B 收到P 后,发送R 给设备A,此时读取接收时间戳,和发送 时间戳。
  3. 设备A收到 R 后,发送F给设备B,读取发送时间戳。
  4. 设备B收到 F后,读取接收时间戳。
  5. 设备A 把所有时间戳发给设备B。
  6. 设备B收到 设备A的时间戳,再结合自己的时间戳根据DS——TWR算出两者之间的距离。
  7. 设备B算完距离后再打包发给设备A。
注意,因为时间戳是五个字节的,而我们为了方便发送,是只用了四个字节,舍掉高字节。如果前面的时间戳比后面的时间戳大,说明已经过了一个周期,后者需加上一个周期后再进行计算。因为跑完32位计数都需要 15.65 ps x 2^32 = 67.216ms ,所以不用担心会溢出两次的问题,因为一个测距过程也就是几个毫秒内完成,光速传播。

dw1000测距,UWB,无人机,开源,无人机文章来源地址https://www.toymoban.com/news/detail-618526.html

//首先发送端
static volatile uint8_t stage;
static uint32_t TX_set_delay_times;
static volatile uint64_t TX_poll_times,TX_resp_times,TX_final_times;
static uint8_t Poll_Buff[]={0x15,0x16,0xab,0,0};        //第一次发送无关数据
static uint8_t Resp_Buff[5]={0};        //接收回应的无关数据的buff
static uint8_t First_Buff[]={0x15,0x16,0xae,0,0,0,0,0,0,0,0,0,0};  //发送第一次发送和接收的时间戳
static uint8_t NO_Buff[5]={0};  //接收无关信息
static uint8_t Final_Buff[9]={0x15,0x16,0xbc,0,0,0,0,0,0};  //发送最后一次发送数据的时间戳

static uint8_t Distance_Buff[13]={0};   //接收距离
//static uint8_t Tx_Final_Buff[]={0x15,0x16,0xae,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0,0};  //最后一次发送时间戳信息过去

unsigned char LCD_Buff[10];
//为了减少发送次数,把时间戳放在握手协议里面发了
int main(void)   
{
	  
    uint8 len = 0,i;  
    /* Start with board specific hardware init. */
    peripherals_init();
    printf("hello dwm1000!\r\n");
   // dwt_dumpregisters();
    /* 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(); /* Target specific drive of RSTn line into DW1000 low for a period. */

    spi_set_rate_low();
    if(dwt_initialise(DWT_LOADUCODE) == -1)
    {
        printf("dwm1000 init fail!\r\n");
        OLED_ShowString(0,0,"INIT FAIL");
        while (1)
        {
            STM_EVAL_LEDOn(LED1);
            deca_sleep(100);
            STM_EVAL_LEDOff(LED1);
            deca_sleep(100);
        }
    }
    spi_set_rate_high();

    /* Configure DW1000. See NOTE 6 below. */
    dwt_configure(&config);
    dwt_setleds(2);
    /* Apply default antenna delay value. See NOTE 1 below. */
    dwt_setrxantennadelay(RX_ANT_DLY);
    dwt_settxantennadelay(TX_ANT_DLY);
    OLED_ShowString(0,0,"INIT PASS");
 
    printf("init pass!\r\n");
    deca_sleep(1000);
while(1)
{
	
	dwt_setrxtimeout(8300);    //设置接收超时时间
	dwt_setrxmode(0,0,0);      //设置接收为正常模式
		 
	dwt_writetxdata(sizeof(Poll_Buff), Poll_Buff, 0);
	dwt_writetxfctrl(sizeof(Poll_Buff), 0);
	dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);
				
	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))) 
	 { }; //等待接收完成
 
 if (status_reg & SYS_STATUS_RXFCG)
{	
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态
len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获取接收长度
 if (len <= sizeof(Resp_Buff))
	{
		dwt_readrxdata(Resp_Buff, len, 0);
	}	
if(Resp_Buff[0]==0x15&&Resp_Buff[1]==0x16)  //判断头
{
	if(Resp_Buff[2] ==0xac) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号
		{
			TX_poll_times = get_tx_timestamp_u64();  //获取发送端第一次发送的时间戳
			TX_resp_times = get_rx_timestamp_u64();  //获取发送端接收应答数据的的时间戳
	
//   TX_set_delay_times = (TX_resp_times + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;  //获取延时发送时间点
//   dwt_setdelayedtrxtime(TX_set_delay_times); //设置延时发送时间点
	
// TX_final_times = (((uint64_t)(TX_set_delay_times&0xfffffffe))<<8) + TX_ANT_DLY;  //获取发送端最后一次发送的时间戳
					
		final_msg_set_ts(&First_Buff[3], TX_poll_times);
		final_msg_set_ts(&First_Buff[7], TX_resp_times);
					
		dwt_writetxdata(sizeof(First_Buff), First_Buff, 0);
		dwt_writetxfctrl(sizeof(First_Buff), 0);
		dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);
		
		while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))) 
	 { }; //等待接收距离完成
					 
 if (status_reg & SYS_STATUS_RXFCG)
		{
//							
		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态	
		len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获取接收长度
		if (len <= sizeof(NO_Buff))
			{
				dwt_readrxdata(NO_Buff, len, 0);
			}	
		if((NO_Buff[0]==0x15)&&(NO_Buff[1]==0x16))  //判断头
	{
		if(NO_Buff[2] ==0xad) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号
		{						
		 TX_final_times = get_tx_timestamp_u64();						
	   final_msg_set_ts(&Final_Buff[3], TX_final_times); //将时间戳放入buff发送给接收端
									
		dwt_writetxdata(sizeof(Final_Buff), Final_Buff, 0);
	  dwt_writetxfctrl(sizeof(Final_Buff), 0);
		dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);					
	 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))) 
				{ }; //等待接收距离完成
									 
	 if (status_reg & SYS_STATUS_RXFCG)
		{ 
			dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态
		  len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获取接收长度
			if (len <= sizeof(Distance_Buff))
			 {
				dwt_readrxdata(Distance_Buff, len, 0);
			}
		 if((Distance_Buff[0]==0x15)&&(Distance_Buff[1]==0x16))  //判断头
		{
			if(Distance_Buff[2] ==0xdc) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号
		{
			Distance = (double)Distance_Buff[3] +  ((double)Distance_Buff[4])/100;   	//接收距离
			printf("Distance=%lf\r\n",Distance);
			sprintf(LCD_Buff, "Dis:%3.2fm", Distance);										
			OLED_ShowString(0,2,LCD_Buff);
		}
		else 
		{
			printf("接收距离判断特殊位失败\r\n");
		}
									 
	 }
	 else 
		{
			printf("接收距离判断头错误\r\n");
	  }
	  }
	 else
		{
		 printf("TX-F接收失败\r\n");							 
	  }			
	}
	else
	{
	 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); //清除错误标志
	 printf("发送端接收距离信息的特有标准错误\r\n");
	}
	}
	else
	{
			printf("发送端接收距离信息的帧头错误\r\n");
	}
	}
	else
	{
		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); //清除错误标志
	 }							
	}
else
{
 // stage = POLL;  //数据错误,从头开始	
	printf("发送端应答接收特定标签号错误\r\n");
//	for(i=0;i<len;i++)
//		{
//			 printf("buff[%d]=%x\r\n",i,Tx_Resp_Buff[i]);
//			Tx_Resp_Buff[i] =0;
//		}
		}
	}
	else
	{
		printf("发送端应答接收头错误\r\n");
//	for(i=0;i<len;i++)
//		{
//			printf("buff[%d]=%x\r\n",i,Tx_Resp_Buff[i]);
//			Tx_Resp_Buff[i] =0;
//		}
		}	
	}
	else
	{
		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); //清除错误标志
		printf("发送端应答接收数据错误 !\r\n");
//			for(i=0;i<len;i++)
//			{
//			 printf("buff[%d]=%x\r\n",i,Tx_Resp_Buff[i]);
//				Tx_Resp_Buff[i] =0;
//			}
   } 				 
	}													
				
  }
//首先接收端
#define CYCLE (4294967295.0) //一个周期

unsigned char LCD_Buff[10];
static volatile uint8_t stage;

static  uint32_t TX_poll_times,TX_resp_times,TX_final_times;
static  uint32_t RX_poll_times,RX_resp_times,RX_final_times;

static volatile uint64_t RX_poll_times_64,RX_resp_times_64,RX_final_times_64;
	

static uint8_t Poll_Buff[5]={0};                //第一次接收数据的buff
static uint8_t Resp_Buff[5]={0x15,0x16,0xac,0,0};   //回应无关数据给发送端数据的buff
static uint8_t First_Buff[13]={0};  //  接收发送端第一次发送和接收的时间戳
static uint8_t NO_Buff[5]={0x15,0x16,0xad,0,0};     //回应无关信息
static uint8_t Final_Buff[9]={0};     //接收发送端最后一次发送的时间戳

static uint8_t Distance_Buff[13]={0x15,0x16,0xdc,0,0,0,0}; //发送距离

 double Ra,Rb,Da,Db,Distance;

int tof_dtu;

int main(void)
{
    
    uint8 len = 0,i;
    /* Start with board specific hardware init. */
    peripherals_init();
    printf("hello dwm1000!\r\n");
   // dwt_dumpregisters();
    /* 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(); /* Target specific drive of RSTn line into DW1000 low for a period. */

    spi_set_rate_low();
    if(dwt_initialise(DWT_LOADUCODE) == -1)
    {
        printf("dwm1000 init fail!\r\n");
        OLED_ShowString(0,0,"INIT FAIL");
        while (1)
        {
            STM_EVAL_LEDOn(LED1);
            deca_sleep(100);
            STM_EVAL_LEDOff(LED1);
            deca_sleep(100);
        }
    }
    spi_set_rate_high();

    /* Configure DW1000. See NOTE 6 below. */
    dwt_configure(&config);
    dwt_setleds(1);
    /* Apply default antenna delay value. See NOTE 1 below. */
    dwt_setrxantennadelay(RX_ANT_DLY);
    dwt_settxantennadelay(TX_ANT_DLY);
    OLED_ShowString(0,0,"INIT PASS");

    printf("init pass!\r\n");

    while(1)
		{
			
 dwt_setrxtimeout(0);  
 dwt_setrxmode(0,0,0);   
 dwt_rxenable(0);

 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
	{ };
	
	if (status_reg & SYS_STATUS_RXFCG)
	{
			
	 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态

			
		len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
		
			if (len <= sizeof(Poll_Buff))
			{
					dwt_readrxdata(Poll_Buff, len, 0);
			}
			
			if(Poll_Buff[0]==0x15&&Poll_Buff[1]==0x16)  //判断头
		{
				if(Poll_Buff[2] ==0xab) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号
				{
					RX_poll_times_64 = get_rx_timestamp_u64();  //获取接收端第一次接收数据的的时间戳
					
			 dwt_setrxaftertxdelay(0);  //设置发送接收后打开接收的延时时间
			 dwt_setrxtimeout(6800);    //设置接收超时时间
			 dwt_setrxmode(0,0,0);      //设置接收为正常模式
			
			 dwt_writetxdata(sizeof(Resp_Buff), Resp_Buff, 0);
			 dwt_writetxfctrl(sizeof(Resp_Buff), 0);
			 dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);	

			 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
			{ };
		
		if (status_reg & SYS_STATUS_RXFCG)
		{
				
			dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态
				
			len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
		//	printf("len =%d\r\n",len);
				if (len <= sizeof(First_Buff))
				{
						dwt_readrxdata(First_Buff, len, 0);
				}
				
				if(First_Buff[0]==0x15&&First_Buff[1]==0x16)  //判断头
			{
					if(First_Buff[2] ==0xae) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号
	{			
		RX_resp_times_64 = get_tx_timestamp_u64();  //获取接收端第一次发送数据的的时间戳
		RX_final_times_64 = get_rx_timestamp_u64();  //获取接收端最后一次接收的时间戳
						
		final_msg_get_ts(&First_Buff[3], &TX_poll_times);
		final_msg_get_ts(&First_Buff[7], &TX_resp_times);

						
		RX_poll_times = (uint32_t)RX_poll_times_64;
		RX_resp_times = (uint32_t)RX_resp_times_64;		
		RX_final_times = (uint32_t)RX_final_times_64;    //得到接收端的时间戳
						
		dwt_writetxdata(sizeof(NO_Buff), NO_Buff, 0);
		dwt_writetxfctrl(sizeof(NO_Buff), 0);
	   dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);	

	 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
					{ }; 
					 
	if (status_reg & SYS_STATUS_RXFCG)
		{
			dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态
	 len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
		//	printf("len =%d\r\n",len);
	 if (len <= sizeof(Final_Buff))
			 {
				dwt_readrxdata(Final_Buff, len, 0);
			}
	 if(Final_Buff[0]==0x15&&Final_Buff[1]==0x16)  //判断头
			{
			if(Final_Buff[2] ==0xbc) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号
			{
			 final_msg_get_ts(&Final_Buff[3], &TX_final_times); //提取发送端的时间戳
						
			// printf("/*****************************************************/\r\n");
						
//						Ra = (double)(TX_resp_times - TX_poll_times);
//						Da = (double)(TX_final_times - TX_resp_times);
//						Rb = (double)(RX_final_times - RX_resp_times);
//						Db = (double)(RX_resp_times - RX_poll_times);
//														
				if(TX_resp_times > TX_poll_times)  //判断是否超过一周期
				{
					Ra = (double)((double)TX_resp_times - (double)TX_poll_times);
				}
				else
				{
						//	 printf("/****************************/\r\n");
				 Ra = (double)((double)TX_resp_times - (double)TX_poll_times);
						//	 printf("Ra=%lf\r\n",Ra);
				 Ra += CYCLE;   //加上周期
							// printf("Ra=%lf\r\n",Ra);
				}
		
				if(TX_final_times > TX_resp_times)
				{
					Da = (double)((double)TX_final_times - (double)TX_resp_times);
				}
				else
				{
							// printf("/****************************/\r\n");
								
				 Da = (double)((double)TX_final_times - (double)TX_resp_times);
						//	 printf("Da=%lf\r\n",Da);
				 Da += CYCLE;
						//	 printf("Da=%lf\r\n",Da);
				}
						
				if(RX_final_times > RX_resp_times)
				{		
				 Rb = (double)((double)RX_final_times - (double)RX_resp_times);
				}
				else
				{
							 //printf("/****************************/\r\n"); 
			  Rb = (double)((double)RX_final_times - (double)RX_resp_times);
							// printf("Rb=%lf\r\n",Rb);
		 	  Rb += CYCLE;
							// printf("Rb=%lf\r\n",Rb);
			 }
						
			if(RX_resp_times > RX_poll_times)  
			{
				Db = (double)(RX_resp_times - RX_poll_times);
			}
			else
			{
					//printf("/****************************/\r\n");
			 Db = (double)((double)RX_resp_times - (double)RX_poll_times);
				//	printf("Db=%lf\r\n",Db);
			Db += CYCLE;
				//	printf("Db=%lf\r\n",Db);
		}					
			Distance =0;
			tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));
			tof = tof_dtu * DWT_TIME_UNITS;
			Distance = tof * SPEED_OF_LIGHT;
					
					//printf("Dis=%f\r\n",Distance);
					
		Distance = Distance - dwt_getrangebias(config.chan,(float)Distance, config.prf);//距离减去矫正系数
						
					
//						printf("Ra =%lf\r\n",Ra);
//						printf("Rb =%lf\r\n",Rb);
//						printf("Da =%lf\r\n",Da);
//						printf("Db =%lf\r\n",Db);
                          													
//						printf("Ra-Db =%lf\r\n",Ra-Db);
//						printf("Rb-Da =%lf\r\n",Rb-Da);
//												
				printf("Dis=%f\r\n",Distance);
				int temp =0;
				temp = (int)(Distance*100);
					//printf("temp=%d\r\n",temp);
				Distance_Buff[3] = temp/100; //取整
				Distance_Buff[4] = temp%100; //取小数   //打包发送距离
					
//					printf("/**************************************************/\r\n");	
//					printf("TX_poll_times =%u\r\n",TX_poll_times);
//					printf("RX_poll_times =%u\r\n",RX_poll_times);
//					printf("RX_resp_times =%u\r\n",RX_resp_times);
//					printf("TX_resp_times =%u\r\n",TX_resp_times);
//					printf("TX_final_times =%u\r\n",TX_final_times);
//					printf("RX_final_times =%u\r\n",RX_final_times);
//								

//					printf("Distance_Buff[3]=%d\r\n",Distance_Buff[3]);
//					printf("Distance_Buff[4]=%d\r\n",Distance_Buff[4]);
				sprintf(LCD_Buff, "Dis:%3.2fm", Distance);
												
				OLED_ShowString(0,2,LCD_Buff);
					
						
				dwt_writetxdata(sizeof(Distance_Buff), Distance_Buff, 0);
				dwt_writetxfctrl(sizeof(Distance_Buff), 0);
			  dwt_starttx(DWT_START_TX_IMMEDIATE);	
			}
			else
			{
				printf("端接收接收最后一次时间戳失败\r\n");
			}
				}
			}
			else
		{
			dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
			printf("接收发送端最后一次时间戳失败\r\n");
		}
	}
		else
			{ 
					//stage = POLL;  //数据错误,从头开始
					
		printf("接收端最后一次接收特定标签号错误\r\n");
//					for(i=0;i<len;i++)
//					{
//						printf("buff[%d]=%x\r\n",i,Rx_Final_Buff[i]);
//						Rx_Final_Buff[i] =0;
//				}
		}
		
	 }
		else
	{ 
			 //stage = POLL;  //数据错误,从头开始
			
		printf("接收端最后一次接收头错误\r\n");
			 
//			for(i=0;i<len;i++)
//			{
//				printf("buff[%d]=%x\r\n",i,Rx_Final_Buff[i]);
//				Rx_Final_Buff[i] =0;
//			}
		 }
		
	}
 else
	{
		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
			//stage = POLL;
//									
	printf("接收端最后一次接收数据错误\r\n");
//									 
//			for(i=0;i<len;i++)
//			{
//				printf("buff[%d]=%x\r\n",i,Rx_Final_Buff[i]);
//				Rx_Final_Buff[i] =0;
//			}
			
	}							 
				}
	else
		{
			printf("接收端第一次接收特定标签号错误\r\n");
//					for(i=0;i<len;i++)
//					{
//						printf("buff[%d]=%x\r\n",i,Rx_Poll_Buff[i]);
//						Rx_Poll_Buff[i] =0;
//					}
				}
		
  }
	else
	{ 
			printf("接收端第一次接收头错误\r\n");
//			 for(i=0;i<len;i++)
//					{
//						printf("buff[%d]=%x\r\n",i,Rx_Poll_Buff[i]);
//						Rx_Poll_Buff[i] =0;
//					}
		 }	
	}
 else
	{	
	dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
//										stage = POLL;
//									
	printf("接收端第一次接收数据错误\r\n");
//			for(i=0;i<len;i++)
//				{
//					printf("buff[%d]=%x\r\n",i,Rx_Poll_Buff[i]);
//					Rx_Poll_Buff[i] =0;
//				}
	}
	}
}

到了这里,关于UWB-DW1000的TWR测距及代码(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Raspberry Pi和双目摄像头的无人机目标识别、跟踪与实时测距系统开发

    硬件选择: Raspberry Pi 4: 它是一款功能强大的微型计算机,可以轻松地与各种传感器和摄像头配合使用。 双目摄像头: 例如选择Raspberry Pi相容的Arducam双目摄像头,双目摄像头可以捕捉到两个略有差异的图像,这对于空间测距非常重要。 算法: 使用**立体视觉(Stereo Vision)**算法

    2024年02月12日
    浏览(33)
  • 惠普232dw/233dw激光打印机手机WIFI连接实操、初始化

    同时按住wifi和x键持续5秒以上,松开时开始自动初始化,等待一段时间,初始化完成, 然后app打开,添加打印机

    2024年02月13日
    浏览(26)
  • 数据仓库介绍(DW)

    第一章:了解DW 1.1什么是数据仓库? 数据仓库(Data Warehouse) ,简称DW。数据仓库顾名思义,是⼀个 很⼤的数据存储集合 ,出于企业的 分析性报告 和 决策⽀持 ⽬的⽽创建, 对多样的业务数据进⾏筛选与整合 。它能为企业提供⼀定的BI(商业智能:例如数据挖掘、数据分析和

    2023年04月13日
    浏览(26)
  • 数据仓库DW-理论知识储备

    数据仓库具备 采集数据、存储数据、分析和计算 的功能,最后得出一些有用的数据,一些目标数据来使用。 采集来自不同源的数据,然后对这些数据进行分析和计算得出一些有用的指标,提供数据决策支持。 数据的来源有:系统的业务数据、用户的行为数据、爬虫数据等。

    2024年02月07日
    浏览(28)
  • 计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

    该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。 该项目使用了 YOLOv5目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪! 教程博客_传送门链接-------单目测

    2024年02月08日
    浏览(42)
  • DW_apb_i2c 使用介绍1

    目录 2.0 DW_apb_i2c 版本 2.1 DW_apb_i2c 逻辑设计架构 2.2 DW_apb_i2c 特点  2.3 DW_apb_i2c 功能使用介绍 2.3.1 工作模式 2.3.2 开始信号 2.3.3 停止信号 2.3.4 从机地址模式 2.3.5 输入滤波功能 2.3.6 SCL速率配置 2.3.6.1 SCL 配置寄存器 2.3.6.2 SCL 计算公式  2.3.6.3 SCL 实例计算 2.3.7 总线清除功能 2.

    2024年02月15日
    浏览(24)
  • 第二章 DW_apb_i2c 介绍

    目录 2.0 DW_apb_i2c 版本 2.1 DW_apb_i2c 逻辑设计架构 2.2 DW_apb_i2c 特点  2.3 DW_apb_i2c 功能使用介绍 2.3.1 工作模式 2.3.2 开始信号 2.3.3 停止信号 2.3.4 从机地址模式 2.3.5 输入滤波功能 2.3.6 SCL速率配置 2.3.6.1 SCL 配置寄存器 2.3.6.2 SCL 计算公式  2.3.6.3 SCL 实例计算 2.3.7 总线清除功能 2.

    2024年02月06日
    浏览(29)
  • 大麦DW11S不拆机安全刷机,小白保姆级教程

      由于大麦DW11S自身功能的限制,导致这款路由器在使用过程中很是鸡肋,连最基本的桥接功能都被阉割掉了,所以用之无用弃之可惜。   刷机之前要简单了解一下路由器的大致配置,以及刷机注意事项和准备条件。 大麦DW11S路由器参数: CPU: MediaTek MT7628AN/MT7688AN ver

    2024年02月21日
    浏览(41)
  • 详解数据仓库和数据集市:ODS、DW、DWD、DWM、DWS、ADS

    Data warehouse(可简写为DW或者DWH)数据仓库,是在数据库已经大量存在的情况下,它是一整套包括了etl、调度、建模在内的完整的理论体系。 数据仓库的方案建设的目的,是为前端查询和分析作为基础,主要应用于OLAP(on-line Analytical Processing),支持复杂的分析操作,侧重决

    2024年02月08日
    浏览(29)
  • SOC系统经典IP介绍以及使用方法说明之dw_i2c

    第三章 DW_i2c功能及使用流程介绍 文章目录 前言 一、功能介绍 1.1 i2c写操作: 1.1.1 详细flow介绍 1.2 i2c读操作: 1.2.1 详细flow介绍 二、软件流程介绍 2.1 定义WDT中断服务子程序 2.2 定义main函数 三、总结      按照i2c的协议,i2c的时钟由master方提供,master可以向slave发送数据,也

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包