早就听闻BMI088传感器性能好,抗震性强,精度高的大名了,各种商业飞控都在用它,为了探究它到底有没有这么厉害,还是徒有虚名,本文决定用BMI088传感器进行震动性能测试并和其它牌子的传感器进行对比分析。
由于市面上买不到成品的bmi088模块,所以我自己画了一个,原理图如下所示:
这是个7轴的imu模块,集成了一个bmi088,和一个气压计spl06001,相当的简陋,连个稳压的没有。
由于芯片封装很小,不太好焊接,于是我把芯片寄给嘉立创smt。
做好了以后,在四旋翼实验平台上进行飞行测试,震源来自四个电机,记录下飞行时传感器输出的数据,并对比其它品牌的imu的数据。
z轴角速度数据对比
y轴角速度数据对比
x轴角速度数据对比
x轴加速度数据对比
y轴加速度数据对比
z轴加速度数据对比
我选了几款淘宝上比较热门的传感器,分别是icm20948,icm42605,进行对比分析。在以电机旋翼为震动来源的情况下,采集得到的传感器原始数据如上图所示,由图中可知,bmi088传感器的加速度计噪声较低仅有0.05g~0.1g左右的噪声,抗震性良好,其它传感器噪声在0.2到0.5g左右,但是bmi088的陀螺仪就没看出什么优势,感觉差不多。
无人机旋翼噪声确实是一个比较棘手的问题,光靠传感器或减震板难以处理这个问题,还需要靠算法滤波处理,以后需要多多研究这方面的解决办法
另外如果有朋友对这个模块感兴趣,我已经在主页上传了其pcb文件以及驱动代码,有兴趣的可以下载。如下是部分代码实例:
void BMI088_Init()
{
BMI088_SPI_Activation();
delay_ms(50);
BMI088_ReadID();
BMI088_acc_write(0x7e, 0xb6); //复位
delay_ms(20); //100
BMI088_SPI_Activation();
delay_ms(20);
BMI088_acc_write(0x7d, 0x04); //打开加速度计
delay_ms(20);
//(0x02,0x0b)加速度计ODR 800hz,无重采样; (0x00,0x0c) ODR 1600hz,4重采样
BMI088_acc_write(0x40, ((1 << 7) | (0x00 << 4) | (0x0b << 0)));
delay_ms(20);
BMI088_acc_write(0x41, 0x02); //0x03:加速度计量程24g 0x02:加速度计量程12g
delay_ms(20);
BMI088_acc_write(0x7c, 0x00); //进入Active模式
delay_ms(20);
BMI088_gyro_write(0x14, 0xb6); //复位
delay_ms(20);
BMI088_gyro_write(0x0f, 0x01); //GYRO_RANGE(0x0f): 0x00 :2000deg/s 0x01 :1000deg/s
delay_ms(20);
//0x01: ODR=2000hz bandwidth=230hz, 0x00 ODR=2000hz bandwidth=532hz,0x02: ODR=1000hz bandwidth=116hz
BMI088_gyro_write(0x10, 0x01); //0x01
delay_ms(20);
BMI088_gyro_write(0x11, 0x00); //GYRO_LPM1(0x11): normal mode
delay_ms(20);
}
/这里读7个数据是因为第一个数据是无效的,取后面6个
void BMI088_ReadAcc()
{
BMI088_acc_read_bytes(ACC_data,7,BMI088_data_Buf);
BMI088_Acc.X = BMI088_data_Buf[2]<<8 | BMI088_data_Buf[1];
BMI088_Acc.Y = BMI088_data_Buf[4]<<8 | BMI088_data_Buf[3];
BMI088_Acc.Z = BMI088_data_Buf[6]<<8 | BMI088_data_Buf[5];
my_sensor.accel_raw.x = BMI088_Acc.X ;
my_sensor.accel_raw.y = BMI088_Acc.Y ;
my_sensor.accel_raw.z = BMI088_Acc.Z ;
}
void BMI088_ReadGyro()
{
BMI088_gyro_read_bytes(GYR_data,6,BMI088_data_Buf);
BMI088_Gyr.X = BMI088_data_Buf[1]<<8 | BMI088_data_Buf[0];
BMI088_Gyr.Y = BMI088_data_Buf[3]<<8 | BMI088_data_Buf[2];
BMI088_Gyr.Z = BMI088_data_Buf[5]<<8 | BMI088_data_Buf[4];
my_sensor.gyro_raw.x = BMI088_Gyr.X ;
my_sensor.gyro_raw.y = BMI088_Gyr.Y ;
my_sensor.gyro_raw.z = BMI088_Gyr.Z ;
}