本帖最后由 wghou 于 2015-6-22 16:14 编辑
有关MPU-6050的介绍这里就不赘述了。两个比较重要的文档 RM-MPU-6000A.pdf 和 ,自行百度。
硬件:MPU-6050模块+
STM32F103VET6板+STM32固件库V3.5
1、接线:VCC、GND;SCL接PB6 / I2C1_SCL,SDA接PB7 / I2C1_SDA;当AD0引脚逻辑低电平时,设备的地址是0xD0,当AD0引脚逻辑高电平时,设备的地址是0xD1。(这儿AD0不接,地址为0xD0)MPU-6050模块接线还是挺方便的。
2、MPU-6050常用寄存器(摘自liuzhangchao的博客http://blog.sina.com.cn/s/blog_8240cbef01018i10.html)
1) Register 25 — Sample Rate Divider (SMPRT_DIV)(R/W)
SMPRT_DIV 8位无符号值,通过该值将陀螺仪输出分频,得到采样频率。传感器寄存器的输出、FIFO 输出、DMP 采样和运动检测的都是基于该采样率。
采样率的计算公式
采样率 = 陀螺仪的输出频率 / (1 + SMPLRT_DIV)
当数字低通滤波器没有使能(Disable)时,陀螺仪的输出频率为8KHz,使能(Enable)时陀螺仪的输出频率为1KHz。
2)Register 26 — Configura
tion (CONFIG)(R/W)
EXT_SYNC_SET 3位无符号值,配置帧同步引脚的采样(待续...)
DLPF_CFG 3位无符号值,配置数字低通滤波器
数字低通滤波器是由DLPF_CFG来配置,根据下表中DLPF_CFG的值对加速度传感器和陀螺仪滤波:
3)Register 27 — Gyroscope Configuration (GYRO_CONFIG)(R/W)
XG_ST 设置此位,X 轴陀螺仪进行自我测试;
YG_ST 设置此位,Y 轴陀螺仪进行自我测试;
ZG_ST 设置此位,Z 轴陀螺仪进行自我测试;
FS_SEL 2 位无符号值。选择陀螺仪的量程。
关于自检待续...
根据下表,FS_SEL 选择陀螺仪输出的量程:
4)Register 28 – Accelerometer Configuration (ACCEL_CONFIG)(R/W)
XA_ST 设置为 1 时,X 轴加速度感应器进行自检;
YA_ST 设置为 1 时,Y 轴加速度感应器进行自检;
ZA_ST 设置为 1 时,Z 轴加速度感应器进行自检;
AFS_SEL 2 位无符号值。选择加速度计的量程。
关于自检待续...
根据下表,AFS_SEL 选择加速度传感器输出的量程:
5)Registers 59 to 64 – Accelerometer Measurements (ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L)(R)
ACCEL_XOUT 16 位 2’s 补码值,存储最近的 X 轴加速度感应器的测量值;
ACCEL_YOUT 16 位 2’s 补码值,存储最近的 Y 轴加速度感应器的测量值;
ACCEL_ZOUT 16 位 2’s 补码值,存储最近的 Z 轴加速度感应器的测量值。
在寄存器 28 中定义了每个 16 位的加速度测量值的最大范围,对于设置的每个最大范围,都对应一个加速度的灵敏度 ACCEL_xOUT,如下面的表中所示:
6)Registers 65 and 66 – Temperature Measurement (TEMP_OUT_H and TEMP_OUT_L)(R)
TEMP_OUT 16 位有符号值,存储的最近温度传感器的测量值。
7)Registers 67 to 72 – Gyroscope Measurements (GYRO_XOUT_H, GYRO_XOUT_L, GYRO_YOUT_H, GYRO_YOUT_L, GYRO_ZOUT_H, and GYRO_ZOUT_L)(R)
在寄存器 27 中定义了每个 16 位的角速度测量值的最大范围,对于设置的每个最大范围,都对应一个加速度的灵敏度 GYRO_xOUT,如下面的表中所示:
8)Register 107 – Power Management 1 (PWR_MGMT_1) (R/W)
该寄存器允许用户配置
电源模式和时钟源。它还提供了一个复位整个器件的位,和一个关闭温度传感器的位:
DEVICE_RESET 置 1 后所有的寄存器复位,随后 DEVICE_RESET 自动置 0.
SLEEP 置 1 后进入睡眠模式
CYCLE 当 CYCLE 被设置为 1,且 SLEEP 没有设置,MPU-60X0 进入循环模式,为了从速度传感器中获得采样值,在睡眠模式和正常数据采集模式之间切换,每次获得一个采样数据。在 LP_WAKE_CTRL(108)寄存器中,可以设置唤醒后的采样率和被唤醒的频率。
TEMP_DIS 置 1 后关闭温度传感器
CLKSEL 指定设备的时钟源
9)Register 117 – Who Am I (WHO_AM_I)(R)
WHO_AM_I 中的内容是 MPU-60X0 的 6 位 I2C 地址,上电复位的第 6 位到第 1 位值为:110100,为了让两个 MPU-6050 能够连接在一个 I2C 总线上,当 AD0 引脚逻辑低电平时,设备的地址是 b1101000 ,当 AD0 引脚逻辑高电平时,设备的地址是 b1101001 。
3、MPU-6050操作
在此之前应先初始化GPIO,I2C。
1)初始化
I2C_ByteWrite(PWR_MGMT_1,0x00); //解除休眠状态
I2C_ByteWrite(SMPLRT_DIV,0x07); //设置陀螺仪采样频率:f=(1or8)/1+值(KHz),开启带通时为1,关闭带通时为8,典型值:0x07
I2C_ByteWrite(CONFIG,0x06); //设置带通滤波器通频带
I2C_ByteWrite(GYRO_CONFIG,0x18); //陀螺仪量程0-2000度每秒,不自检测
I2C_ByteWrite(ACCEL_CONFIG,0x01); //加速度计滤波5Hz,量程2g,不自检测
2)读取原始数据
uint8_t buffer[14];
unsigned char REG_Addr=ACCEL_XOUT_H;
for(i=0;i<14;i++)
{
buffer
=I2C_ByteRead(REG_Addr++);
}
ax=(((int16_t)buffer[0]) << 8) | buffer[1];
ay=(((int16_t)buffer[2]) << 8) | buffer[3];
az=(((int16_t)buffer[4]) << 8) | buffer[5];
//跳过温度ADC
gx=(((int16_t)buffer[8]) << 8) | buffer[9];
gy=(((int16_t)buffer[10]) << 8) | buffer[11];
gz=(((int16_t)buffer[12]) << 8) | buffer[13];
3)
待续...