這篇文章給大家分享的是有關(guān)JY901 NOTES TM4串口數(shù)據(jù)讀取的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括彌勒網(wǎng)站建設(shè)、彌勒網(wǎng)站制作、彌勒網(wǎng)頁制作以及彌勒網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,彌勒網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到彌勒省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
一、串口讀取模塊數(shù)據(jù)
我在這里附上我于廠家提供的例程基礎(chǔ)上修改而來的串口數(shù)據(jù)讀取函數(shù)(雖然很簡單但是可以節(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); }
然后按照手冊的協(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í),請務(wù)必不要只看原子哥論壇的這個(gè)帖子,要仔細(xì)看原廠的說明書:
記得事先校準(zhǔn)好再焊到板子上,不然就只有那超長杜邦線接usb轉(zhuǎn)串口拿著四軸轉(zhuǎn)來轉(zhuǎn)去校準(zhǔn)了。。
另外一說,這個(gè)上位機(jī)寫得好爛,很多bug,把我電腦卡死不止一次,遇到bug不要著急,關(guān)了重開,一定要確定連上了模塊且數(shù)據(jù)都o(jì)k再校準(zhǔn),如果點(diǎn)了開始校準(zhǔn)然后橢圓圖像卡住了,就重開重來。。。記得校準(zhǔn)的時(shí)候遠(yuǎn)離強(qiá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)一圈再回來,誤差就會(huì)非常大,PID的話就會(huì)失控。
感謝各位的閱讀!關(guān)于“JY901 NOTES TM4串口數(shù)據(jù)讀取的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!