三轴加速度传感器是一种能够测量物体在三个不同方向上的加速度的设备。 它 是由三个相互垂直的单轴加速度传感器组成的,可以分别测量物体在x轴、y轴和 z轴上的加速度。 三轴加速度传感器广泛应用于许多领域,如汽车、航空航天、 手机、平板电脑等。 它可以用于检测车辆的加速度、姿态控制、动作识别等。 在手机和平板电脑中,三轴加速度传感器可以用于自动调整屏幕方向、游戏的动 作感应等。 三轴加速度传感器的工作原理是利用微机电系统(MEMS)技术。 传感器中的微小质量会受到外力的作用而产生微小变形,这个变形会导致传感器 内部电荷发生变化,通过测量电荷的变化就可以得到加速度的大小。 在使用三 轴加速度传感器时,需要注意校准和消除误差.
参数表
加速度陀螺仪传感器内部采用的是MPU-6050陀螺仪,MPU-60X0是全球首例9轴运动处理传感器,它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processer),可用I2C接口连接一个第三方的数字传感器。MPU-60X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。MPU-60X0对陀螺仪和加速度机分别用了三个16位的ADC(0~65535),将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。
MPU6050的内部框图如下图所示:
加速度陀螺仪传感器的原理图:
示例代码:
#include "MPU6050.h"
#include "I2Cdev.h"
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float ax0, ay0, az0;
float gx0, gy0, gz0;
float ax1, ay1, az1;
float gx1, gy1, gz1;
float dx;
float dz;
int ax_offset, ay_offset, az_offset, gx_offset, gy_offset, gz_offset;
float radianX;
float radianY;
float radianZ;
float radianX_last; //最终获得的X轴倾角
float radianY_last; //最终获得的Y轴倾角
//更新倾角传感器数据
void update_mpu6050()
{
static uint32_t timer_u;
if (timer_u < millis())
{
// put your main code here, to run repeatedly:
timer_u = millis() + 20;
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
ax0 = ((float)(ax)) * 0.3 + ax0 * 0.7; //对读取到的值进行滤波
ay0 = ((float)(ay)) * 0.3 + ay0 * 0.7;
az0 = ((float)(az)) * 0.3 + az0 * 0.7;
ax1 = (ax0 - ax_offset) / 8192.0; // 校正,并转为重力加速度的倍数
ay1 = (ay0 - ay_offset) / 8192.0;
az1 = (az0 - az_offset) / 8192.0;
gx0 = ((float)(gx)) * 0.3 + gx0 * 0.7; //对读取到的角速度的值进行滤波
gy0 = ((float)(gy)) * 0.3 + gy0 * 0.7;
gz0 = ((float)(gz)) * 0.3 + gz0 * 0.7;
gx1 = (gx0 - gx_offset); //校正角速度
gy1 = (gy0 - gy_offset);
gz1 = (gz0 - gz_offset);
//互补计算x轴倾角
radianX = atan2(ay1, az1);
radianX = radianX * 180.0 / 3.1415926;
float radian_temp = (float)(gx1) / 16.4 * 0.02;
radianX_last = 0.8 * (radianX_last + radian_temp) + (-radianX) * 0.2;
//互补计算y轴倾角
radianY = atan2(ax1, az1);
radianY = radianY * 180.0 / 3.1415926;
radian_temp = (float)(gy1) / 16.4 * 0.01;
radianY_last = 0.8 * (radianY_last + radian_temp) + (-radianY) * 0.2;
}
}
//打印数据
void print_data()
{
static uint32_t timer_p;
static uint32_t timer_printlog;
if ( timer_p < millis())
{
Serial.print("ax:"); Serial.print(ax1);
Serial.print(", ay:"); Serial.print(ay1);
Serial.print(", az:"); Serial.print(az1);
Serial.print(", gx:"); Serial.print(gx1);
Serial.print(", gy:"); Serial.print(gy1);
Serial.print(", gz:"); Serial.print(gz1);
Serial.print(", GX:"); Serial.print(radianX_last);
Serial.print(", GY:"); Serial.println(radianY_last);
timer_p = millis() + 500;
}
}
void setup() {
Serial.begin(9600);
//MPU6050 配置
Wire.begin();
accelgyro.initialize();
accelgyro.setFullScaleGyroRange(3); //设定角速度量程
accelgyro.setFullScaleAccelRange(1); //设定加速度量程
delay(200);
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //获取当前各轴数据以校准
ax_offset = ax; //X轴加速度校准数据
ay_offset = ay; //Y轴加速度校准数据
az_offset = az - 8192; //Z轴加速度校准数据
gx_offset = gx; //X轴角速度校准数据
gy_offset = gy; //Y轴角速度校准数据
gz_offset = gz; //Z轴教书的校准数据
delay(1500);
}
void loop() {
update_mpu6050();
print_data();
}
串口打印: