千家信息网

JY901 NOTES TM4串口数据读取的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关JY901 NOTES TM4串口数据读取的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、串口读取模块数据我在这里附上我于厂家提供的例
千家信息网最后更新 2026年11月01日JY901 NOTES TM4串口数据读取的示例分析

这篇文章给大家分享的是有关JY901 NOTES TM4串口数据读取的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、串口读取模块数据

我在这里附上我于厂家提供的例程基础上修改而来的串口数据读取函数(虽然很简单但是可以节省看到帖子的老哥的时间)。

首先TM4串口1初始化:

#define UART1Baud  115200void 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);        }

然后按照手册的协议解读:

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;        }}

在串口中断里调用这个就行了。

二、上位机磁力计校准

使用原厂的上位机进行磁力计的椭球拟合校准时,请务必不要只看原子哥论坛的这个帖子,要仔细看原厂的说明书:

记得事先校准好再焊到板子上,不然就只有那超长杜邦线接usb转串口拿着四轴转来转去校准了。。

另外一说,这个上位机写得好烂,很多bug,把我电脑卡死不止一次,遇到bug不要着急,关了重开,一定要确定连上了模块且数据都ok再校准,如果点了开始校准然后椭圆图像卡住了,就重开重来。。。记得校准的时候远离强磁场。

三、尴尬的180度

当你完成磁力计校准之后,你会发现在某个yaw角度,数值是170多度,然后当你再转一点yaw角,上位机就会显示-170多度,因为这玩意输出的范围是-180~180度,如果直接带去控制,那么这种情况下,你的四轴认为自己转了一圈,要转一圈再回来,误差就会非常大,PID的话就会失控。

感谢各位的阅读!关于"JY901 NOTES TM4串口数据读取的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0