溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JY901 NOTES TM4串口數(shù)據(jù)讀取的示例分析

發(fā)布時(shí)間:2022-01-14 15:31:34 來(lái)源:億速云 閱讀:101 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家分享的是有關(guān)JY901 NOTES TM4串口數(shù)據(jù)讀取的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來(lái)看看吧。

一、串口讀取模塊數(shù)據(jù)

我在這里附上我于廠家提供的例程基礎(chǔ)上修改而來(lái)的串口數(shù)據(jù)讀取函數(shù)(雖然很簡(jiǎn)單但是可以節(jié)省看到帖子的老哥的時(shí)間)。

首先TM4串口1初始化:

#define UART1Baud  115200
void initUART1()
{	
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);		
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
	ROM_GPIOPinConfigure(GPIO_PB0_U1RX);
	ROM_GPIOPinConfigure(GPIO_PB1_U1TX);
	ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
	ROM_UARTConfigSetExpClk(UART1_BASE, ROM_SysCtlClockGet(), UART1Baud,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
	ROM_IntEnable(INT_UART1);
	UARTFIFODisable(UART1_BASE);
	UARTIntRegister(UART1_BASE,UART1_Handler);
	ROM_UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT);	
}

然后按照手冊(cè)的協(xié)議解讀:

float roll=0,pitch=0,yaw=0;								
float accX=0,accY=0,accZ=0;								
float gyrX=0,gyrY=0,gyrZ=0;
							
void JY901_GetOneByte(u8 data)
{
		static u8 ucRxBuffer[12];
		static u8 ucRxCnt = 0;	
	
	ucRxBuffer[ucRxCnt++]=data;
	if(ucRxBuffer[0]!=0x55) 
	{
		ucRxCnt=0;
		return;																																	  
	}
	if (ucRxCnt<11) {return;}
	else
	{
		switch(ucRxBuffer[1])
		{
			
			case 0x51:	
				accX=(float)((int16_t)(ucRxBuffer[3]<<8)|ucRxBuffer[2])/32768*16*9.8f;
				accY=(float)((int16_t)(ucRxBuffer[5]<<8)|ucRxBuffer[4])/32768*16*9.8f;
				accZ=(float)((int16_t)(ucRxBuffer[7]<<8)|ucRxBuffer[6])/32768*16*9.8f;
				break;
			case 0x52:	
				gyrX=(float)((int16_t)(ucRxBuffer[3]<<8)|ucRxBuffer[2])/32768*2000;
				gyrY=(float)((int16_t)(ucRxBuffer[5]<<8)|ucRxBuffer[4])/32768*2000;
				gyrZ=(float)((int16_t)(ucRxBuffer[7]<<8)|ucRxBuffer[6])/32768*2000;
//				flag.gyro_ok=1;
				break;
			case 0x53:	
				roll	=(float)((int16_t)(ucRxBuffer[3]<<8)|ucRxBuffer[2])/32768*180;
				pitch =(float)((int16_t)(ucRxBuffer[5]<<8)|ucRxBuffer[4])/32768*180;
				yaw 	=(float)((int16_t)(ucRxBuffer[7]<<8)|ucRxBuffer[6])/32768*180;
//				printf("roll:%.2f pitch:%.2f yaw:%.2f \n",roll,pitch,yaw);
//				printf("accX:%.2f accY:%.2f accZ:%.2f \n",accX,accY,accZ);
//				flag.angle_ok=1;
				break;
		}
		ucRxCnt=0;
	}
}

在串口中斷里調(diào)用這個(gè)就行了。

二、上位機(jī)磁力計(jì)校準(zhǔn)

使用原廠的上位機(jī)進(jìn)行磁力計(jì)的橢球擬合校準(zhǔn)時(shí),請(qǐng)務(wù)必不要只看原子哥論壇的這個(gè)帖子,要仔細(xì)看原廠的說(shuō)明書:JY901 NOTES TM4串口數(shù)據(jù)讀取的示例分析

記得事先校準(zhǔn)好再焊到板子上,不然就只有那超長(zhǎng)杜邦線接usb轉(zhuǎn)串口拿著四軸轉(zhuǎn)來(lái)轉(zhuǎn)去校準(zhǔn)了。。

另外一說(shuō),這個(gè)上位機(jī)寫得好爛,很多bug,把我電腦卡死不止一次,遇到bug不要著急,關(guān)了重開,一定要確定連上了模塊且數(shù)據(jù)都o(jì)k再校準(zhǔn),如果點(diǎn)了開始校準(zhǔn)然后橢圓圖像卡住了,就重開重來(lái)。。。記得校準(zhǔn)的時(shí)候遠(yuǎn)離強(qiáng)磁場(chǎng)。

三、尷尬的180度

當(dāng)你完成磁力計(jì)校準(zhǔn)之后,你會(huì)發(fā)現(xiàn)在某個(gè)yaw角度,數(shù)值是170多度,然后當(dāng)你再轉(zhuǎn)一點(diǎn)yaw角,上位機(jī)就會(huì)顯示-170多度,因?yàn)檫@玩意輸出的范圍是-180~180度,如果直接帶去控制,那么這種情況下,你的四軸認(rèn)為自己轉(zhuǎn)了一圈,要轉(zhuǎn)一圈再回來(lái),誤差就會(huì)非常大,PID的話就會(huì)失控。

感謝各位的閱讀!關(guān)于“JY901 NOTES TM4串口數(shù)據(jù)讀取的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI