-
DS-
学习笔记
02--
MPU6050
数据分析与滤波
[<
/p>
复制链接
]
论坛关于
6050
的帖子看了个遍也没整明白哪些东西可以用,
哪些
数据是干
什么的。
沉寂了
2
天,尽可能的在网上收集资料,但是关于
605
0
的太少了
在本论坛问题区提的问题
有人看,没人回答,
估计是看的人不会,
会的人不会去问题区,
要
么就是大家对
6050
不熟悉或者是
没用过吧。也没人来问津下我们初学者。
让我想起卜学亮一首
歌:搞不懂就问人,搞得懂就答人,没有人懂还可以问神!
其实整到现在有的地方我还是不太明白,将就先贡献出来,给大家参考。
我参考的是飞思卡尔官方给出的设计参考。
1.
关于
6050
陀螺仪和加速度计
的角速度和角度计算。
A.
陀螺仪角度计算,很多帖子中都提到了用的是积分,但是我这里还是重
新讲下。
angle_n = angle_n-1 +
(Gyro-C_Gyro)*R_Gyro;
angle_n
当前角度值,它的单位是度(°)
angle_n-1
上一次计算出的角度值
Gyro
陀螺仪敏感轴偏转值,也就是当前敏感轴读数
C_Gyro
陀螺仪零点偏移值,
这个值的测量方法是:
将陀螺仪敏感轴水平放置静止时的读数,
我的零点偏移值是水平、
垂直、
倒置,
分别取
1024
次,
< br>作平均值得出的,
读数是
-177.8865041
p>
,
但是最后在程序实践中,调整到
-99.
90
。或许还有别的办法,自己看着办吧。
R_Gyro
是陀螺仪比例。飞思
卡尔的参考中提到这个值是可以计算出来的,下面我会提供下
载,
大家自己去看看怎么算的,
但是在其论坛和调试手册中都提到,
这个比例值还是实验法
测量出来的比较准确。
B.
加速度仪
角度计算。
加速度仪的角度计算有很
多方法,论坛里就有
2
中。但是都用到了三角函数,数学没学好
,
照抄了也不行。参考了飞思卡尔的计算方法后大概是这样的。
Angle_Z = (az-C_Z)*R_Z;
angle_z
加速度计敏感轴<
/p>
Z
轴产生倾角计算出的角度,单位度(°)
az
是加速度仪
Z
轴读数
C_Z
Z
轴零点偏移量
测量方法和陀螺仪的一样。
R_Z
加速度计
Z
< br>轴比例
C.
反复试验,
MPU6050
加速度计
< br>Z
轴对应的是陀螺仪的
X
轴。不
知道是不是我的有问题,还
是就这么设计的?
2.
关于滤波,实验了一天,大概滤
出个这么样个波形。
红色:加速度计算出的角度
橙色:陀螺仪积分出的角度
黑色:滤波后的角度
比较大的浮动是我将
mpu6050
旋转大约
45
°的波形。后面是没放稳产生的前后晃动。
3.
代码部分
ARDUINO
代码复制
打印
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include
#include
#include
MPU6050
accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float
C_Z =
-1343
.91
;
//Z
轴零点偏移量
float
C_Gyro =
-99.90
;
//
陀螺
仪零点偏移量
float
Z_Min =
-17873.76
;
//
最小极值
float
Z_Max =
151
86.91
;
//
最大极值
float
T_Z =
3
;
//Z
轴角度补偿时间常数<
/p>
float
R_Z =
180
/
(
Z_Max
- Z_Min
)
;
//Z
轴比例
float
R_Gyro =
0.081
;
//
陀螺仪比例
unsigned
long
T_Now =
0
;
//
系统当前时间
16.
unsigned
long
T_Last;
//
上次时间
17.
float
Angle_G,Angle_AG,Angle_GG;
18.
int
i;
19.
float
GYRO;
20.
21.
void
setup
()
{
22.
Wire
.
begin
()
;
23.
Serial
.
begin
(
38400
)
;
24.
// initialize device
25.
Serial
.
println
(
p>
devices...
)
< br>;
26.
accelg
yro.
initialize
()
;
27.
// verify connection
28.
Serial
.
println
(
p>
connections...
)
;
29.
p>
Serial
.
println
(
accelgyro.
testConnect
ion
()
?
:
connection
failed
)
;
30.
}
31.
32.
void
loop
()
{
33.
accelgyro.
getMotion6
(
&ax,
&ay,
&az,
&gx,
&gy,
&gz
)
;
//
读取
6050
数据
34.
35.
36.
37.
if
(
i>
20
)
{
GYRO =
GYRO/
20
;
float
Angle_Z =
(
az-C_Z
)
*R_Z;
//
加速度计
角度
计算
(
读取值
-
偏移量)
*
< br>比例
单位:
°
38.
Angle_G
=
-
(
GYRO-C_Gyro
)
*R_Gyro;
//
陀螺仪采样
(采样值
-
偏移量)
*
比例
单位:
°/s
39.
Angle_AG
= Angle_AG +
(((
Angle_Z-Angl
e_AG
)
*
1
/T_Z
)
+Angle_G
)
p>
*
0.005
;
/
/
滤波
40.
Angle_GG
= Angle_GG + Angle_G*
0.005
;<
/p>
//
陀螺
仪对
X
轴积分
得出角度。
41.
Serial
.
print
(
Angle_Z
)
;
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Serial
.
print
(
p>
)
;
<
/p>
Serial
.
print
(
Angle_GG
)
;
Serial
.
print
(
)
;
Serial
.
print
(
Angle_AG<
/p>
)
;
Serial
.
print
(
)
;
i=
0
;
}
GYRO = GYRO +
gx;
i++;
}
代码
lo
op
段中,我使用了一个
if
循环,采
集
20
次陀螺仪读数,进行平均。这样似乎影响
了数据采集,但是在波形中灵敏度似乎不受影响。
知道办法笨了点,希望有高手给出简化方法。
滤波中用到的
0.005
是参考中给出的。
本来准备用系统时间积分的,
但
是看滤出的波有模有
样的就没改了。
参考中给出了大部分的算法思想,人笨没办法,就折腾出个这么个代码。
4.
如何绘制波形图
A.
绘制波形图一般用
excel
,吧串口调试工具读出是数据导入
excel
,选择全部数
据,单击
图表向导就可以了,
记住,
在
arduino
输出数据的时候不要用
“逗号”
分割,
打印一个
table<
/p>
也就是把我上面的代码
ARDUINO
代码复制
打印
1.
2.
3.
4.
5.
6.
Serial
.
print
(
Angle_Z
)
;
Serial
.
print
(
)
;
Serial
.
print
(
Angle_GG<
/p>
)
;
Serial
.
print
(
)
;
Serial
.
print
< br>(
Angle_AG
)
;
Serial
.
print
(
)
;
换成
ARDUINO
代码复制
打印
1.
2.
3.
4.
5.
6.
Serial
.
print
(
Angle_Z
)
;
Serial
.
print
(
)
;
Serial
.
print
(
Angle_GG<
/p>
)
;
Serial
.
print
(
)
;
Serial
.
print
< br>(
Angle_AG
)
;
Serial
.
print
(
)
;
-
-
-
-
-
-
-
-
-
上一篇:细胞凋亡综述
下一篇:FLASH期末考试复习提纲(答案)