打印
[开发板]

CW32L0开发板学习记录六:IIC读取MPU6050数据

[复制链接]
83|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言:实物如图所示,购买的MPU 6050模块,在其他32的单片机里面研究过一次,现在将软件代码工程移植到CW32L010开发板里面,也可以正常使用,这里使用了软件模拟出来的IIC与模块进行通讯。
一:MPU6050模块的基本介绍
1. MPU6050是一种常用的六轴姿态传感器模块,结合了三轴陀螺仪和三轴加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。MPU6050 对陀螺仪和加速度计分别用了三个16 位的ADC(0~65535),将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,
MPU-6000(6050)的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的IIC或最高达20MHz的SPI(MPU-6050没有SPI)。MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VDDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。:
二:硬件资源以及引脚配置
CW32L010开发板,0.96的OLED模块,MPU6050模块,调试器使用的WCH-link;
【GY-521模块与CW32L010开发板连接方式】:            VCC<-->+DVCC
GND<-->DVSS
SCL<-->PB5
SDA<-->PB4
【OLED显示屏与CW32L010开发板连接方式】:             VCC<-->+DVCC
GND<-->DVSS
SCL<-->PA3
SDA<-->PA4
注:SCL和SDA是连接MCU的IIC接口,MCU通过这个IIC接口来控制MPU6050,
另外还有一个IIC接口:AXCL和 XDA,这个接口可用来连接外部从设备,比如磁传感 器,这样就可以组成一个九轴传感器。VLOGIC是IO口电压,该引脚最低可以到1.8V,我们 一般直接接VDD即可。AD0是从IIC接口(接MCU)的地址控制引脚,该引脚控制IIC地址 的最低位。如果接GND,则MPU6050的IIC地址是:0X68,如果接VDD,则是0X69,注意: 这里的地址是不包含数据传输的最低位的(最低位用来表示读写)
MPU6050的默认IIC地址是:0X68,如果AD0接VDD,则是0X69。需要注意的是:这里的地址0x68(110 1000)和0x69(110 1001)是不包含最低位的7位数据,通常最低位用于表示IIC主机的读取数据/写数据模式。如默认情况下对MPU6050进行写操作,则发送地址0xD0(1101 0000),读操作则发送地址0xD1(1101 0001)。
寄存器说明:

该寄存器是配置陀螺仪输出速率的分频器,用于为MPU-6050生成采样速率。这里有个公式:采样频率=陀螺仪输出频率/(1+采样分频数)。当 DLPF(数字低通滤波器,见寄存器Configuration)禁用时,陀螺仪输出频率为8kHz;当 DLPF 使能,陀螺仪输出频率=1KHz。

该寄存器为陀螺仪和加速度计配置外部帧同步(FSYNC) 管脚的采样和数字低通滤波(DLPF)设置。其中,数字低通滤波器DLPF由DLPF_CFG配置。根据下表所示的DLPF_CFG值对加速度计和陀螺仪进行滤波。

FS为陀螺仪输出频率。SMPLRT_DIV由预设定的采样频率根据上述的公式计算得出。一般情况下,DPLF滤波频率为采样频率的一半,如设定采样频率为50Hz,由表可知当FS为1kHz,SMPLRT_DIV的值为1000/50-1=19。

该寄存器是用来触发陀螺仪自检和配置陀螺仪的满量程范围。其中,XG_ST、YG_ST、ZG_ST分别用来设置陀螺仪X轴、Y轴、Z轴自检,置0则不触发自检。FS_SEL[1:0]用于设置陀螺仪的满量程,如下表:

我们一般设置为3,即满量程为±2000°/s

寄存器是用来触发加速度计自检和配置加速度计的满量程范围。同时这个寄存器也可以用于配置数字高通滤波器(DHPF)。其中,XA_ST、YA_ST、ZA_ST分别用来设置加速度计X轴、Y轴、Z轴自检,置0则不触发自检。AFS_SEL[1:0]用于选择加速度计的满量程范围,如下表:

我们一般设置为0,即满量程为±2g

主要代码如下:
void GY_521_Init(void)  //GY-521初始化
{
        GY521_GPIO_Init();  //GPIO初始化
        //解除睡眠,失能温度传感器,选择X轴的陀螺仪时钟
        WriteData(GY521_ADDR, MPU6050_PWR_MGMT_1, 0x09);
        WriteData(GY521_ADDR, MPU6050_CONFIG, 0x06); //低通滤波
        WriteData(GY521_ADDR, MPU6050_SMPRT_DIV, 0x09); //1KHz十分频为100Hz
        WriteData(GY521_ADDR, MPU6050_GYRO_CONFIG, 0x18);//陀螺仪最大量程:正负2000°/秒
        WriteData(GY521_ADDR, MPU6050_ACCEL_CONFIG, 0x18);//加速度计最大量程:正负16g
}
void MPU6050_GetData()  //获取MPU6050六轴数据
{
        uint8_t MPU6050_Raw_Data[14]={0};
        //以MPU6050_ACCEL_XOUT_H为起始地址,连续读取14字节的数据
        ReadData(GY521_ADDR,MPU6050_ACCEL_XOUT_H,MPU6050_Raw_Data,14);
        //数据处理
        Adata.X=(MPU6050_Raw_Data[0]<<8)|MPU6050_Raw_Data[1];
        Adata.Y=(MPU6050_Raw_Data[2]<<8)|MPU6050_Raw_Data[3];
        Adata.Z=(MPU6050_Raw_Data[4]<<8)|MPU6050_Raw_Data[5];
        Gdata.X=(MPU6050_Raw_Data[8]<<8)|MPU6050_Raw_Data[9];
        Gdata.Y=(MPU6050_Raw_Data[10]<<8)|MPU6050_Raw_Data[11];
        Gdata.Z=(MPU6050_Raw_Data[12]<<8)|MPU6050_Raw_Data[13];
}

void display_MPL3115A2(struct MPL3115A2 *p)
{

                OLED_ShowSignedNum(2,8,p->pre,5);
                OLED_ShowSignedNum(3,8,p->Alt,5);
                OLED_ShowSignedNum(4,8,p->Tmp,5);
}
因为使用的模拟的IIC 操作过程和OLED操作类似,这里i就不重复介绍
实物测试图片如下:


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

111

帖子

0

粉丝