R6093U陀螺仪数据的读取和处理方式(基于STC15W)

这个型号大家可能没有听过,我也是第一次知道这个型号,某宝上也是只有一家买这个东西。经过几天的调试也是成功的读取到了正确的信息。现在将方法分享给大家。

1.传感器介绍

Cruizcore®R6093U是用于在动态条件下测量角速率、角速度、航向角(也称为定向或偏航)、仰俯、横滚姿态信息的数字陀螺仪和加速度计模组。这是一个高度紧凑,轻巧,完全自足的设备。R6093U内部包含3轴MEMS陀螺仪、3轴加速度计,内部电压调节器,信号处理电路,AD转换器和运行我们的专利纠错算法的RISC微处理器。R6093U使用自适应降阶卡尔曼滤波器来减少影响这种传感器的误差(即偏置漂移,规模因子、不对称),因此它能输出非常精确稳定的角速度和航向角。启动时间小于1秒,用于计算偏置参数,此后不需要进一步校准。R6093U是最具性价比的6轴惯导解决方案。

2.性能指标

R6093U陀螺仪数据的读取和处理方式(基于STC15W)_第1张图片

3.数据格式

传感器串口输出的 方式和波特率信息。
R6093U陀螺仪数据的读取和处理方式(基于STC15W)_第2张图片
在数据包中 ,每个Byte的作用和代表的什么数据都做了解释。
R6093U陀螺仪数据的读取和处理方式(基于STC15W)_第3张图片

4.数据的接收和处理

我们先看下这个每个Byte 表示的信息都做了解释 ,同时在数据包中有CHECKSUM数据校验位,可以使读出的数据更加准确。
R6093U陀螺仪数据的读取和处理方式(基于STC15W)_第4张图片
串口接收程序如下:

/串口1中断处理程序
void INT_Uart1(void) interrupt 4
{
     
    
    if(RI)//清空读中断标志位
	{
     
		RI = 0;
        if(Checksum == 0)
        {
     
            RxD_Data[count] = SBUF;
            if(RxD_Data[0]== 0xA6)//判断数据头
            {
     
              count++;
              if(count == 26)//判断数据尾
              {
     
                  Checksum=1;//使能读取
                  count =0; 
              }
           }
           else{
     
               count = 0;
           }
       }
    }
	if(TI)//清空发送中断标志位
	{
     
		TI = 0;
		busy1 = 0;
	}
}

在接收到26个完整数据包时 使能 CHECKSUM校验标志位,在读取数据时进行数据的校验和转化。具体代码如下:

void R6090u_Read(R6093U_Data_TypeDef *R6093U_Data)
{
     
    unsigned char Check_Temp=0,i;
    if(Checksum == 1)
    {
     
        for(i=2;i<25;i++)
        {
     
            Check_Temp += RxD_Data[i];
            //校验成功
            if(Check_Temp == RxD_Data[25]){
       
                R6093U_Data->Roll = (float)((short)(RxD_Data[4]<<8|RxD_Data[3])/100.0);
                R6093U_Data->Pitch = (float)((short)(RxD_Data[6]<<8|RxD_Data[5])/100.0);
                R6093U_Data->Yaw = (float)((short)(RxD_Data[8]<<8|RxD_Data[7])/100.0);
                R6093U_Data->Roll_Rate = (float)((short)(RxD_Data[10]<<8|RxD_Data[9])/100.0);
                R6093U_Data->Pitch_Rate = (float)((short)(RxD_Data[12]<<8|RxD_Data[11])/100.0);
                R6093U_Data->Yaw_Rate = (float)((short)(RxD_Data[14]<<8|RxD_Data[13])/100.0);
                R6093U_Data->X_Axis = (float)((short)(RxD_Data[16]<<8|RxD_Data[15])/1000.0);
                R6093U_Data->Y_Axis = (float)((short)(RxD_Data[18]<<8|RxD_Data[17])/1000.0);
                R6093U_Data->Z_Axis = (float)((short)(RxD_Data[20]<<8|RxD_Data[19])/1000.0);
            }
        }
        Checksum = 0;//使能接收
    }

}

在校验完成后 开始数据的转化和处理。结束之后重新打开接收。开始接收下一次数据。

最后通过串口程序输出下读出的数据:

printf("samples:%.2f,%.2f,%.2f\n",R6093U_Data.Roll,R6093U_Data.Pitch,(R6093U_Data.Yaw - State_Jiao_ShuJu));

到这里接结束了,希望可以帮助到正在调试这个型号的你,喜欢的话支持以下博主。哈哈。 再见。

你可能感兴趣的:(算法,传感器)