STM32/STM8技术论坛
直播中

wghou

12年用户 162经验值
擅长:控制/MCU
私信 关注
[资料]

MPU-6050模块学习笔记 / 附STM32例程

本帖最后由 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 — Configuration (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)

待续...

回帖(2)

李玉强

2017-12-20 10:48:31
你好,请教个问题啊,我现在加速晃动然后停止,数据很久才能稳定
举报

Kennard

2018-5-10 11:22:50
大神啊,膜拜啊
的点点滴滴多多多多多多多多多多多多多多多多多多多多多多多多
举报

更多回帖

发帖
×
20
完善资料,
赚取积分