如何用MPU6050替换ICM20602

如何用MPU6050替换ICM20602,第1张

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程序要改哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9328172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存