MPU6050两者程序是可以通用的,只需要改下ID即可就可以直接替换使用。ICM20602是6050的优化版本主要增加SPI通讯方式,改善了数据稳定性。
MPU6050为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU-6000上可用)。
ICM 20602是一个6轴运动跟踪装置,它结合了一个3轴陀螺仪,3轴加速度计,在一个小的3毫米×3毫米×075毫米(16引脚LGA)封装。
mpu6050库导入后可以读出数据,通常需要进行卡曼滤波。如果找到的例程不会用,也可以直接买 串口mpu6050模块, 该模块自带单片机,帮助你把数据读出且滤波处理后串口输出,这样就容易使用了,目前价格30以内。
你说的AD0与这问题无关,我想他说的是当你把 两个MPU6050的IC并在同一个I2C总线上的时候才要考虑,但你现在是用两组IO去分别控制就不用考虑这个问题了。应该两个地址都为一样。 我现在当你是用I2C 当如果你的第一组可读的IO本来就是带I2C功能的
给你arduino的卡尔曼滤波融合算法,非原创,我只是封装了算法。
另外你这么难的问题应该给点分才厚道啊!
H文件:
/
KalmanFilterh
Non-original
Author: x2d
Copyright (c) 2012 China
/
#ifndef KalmanFilter_h
#define KalmanFilter_h
#include <WProgramh>
class KalmanFilter
{
public:
KalmanFilter();
/
卡尔曼融合计算
angle_m: 加速度计测量并通过atan2(ax,ay)方法计算得到的角度(弧度值)
gyro_m:陀螺仪测量的角速度值(弧度值)
dt:采样时间(s)
outAngle:卡尔曼融合计算出的角度(弧度值)
outAngleDot:卡尔曼融合计算出的角速度(弧度值)
/
void getValue(double angle_m, double gyro_m, double dt, double &outAngle, double &outAngleDot);
private:
double C_0, Q_angle, Q_gyro, R_angle;
double q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
double angle, angle_dot;
double P[2][2];
double Pdot[4];
};
CPP文件:
/
KalmanFiltercpp
Non-original
Author: x2d
Copyright (c) 2012 China
/
#include "KalmanFilterh"
KalmanFilter::KalmanFilter()
{
C_0 = 10f;
Q_angle = 0001f;
Q_gyro = 0003f;
R_angle = 05f;
q_bias = angle_err = PCt_0 = PCt_1 = E = K_0 = K_1 = t_0 = t_1 = 00f;
angle = angle_dot = 00f;
P[0][0] = 10f;
P[0][1] = 00f;
P[1][0] = 00f;
P[1][1] = 10f;
Pdot[0] = 00f;
Pdot[1] = 00f;
Pdot[2] = 00f;
Pdot[3] = 00f;
}
void KalmanFilter::getValue(double angle_m, double gyro_m, double dt, double &outAngle, double &outAngleDot)
{
/
Serialprint("angle_m = ");
Serialprint(angle_m);
Serialprint(";");
Serialprint("gyro_m = ");
Serialprint(gyro_m);
Serialprint(";");
/
angle+=(gyro_m-q_bias) dt;
angle_err = angle_m - angle;
Pdot[0] = Q_angle - P[0][1] - P[1][0];
Pdot[1] = -P[1][1];
Pdot[2] = -P[1][1];
Pdot[3] = Q_gyro;
P[0][0] += Pdot[0] dt;
P[0][1] += Pdot[1] dt;
P[1][0] += Pdot[2] dt;
P[1][1] += Pdot[3] dt;
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_err;
q_bias += K_1 angle_err;
angle_dot = gyro_m-q_bias;
outAngle = angle;
outAngleDot = angle_dot;
/
Serialprint("angle = ");
Serialprint(angle);
Serialprint(";");
Serialprint("angle_dot = ");
Serialprint(angle_dot);
Serialprint(";");
/
}
#endif
你的同时读是什么意思?单核MCU不可能同时读的,总有先后顺序。
如果你的本意是一条I2C总线上挂两个MPU6050,那是可以的。这个芯片的第9脚AD0是设备地址的最低位,两个芯片一个拉高,一个拉低,就有两个不同的设备地址了。
这是个传感芯片,读到的数据需要根据不同应用处理,难道你只想要读数据的函数?自己写呗,很简单的。
以上就是关于如何用MPU6050替换ICM20602全部的内容,包括:如何用MPU6050替换ICM20602、为什么arduino接上mpu6050陀螺仪后程序执行异常、apm将mpu6000与mpu6050程序要改哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)