mpu6050加速度计校准陀螺仪模块可以直接用mpu6050吗

查看: 5589|回复: 11
关于MPU6050的自检功能?
小弟刚用MPU6050,里面的GYRO_CONFIG和ACCEL_CONFIG这两个寄存器有一个自检功能是做什么用的,每次启动都要自检吗?
求大神答疑解惑,谢谢!
没人看吗?顶上去啊!
由于工作清闲了点,现在又开始弄mpu6050了,我的这个问题真的没有大神解答一下么?
同求啊&&什么是自检啊??别沉啊
同求,强力的顶上去
好像参考文档上只说了不自检时的输出与自检时的输出的差值应该有一个范围,如果在范围内就认为通过自检,否则没通过。可是通过自检又有什么用呢?
读了一下register map,里面的原话摘录如下。
1. Gyroscope Self-Test
When self-test is activated, the on-board electronics will actuate the appropriate sensor. This actuation will move the sensor’s proof masses over a distance equivalent to a pre-defined Coriolis force. This proof mass displacement results in a change in the sensor output, which is reflected in the output signal. The output signal is used to observe the self-test response.
The self-test response is defined as follows:
Self-test response = Sensor output with self-test enabled – Sensor output without self-test enabled
The self-test limits for each gyroscope axis is provided in the electrical characteristics tables of the MPU-6000/MPU-6050 Product Specification document. When the value of the self-test response is within the min/max limits of the product specification, the part has passed self test. When the self-test response exceeds the min/max values specified in the document, the part is deemed to have failed self-test.
2. Accelerometer Self-Test
When self-test is activated, the on-board electronics will actuate the appropriate sensor. This actuation simulates an external force. The actuated sensor, in turn, will produce a corresponding output signal. The output signal is used to observe the self-test response.
The self-test response is defined as follows:
Self-test response = Sensor output with self-test enabled – Sensor output without self-test enabled
The self-test limits for each accelerometer axis is provided in the electrical characteristics tables of the MPU-6000/MPU-6050 Product Specification document. When the value of the self-test response is within the min/max limits of the product specification, the part has passed self test. When the self-test response exceeds the min/max values specified in the document, the part is deemed to have failed self-test.
大概意思就是开始自检之后Gyroscope就会测量地转偏向,Gyroscope Sensor 就会测量这个偏向;Accelerometer就会用电子运动产生激励,Accelerometer Sensor就会测量这个加速度。两个测量值与原值相减得到一个差值,差值再和预设值比较,范围内则通过自检,范围外则不通过。
所以我理解自检就是检测芯片坏没坏。
我也在做这个芯片,学习交流,有错轻喷。
读了一下register map,里面的原话摘录如下。
1. Gyroscope Self-Test
原来作用是监测芯片好坏啊,之前我也是自检这里一直纠结着
自检能一定程度解决漂移的问题
因为这些芯片是MEMS,里面有机械结构,剧烈振动可能损耗的,比如芯片摔地上。
自检测功能是允许用户自己去测试MPU6050的陀螺仪和加速度计的机械电气部分是否正常的一个功能,其中STR是自检测功能开启后设备自己测试的到的一个值,FT是厂家测试的到的一个值,如果6050的响应值相对于厂家测试值的百分比不再范围内(%=(STR-FT)/FT),则说明芯片测的数据不正常。个人理解,大家共同探讨
运动 自由落体 和静止中断有用过的吗
自检测功能是允许用户自己去测试MPU6050的陀螺仪和加速度计的机械电气部分是否正常的一个功能,其中STR是自 ...
自检的时候,需要保持MPU6050静止不动吗???
阿莫电子论坛, 原"中国电子开发网"姿态角(Euler角)pitch yaw roll飞行器的姿态角并不是指哪个角度,是三个角度的统称。它们是:俯仰、滚转、偏航。你可以想象是飞机围绕XYZ三个轴分别转动形成的夹角。地面坐标系(earth-surface inertial reference frame)Sg--------OXgYgZg&ignore_js_op&&①在地面上选一点Og②使Xg轴在水平面内并指向某一方向③Zg轴垂直于地面并指向地心(重力方向)④Yg轴在水平面内垂直于Xg轴,其指向按右手定则确定机体坐标系(Aircraft-body coordinate frame)Sb-------OXYZ&ignore_js_op&&①原点O取在飞机质心处,坐标系与飞机固连②x轴在飞机对称平面内并平行于飞机的设计轴线指向机头③y轴垂直于飞机对称平面指向机身右方④z轴在飞机对称平面内,与x轴垂直并指向机身下方欧拉角/姿态角(Euler Angle)&ignore_js_op&&&ignore_js_op&&机体坐标系与地面坐标系的关系是三个Euler角,反应了飞机相对地面的姿态。俯仰角&(pitch):机体坐标系X轴与水平面的夹角。当X轴的正半轴位于过坐标原点的水平面之上(抬头)时,俯仰角为正,否则为负。&ignore_js_op&&偏航角&(yaw):机体坐标系xb轴在水平面上投影与地面坐标系xg轴(在水平面上,指向目标为正)之间的夹角,由xg轴逆时针转至机体xb的投影线时,偏航角为正,即机头右偏航为正,反之为负。&ignore_js_op&&滚转角&P(roll):机体坐标系zb轴与通过机体xb轴的铅垂面间的夹角,机体向右滚为正,反之为负。&ignore_js_op&
首先要明确,MPU6050 是一款姿态传感器,使用它就是为了得到待测物体(如四轴、平衡小车) x、y、z 轴的倾角(俯仰角 Pitch、滚转角 Roll、偏航角 Yaw) 。我们通过 I2C 读取到 MPU6050 的六个数据(三轴加速度 AD 值、三轴角速度 AD 值)经过姿态融合后就可以得到 Pitch、Roll、Yaw 角。
本帖主要介绍三种姿态融合算法:四元数法 、一阶互补算法和卡尔曼滤波算法。
一、四元数法
关于四元数的一些概念和计算就不写上来了,我也不懂。我能告诉你的是:通过下面的算法,可以把六个数据转化成四元数(q0、q1、q2、q3),然后四元数转化成欧拉角(P、R、Y 角)。
& & & & 虽然 MPU6050 自带的 DMP库可以直接输出四元数,减轻 STM32 的运算负担, 这里在此没有使用,因为我是用 STM32 的硬件 I2C 读取 MPU6050 数据的(),DMP库需要对 I2C 函数进行修改,如 DMP 库中的 I2C 写:i2c_write(st.hw-&addr, st.reg-&pwr_mgmt_1, 1, &(data[0]));有4个输入变量,而 STM32 硬件 I2C 的 I2C 写为:void MPU6050_I2C_ByteWrite(u8 slaveAddr, u8 pBuffer, u8 writeAddr),只有 3 个输入量(这之间的差异好像是由于 MPU6050 的 DMP 库是针对 MSP430&写的),所以必须进行修改,但是改固件库是一件很痛苦的事,你们应该都懂。当然,如果你用模拟 I2C 的话,是容易实现的,网上的 DMP 移植几乎都是基于模拟 I2C 的。
#include&math.h&
#include "stm32f10x.h"
//---------------------------------------------------------------------------------------------------
// 变量定义
#define Kp 100.0f& && && && && && && && &// 比例增益支配率收敛到加速度计/磁强计
#define Ki 0.002f& && && && && & // 积分增益支配率的陀螺仪偏见的衔接
#define halfT 0.001f& && && && && & // 采样周期的一半
float q0 = 1, q1 = 0, q2 = 0, q3 = 0;& && && & // 四元数的元素,代表估计方向
float exInt = 0, eyInt = 0, ezInt = 0;& && &&&// 按比例缩小积分误差
float Yaw,Pitch,R&&//偏航角,俯仰角,翻滚角
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
& && &&&float vx, vy,
& && &&&float ex, ey,&&
& && &&&// 测量正常化
& && &&&norm = sqrt(ax*ax + ay*ay + az*az);& && &
& && &&&ax = ax /& && && && && && & //单位化
& && &&&ay = ay /
& && &&&az = az /& && &
& && &&&// 估计方向的重力
& && &&&vx = 2*(q1*q3 - q0*q2);
& && &&&vy = 2*(q0*q1 + q2*q3);
& && &&&vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;
& && &&&// 错误的领域和方向传感器测量参考方向之间的交叉乘积的总和
& && &&&ex = (ay*vz - az*vy);
& && &&&ey = (az*vx - ax*vz);
& && &&&ez = (ax*vy - ay*vx);
& && &&&// 积分误差比例积分增益
& && &&&exInt = exInt + ex*Ki;
& && &&&eyInt = eyInt + ey*Ki;
& && &&&ezInt = ezInt + ez*Ki;
& && &&&// 调整后的陀螺仪测量
& && &&&gx = gx + Kp*ex + exI
& && &&&gy = gy + Kp*ey + eyI
& && &&&gz = gz + Kp*ez + ezI
& && &&&// 整合四元数率和正常化
& && &&&q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
& && &&&q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
& && &&&q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
& && &&&q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;&&
& && &&&// 正常化四元
& && &&&norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
& && &&&q0 = q0 /
& && &&&q1 = q1 /
& && &&&q2 = q2 /
& && &&&q3 = q3 /
& && &&&Pitch&&= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch ,转换为度数
& && &&&Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // rollv
& && &&&//Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;& && && && && & //此处没有价值,注掉
& & & 要注意的的是,四元数算法输出的是三个量 Pitch、Roll 和 Yaw,运算量很大。而像平衡小车这样的例子只需要一个角(Pitch 或 Roll )就可以满足工作要求,个人觉得做平衡小车最好不用四元数法。
二、一阶互补算法
& & & &MPU6050 可以输出三轴的加速度和角速度。通过加速度和角速度都可以得到 Pitch 和 Roll 角(加速度不能得到 Yaw 角),就是说有两组 Pitch、Roll 角,到底应该选哪组呢?别急,先分析一下。MPU6050 的加速度计和陀螺仪各有优缺点,三轴的加速度值没有累积误差,且通过算 tan()&&可以得到倾角,但是它包含的噪声太多(因为待测物运动时会产生加速度,电机运行时振动会产生加速度等),不能直接使用;陀螺仪对外界振动影响小,精度高,通过对角速度积分可以得到倾角,但是会产生累积误差。所以,不能单独使用 MPU6050 的加速度计或陀螺仪来得到倾角,需要互补。一阶互补算法的思想就是给加速度和陀螺仪不同的权值,把它们结合到一起,进行修正。得到 Pitch 角的程序如下:
//一阶互补滤波
float K1 =0.1; // 对加速度计取值的权重
float dt=0.001;//注意:dt的取值为滤波器采样时间
angle_ax=atan(ax/az)*57.3;& &&&//加速度得到的角度
gy=(float)gyo[1]/7510.0;& && & //陀螺仪得到的角速度
Pitch = yijiehubu(angle_ax,gy);
float yijiehubu(float angle_m, float gyro_m)//采集后计算的角度和角加速度
& &&&angle = K1 * angle_m + (1-K1) * (angle + gyro_m * dt);
& & 互补算法只能得到一个倾角,这在平衡车项目中够用了,而在四轴飞行器设计中还需要 Roll 和 Yaw,就需要两个 互补算法,我是这样写的,注意变量不要搞混:
//一阶互补滤波
float K1 =0.1; // 对加速度计取值的权重
float dt=0.001;//注意:dt的取值为滤波器采样时间
float angle_P,angle_R;
float yijiehubu_P(float angle_m, float gyro_m)//采集后计算的角度和角加速度
& &&&angle_P = K1 * angle_m + (1-K1) * (angle_P + gyro_m * dt);
& && && &return angle_P;
float yijiehubu_R(float angle_m, float gyro_m)//采集后计算的角度和角加速度
& &&&angle_R = K1 * angle_m + (1-K1) * (angle_R + gyro_m * dt);
& && && &return angle_R;
单靠 MPU6050 无法准确得到 Yaw 角,需要和地磁传感器结合使用。
三、卡尔曼滤波
& & & 其实卡尔曼滤波和一阶互补有些相似,输入也是一样的。卡尔曼原理以及什么5个公式等等的,我也不太懂,就不写了,感兴趣的话可以上网查。在此给出具体程序,和一阶互补算法一样,每次卡尔曼滤波只能得到一个方向的角度。
#include&math.h&
#include "stm32f10x.h"
#include "Kalman_Filter.h"
//卡尔曼滤波参数与函数
float dt=0.001;//注意:dt的取值为kalman滤波器采样时间
float angle, angle_//角度和角速度
float P[2][2] = {{ 1, 0 },
& && && && && &&&{ 0, 1 }};
float Pdot[4] ={ 0,0,0,0};
float Q_angle=0.001, Q_gyro=0.005; //角度数据置信度,角速度数据置信度
float R_angle=0.5 ,C_0 = 1;
float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
//卡尔曼滤波
float Kalman_Filter(float angle_m, float gyro_m)//angleAx 和 gyroGy
& && &&&angle+=(gyro_m-q_bias) *
& && &&&angle_err = angle_m -
& && &&&Pdot[0]=Q_angle - P[0][1] - P[1][0];
& && &&&Pdot[1]=- P[1][1];
& && &&&Pdot[2]=- P[1][1];
& && &&&Pdot[3]=Q_
& && &&&P[0][0] += Pdot[0] *
& && &&&P[0][1] += Pdot[1] *
& && &&&P[1][0] += Pdot[2] *
& && &&&P[1][1] += Pdot[3] *
& && &&&PCt_0 = C_0 * P[0][0];
& && &&&PCt_1 = C_0 * P[1][0];
& && &&&E = R_angle + C_0 * PCt_0;
& && &&&K_0 = PCt_0 / E;
& && &&&K_1 = PCt_1 / E;
& && &&&t_0 = PCt_0;
& && &&&t_1 = C_0 * P[0][1];
& && &&&P[0][0] -= K_0 * t_0;
& && &&&P[0][1] -= K_0 * t_1;
& && &&&P[1][0] -= K_1 * t_0;
& && &&&P[1][1] -= K_1 * t_1;
& && &&&angle += K_0 * angle_ //最优角度
& && &&&q_bias += K_1 * angle_
& && &&&angle_dot = gyro_m-q_//最优角速度
& && &&&return angle;
& & & 作个总结:三种融合算法都能够输出姿态角(Pitch 和 Roll ),一次四元数法可以输出 P、R、Y 三个倾角,计算量比较大。一阶互补和卡尔曼滤波每次只能输出一个轴的姿态角。
阅读(...) 评论()君,已阅读到文档的结尾了呢~~
mpu6050加速度计使用说明书v4,加速度计,打点计时器求加速度,mems加速度计,三轴加速度计,加速度计原理,加速度计传感器,加速度计 陀螺仪,三轴加速度计原理,陀螺仪和加速度计
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
mpu6050加速度计使用说明书v4
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 mpu6050加速度计校准 的文章

 

随机推荐