数据读取函数,此函数的功能是读取陀螺仪中的角度与加速度的值并做滤波处理,函数名称:void ReadIMUSensorHandle(void),代码注释如下所示:
//读取陀螺仪角度计与加速计中的值
void ReadIMUSensorHandle(void)
{
uint8_t i;
//read raw
MPU6050AccRead(imu.accADC); //读取陀螺仪的加速计寄存器中的值
MPU6050GyroRead(imu.gyroADC); //读取三轴角度值
//tutn to physical
for(i=0; i<3; i++)
{
imu.accRaw[i]= (float)imu.accADC[i] *ACC_SCALE * CONSTANTS_ONE_G ; //计算公式:AD值*选择的满量程/2的15次幂*物理量单位值
imu.gyroRaw[i]=(float)imu.gyroADC[i] * GYRO_SCALE * M_PI_F /180.f; //deg/s 获取三轴角度值
}
imu.accb[0]=LPF2pApply_1(imu.accRaw[0]-imu.accOffset[0]); //将加速计取的数据进行低通滤波操作 X方向 陀螺仪值为当前读取的数值减去飞机静止时校准读取的值
imu.accb[1]=LPF2pApply_2(imu.accRaw[1]-imu.accOffset[1]); //将加速计取的数据进行低通滤波操作 y方向
imu.accb[2]=LPF2pApply_3(imu.accRaw[2]-imu.accOffset[2]); //将加速计取的数据进行低通滤波操作 z方向
#ifdef IMU_SW //定义了软件解算
imu.gyro[0]=LPF2pApply_4(imu.gyroRaw[0]); //将陀螺仪的三轴角度进行低通滤波操作 x
imu.gyro[1]=LPF2pApply_5(imu.gyroRaw[1]); //
imu.gyro[2]=LPF2pApply_6(imu.gyroRaw[2]);
#else
imu.gyro[0]=LPF2pApply_4(imu.gyroRaw[0]-imu.gyroOffset[0]);
imu.gyro[1]=LPF2pApply_5(imu.gyroRaw[1]-imu.gyroOffset[1]);
imu.gyro[2]=LPF2pApply_6(imu.gyroRaw[2]-imu.gyroOffset[2]);
#endif
}
陀螺仪数据的计算公式参见:https://www.it610.com/article/1288446503991451648.htm
其中:imu.accRaw[0]-imu.accOffset[0]的意思是:当无人机静止时进行校准,读取均值为imu.accOffset[0],飞行时用当前读取的值减去静止时读取的值,就为实际值。陀螺仪就是通过这样来测量角度与加速度的