5-MPU6050采集的数据

后天要去公司实习了,带着些许担忧,终于从学校走出去了,不知江湖的水有多深,一切都是待定!

把程序移植之后,发现我还没真正研究过MPU6050这个传感器,结合程序我大概了解了下,先看下图

5-MPU6050采集的数据_第1张图片

上图是与加速度传感器有关的寄存器参数,采集到的三轴方向上的值都是16位的,选用的满量程范围是正负8g,4096/g的意思就是说当某一方向上的重力加速度为1g时,该寄存器的值就是4096。采集到的陀螺仪的值也是类似的,如图所示:


当某一方向的每秒钟转1度的时候,采集到的值就是16.4。比之前的有些传感器使用电压值然后再计算角度容易多了,数字传感器就是直接。

在程序中,关于传感器的数值用了一个结构体定义:

typedef struct
{
    // 参数信息,pos=0。
    uint8_t version; // 参数结构的版本。
    uint8_t length;  // 参数总长度,单位:字,即字节数/4。
    uint16_t reserve_zero_0;
    //
    // 传感器校正参数,pos=[1,18]。
    float acc_offset[3];
    float acc_gain[3];
    float gyr_offset[3];
    float gyr_gain[3];
    float mag_offset[3];
    float mag_gain[3];
    //
    // 四元数表示的水平面,pos=[19,22]。
    quaternion horizon;
    //
    // 控制参数,[xyz][pid],pos=[23,31]。
    struct
    {
        float p,i,d; // 顺序严格按P、I、D。
    }xyz_pid[3];
    //
    uint32_t crc;
} param_t;

其中,float acc_offset[3];float acc_gain[3];float gyr_offset[3];float gyr_gain[3];是本次需要关心的,再从初始化函数

得到些端倪,分为增益和偏移量,初始偏移量都是零,没问题,加速度最终量化成个g/LSB,陀螺仪量化成rad/s(弧度每秒):

        param->acc_gain[i]   = 9.7883 / 4096.0;//加速度传感器8g,灵敏度是4096LSB/g
        param->acc_offset[i] = 0;
        param->gyr_gain[i]   = (3.1415926/180.0) / 16.4;//陀螺仪满刻度范围2000°/s,灵敏度是16.4LSB/°/s
        param->gyr_offset[i] = 0;

前期的参数都已经确定了,当采集到实时传感器的数据后,通过以下公式将数据量化

acc[i] = (p->acc_offset[i] + mpu6050_rawData.acc[i]) * p->acc_gain[i];-----加速度

gyr[i] = (p->gyr_offset[i] + mpu6050_rawData.gyr[i]) * p->gyr_gain[i];----陀螺仪

然后在对量化后的acc和gyr的值做平均,最终叉积法融合陀螺和加速度。

你可能感兴趣的:(5-MPU6050采集的数据)