查看: 1944|回复: 1

[经验] JY901 NOTES TM4串口数据读取、磁力计校准yaw角与尴尬的180度

[复制链接]

该用户从未签到

发表于 2019-8-19 09:20:27 | 显示全部楼层 |阅读模式
分享到:


学生朋友们在对四旋翼姿态解算比较陌生的情况下,想要自己写四旋翼飞控,往往需要借助内置MCU解算姿态的成品惯导模块,JY901就是这样的一款模块。

图为:JY901



微信图片_20190819091628.png


图为:JY901模块的参数
微信图片_20190819091551.png


一、串口读取模块数据

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

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


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


二、上位机磁力计校准

使用原厂的上位机进行磁力计的椭球拟合校准时,要仔细看原厂的说明书:


磁场校准步骤

d52ff93b0c7080dbfc0c2c64db561498abc.jpg


注:
关于Z轴误差的问题
Z轴角度是跟地磁有关的,所以使用的时候尽量避免周围磁和铁的物质的干扰就是要远离磁和铁的物质50cm以上, 会产生磁场干扰的有:磁铁、电脑等用电器、电机,铁等金属物质,螺丝、钢板、交流电等 在远离磁场干扰情况下在进行磁场校准,测试效果会更好!
注意:9轴Z轴是不会有累计误差或者漂移的,如果使用9轴还会有误差,就只有两点 1.使用前一定要进行加计校准和磁场校准。 2.使用时和校准时,一定要远离磁场干扰。如何验证有没有磁场干扰:模块在同一个位置绕Z轴旋转一圈,然后看下总的磁场数据H会不会有很大的变化,如果变化大于20mg说明还是有磁场的干扰。使用环境不变的话,模块只要校准一次就可以了。

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

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

三、尴尬的180度

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

所以要做变换,群里的大佬说+-2pi。



回复

使用道具 举报

该用户从未签到

发表于 2019-12-22 11:59:16 | 显示全部楼层
你好楼主,我遇到了YAW轴尴尬的180度问题,请问一下有具体的解决思路吗。我是发送角度设定值PID闭环控制YAW轴的角度,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /5 下一条

手机版|小黑屋|与非网

GMT+8, 2024-12-19 22:04 , Processed in 0.122000 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.