-
-
--
最近,
被安排调试
MPU6050
模块,
之
前从没接触过相关
MEMS
传感器,
所
以感觉一头雾水。
幸好还有网络,
还有强大的兄弟团的支持。不
过,
很可惜,网上大部分资料只是简单教你如
何配置
MPU6050
并从数据寄存器读出测量值,而之后的数据处理很少涉及。
这使得像我一
样的菜鸟们十分抓狂。所以在此开辟专栏,希望大家集思广益,共同征服<
/p>
MPU6050
。对于
那些还不知道
p>
MPU6050
是啥玩意的童鞋们,百度文科会告诉你。由于对此传
感器的介绍铺
天盖地,所以此处就一笔带过,不再详细介绍。先上张图:
毫无疑问
,无论是学习
MPU6050
,还是其他
ICs
,大家首先想到的是数据手册。没错,
MPU6050
有两个非常重要的数据手册,一个是
PS-
MPU-6000A
,另一个是
RM-MPU-6000A
p>
。
其他的都是原厂评估板的相关使用手册,对我们屌丝来说可以不用
拜读了。
PS-MPU-6000A
是产品说明书,主要介绍了
内部的结构、技术参数以及封装等内容;
RM-MPU-6000A
(
*
)是
寄存器映射和描述文档,
里面详细介绍了
MPU6050
内部各个寄存器的实现功能,对
我们用
户来说相当重要。
网上虽然有一些翻译的中文资料,
p>
但自己还是硬着头皮仔细研读了一下两
个手册。
下面就把自己的心得和大家一起分享一下
(产品说明书网上已有中文版,
这里着重
讲一下第二个数据手册)
。
RM-MPU-6000A
列出了将近
100
个寄存器,
还有一部分寄存器没
有列出来,
估计是不对用
户开放的。
这
些寄存器大致上可分为如下几类:自检寄存器、
陀螺仪加速度配置寄存器、总
线配置相关寄存器、中断配置寄存器、数据寄存器、第三方传感器配置寄存器、
FIFO
相关
寄存器、
系统配置寄
存器。
第一次看到这么多寄存器时倒吸一口凉气,
相信很多网友
会跟我
有相同的感觉。
其实,仔细分析下来,真正需要你配置的
寄存器也就一半左右。由于我手中
的
MPU6050
模块并没有外接第三方传感器,所以需要配置的寄存器就更少了。下面我们就
一起来学习一下一些比较重要的寄存器。
系统配置寄存器
1
、
PWR_MGMT_1
该寄存器用来配置工作模式和时钟源。
此外,
还可以通过配置该寄存器复位整个器件以及禁
止使用
温度传感器。偶设置为
0x08
,处于正常工作模式,禁止使用
温度传感器,选用内部
8MHZ
的时钟源。
2
、
PWR_MGMT_2
该寄存器用来配置加速度计模式下的唤醒频率和待机模式。
3
、
USER_CTRL
该寄存器用来使能或禁止
FIFO
缓冲、
IIC
主模式、和
IIC
接口。
4
、
MOT_DETECT_CTRL
2014
年各行业工程师考试备考资
料及真题集锦
安全工程师
电气工程师
物业管理
师
注册资产评估师
注册化工工程师
p>
该寄存器用来添加加速度计上电的延迟时间,默认是延时为
4ms<
/p>
。
5
、<
/p>
SIGNAL_PATH_RESET
-
.
-word
资料
-
-
--
该寄存器用来复位各个传感器的信号通路。
陀螺仪加速度配置寄存器
1
、
SMPRT_DIV
该寄存器用来产生采样率
(
Sample Rate = Gyroscope Output Rate /
(
1 + SMPLRT_DIV
)<
/p>
)
。
偶设置为
0
x07
,典型值。
2
、
CONFIG
该寄存器用来配置
FSYNC
p>
管脚采样率和数字低通滤波器。
3
、
GYRO_CONFIG
该寄存器用来启动陀螺仪自检和设置陀螺仪测量范围
(用户可根据自己的要求进行设置)
。
4
、
ACCEL_CONFIG
该寄存器用来启动加速度计自检和设置加速度计测量范围(
用户可根据自己的要求进行设
置)
。手册上说也能配置高通滤波
器,但剩余的低三位没用到,不知如何设置?
I2C
配置相关寄存器
INT_PIN_CFG
寄存器<
/p>
I2C_BYPASS_EN
位置
1
p>
,
USER_CTRL
寄存器
I2C_MST_EN
置
0
,使得
主控制器的
I2
与
MPU6050
的
AUXI2C
直通。
中断配置寄存器
1
、
INT_PIN_CFG
该寄存器用来配置
INT
管脚的中断行为。偶设置为
0x30
,推挽输出
,高电平有效,发生中
断时
INT
管脚
被拉高,任何读操作都会清除中断。
2
、
INT_ENABLE
该寄存器用来使能各种中断源。偶设置为
< br>0x01
,使能数据准备好中断。当此中断产生时,
可以
读取传感器的数据寄存器来获取测量值
(手册上说当完成写操作时会触发此中断,
不知
道是怎么回事,偶这样设置也能正常工作)
。
3
、
INT_STATUS
中断状态寄存器,可以通过读取相应中断标志位来清除中断。
上面所介绍的寄存器主
要是初始化
MPU6050
时大概用到的寄存器,
按如上配置,
MPU6050
可正常工作。对于手册
上的一些内容依然迷茫,望解答。
-
.
-word
资料
-
-
--
***************************************
****************************************
//
陀螺仪
MPU6050 IIC
测试程序
<
/p>
****************************************
***************************************/
#include
#include
//Keil library
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
#define
uchar unsigned char
#define
uint unsigned int
//
定义
MPU6050
内部地址
//***
*************************************
#define
SMPLRT_DIV
0x19
//
陀螺仪采样率,典型值:
0x07(125Hz)
#define
CONFIG
0x1A
//
低通滤波频率,典型值:
0x06(5Hz)
#define
GYRO_CONFIG
0x1B
//
陀螺仪自检及测量范围,
典型值:
0x18(
不自检,
2000deg/s)
#define
ACCEL_CONFIG
0x1C
0x01(
不自检,
2G
,
5Hz)
//
加速计自检、测量范围及高通滤
波频率,典型值:
#define
ACCEL_XOUT_H
0x3B
#define
ACCEL_XOUT_L
0x3C
#define
ACCEL_YOUT_H
0x3D
#define
ACCEL_YOUT_L
0x3E
#define
ACCEL_ZOUT_H
0x3F
#define
ACCEL_ZOUT_L
0x40
//#define
TEMP_OUT_H
0x41
//#define
TEMP_OUT_L
0x42
//
#define
GYRO_XOUT_H
0x43
#define
GYRO_XOUT_L
0x44
#define
GYRO_YOUT_H
0x45
#define
GYRO_YOUT_L
0x46
#define
GYRO_ZOUT_H
0x47
#define
GYRO_ZOUT_L
0x48
#define
PWR_MGMT_1
0x6B
//#define
WHO_AM_I
0x75
/****************************
#define
MPU6050_Addr
0xD0
//
电源管理,典型值:
0x00(
正常启用
< br>)
//IIC
地址寄存器
(<
/p>
默认数值
0x68
,只读
)
//
定
义
器
件
在
IIC
总
线
中
的
从
地
址
,
根
据
AL
T
-
.
-word
资料
-
-
--
ADDRESS
地址引脚不同修改
unsigned char TX_DATA[4];
//
显示据缓存区
unsigned char BUF[10];
//
接收数据缓存区
char
test=0;
//IIC
用到
short T_X,T_Y
,T_Z,T_T;
//X,Y
,Z
轴,温度
//************************************
/*
模拟
IIC
端口输出输入定义
*/
#define SCL_H
GPIOB->BSRR = GPIO_Pin_6
#define SCL_L
GPIOB->BRR
= GPIO_Pin_6
#define SDA_H
GPIOB->BSRR =
GPIO_Pin_7
#define SDA_L
GPIOB->BRR
=
GPIO_Pin_7
#define SCL_read
GPIOB->IDR
& GPIO_Pin_6
#define
SDA_read
GPIOB->IDR
& GPIO_Pin_7
/*
函数申明
-----------------------------------------------* /
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART1_Configuration(void);
void WWDG_Configuration(void);
void Delay(u32 nTime);
void
Delayms(vu32 m);
/*
变量定义
----------------------------------------------*/
/*******************************/
void DATA_printf(uchar *s,short
temp_data)
{
if(temp_data<0){
temp_data=-temp_data;
*s='-';
}
else *s=' ';
*++s
=temp_data/100+0x30;
temp_data=temp_data%100;
//
取余运算
*++s =temp_data/10+0x30;
temp_data=temp_data%10;
//
取余运算
*++s =temp_data+0x30;
}
/*
**************************************************
****************************
-
.
-word
资料
-
-
--
* Function Name
: I2C_GPIO_Config
*
Description
: Configration Simulation IIC GPIO
* Input
:
None
* Output
:
None
* Return
: None
< br>*********************************************** ******************************* */
void
I2C_GPIO_Config(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
GPIO__Pin =
GPIO_Pin_6;
GPIO__Speed = GPIO_Speed_50MHz;
GPIO__Mode =
GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO__Pin =
GPIO_Pin_7;
GPIO__Speed = GPIO_Speed_50MHz;
GPIO__Mode =
GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*************
**************************************************
****************
* Function Name
: I2C_delay
*
Description
: Simulation IIC Timing series delay
* Input
:
None
* Output
: None
* Return
: None
void I2C_delay(void)
{
u8 i=30;
//
这里可以优化速度
,经测试最低
到
5
还能写入
while(i)
{
i--;
}
}
void delay5ms(void)
{
int i=5000;
while(i)
{
i--;
-
.
-word
资料
-
-
--
}
}
/*
**************************************************
****************************
* Function
Name
: I2C_Start
* Description
: Master Start Simulation
IIC Communication
* Input
: None
* Output
:
None
* Return
: Wheather
Start
**********
**************************************************
****************** */
bool
I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE;
/
/SDA
线为低电平则总线忙
,
退出
SDA_L;
I2C_delay();
if(SDA_read) return FALSE;
/
/SDA
线为高电平则总线出错
,
p>
退出
SDA_L;
I2C_delay();
return TRUE;
}
/*
**************************************************
****************************
* Function
Name
: I2C_Stop
* Description
: Master Stop Simulation
IIC Communication
* Input
: None
* Output
:
None
* Return
: None
< br>*********************************************** ******************************* */
void
I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
<
/p>
/***************************************
****************************************
* Function Name
: I2C_Ack
* Description
:
Master Send Acknowledge Single
* Input
: None
-
.
-word
资料
-
-
--
* Output
: None
* Return
: None
< br>*********************************************** ******************************* */
void
I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay()
}
/**************
**************************************************
***************
* Function Name
: I2C_NoAck
*
Description
: Master Send No Acknowledge Single
* Input
:
None
* Output
: None
* Return
: None
< br>*********************************************** ******************************* */
void
I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
<
/p>
/***************************************
****************************************
* Function Name
: I2C_WaitAck
* Description
:
Master Reserive Slave Acknowledge Single
* Input
:
None
* Output
: None
* Return
: Wheather
Reserive Slave Acknowledge
Single
********************************
********************************************** */
bool I2C_WaitAck(void)
//
返回为
:=1
有
ACK,=0
无
ACK
{
SCL_L;
I2C_delay();
SDA_H;
-
.
-word
资料
-
-
--
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
I2C_delay();
return FALSE;
}
SCL_L;
I2C_delay();
return TRUE;
}
/*
**************************************************
****************************
* Function
Name
: I2C_SendByte
* Description
: Master Send a Byte to
Slave
* Input
:
Will Send Date
* Output
:
None
* Return
: None
< br>*********************************************** ******************************* */
void
I2C_SendByte(u8 SendByte)
//
数据从高位到低位
//
{
u8 i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
/**************
**************************************************
***************
* Function Name
: I2C_RadeByte
*
Description
: Master Reserive a Byte From Slave
* Input
:
None
* Output
: None
* Return
: Date From
Slave
-
.
-word
资料
-