打印
[开发板]

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

[复制链接]
622|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言:实物如图所示,购买的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就不重复介绍
实物测试图片如下:


使用特权

评论回复
沙发
pmp| | 2025-1-3 11:25 | 只看该作者
在读取或写入MPU6050的寄存器之前,需要先发送设备地址和相应的读写位。
读写操作后,内部地址指针会自动加一,因此需要注意地址指针的变化。

使用特权

评论回复
板凳
jonas222| | 2025-1-3 11:57 | 只看该作者
在读取数据之前,需要将SDA引脚设置为输入模式(但在开漏输出模式下,如果施密特触发器打开,也可以不设置为输入模式直接读数据)。

使用特权

评论回复
地板
mollylawrence| | 2025-1-3 13:47 | 只看该作者
在读取数据的过程中,注意处理可能的中断和错误情况。例如,检查设备ID以确认MPU6050已正确连接,并在读取寄存器时处理可能的通信错误

使用特权

评论回复
5
cashrwood| | 2025-1-3 14:54 | 只看该作者
在读取数据时,可能会遇到IIC通信错误或数据校验错误。确保在软件中实现错误处理机制,以确保系统的稳定性和可靠性。

使用特权

评论回复
6
janewood| | 2025-1-3 15:55 | 只看该作者
MPU6050传输的数据通常为16位无符号整型,可能以补码形式存在。
需要根据数据手册正确解析数据,以获取加速度、角速度等参数。

使用特权

评论回复
7
pixhw| | 2025-1-3 17:01 | 只看该作者
连接SCL(时钟线)和SDA(数据线),并在每条线上加上4.7kΩ的上拉电阻,以确保信号的稳定。

使用特权

评论回复
8
mnynt121| | 2025-1-3 17:29 | 只看该作者
MPU6050的加速度和陀螺仪数据以16位补码形式存储在寄存器中。读取数据后,需要进行适当的转换,以获得实际的加速度和角速度值。参考MPU6050的数据手册

使用特权

评论回复
9
hudi008| | 2025-1-3 20:30 | 只看该作者
MPU6050 返回的数据是以字节为单位的,并且数据格式有特定的规定。例如,加速度计和陀螺仪的数据是 16 位的有符号整数,在读取数据后,需要根据数据手册中的说明,正确地将字节组合成完整的数据,并进行符号位的处理。

使用特权

评论回复
10
hilahope| | 2025-1-3 23:31 | 只看该作者
实现适当的错误检测机制,例如检查NACK条件或者超时情况,以便能够在出现问题时采取适当的措施。

使用特权

评论回复
11
tifmill| | 2025-1-4 02:31 | 只看该作者
MPU6050的数据更新率可以通过配置寄存器来设置。

使用特权

评论回复
12
youtome| | 2025-1-4 07:26 | 只看该作者
微控制器的I2C接口已正确初始化,包括设置合适的时钟速率和地址。使用开漏输出模式,并在SCL和SDA线上添加适当的上拉电阻(通常为4.7kΩ),以保证通信的稳定性

使用特权

评论回复
13
primojones| | 2025-1-5 11:00 | 只看该作者
I2C通信的时钟频率应保持在MCU和MPU6050都能支持的范围内。
通常建议时钟频率保持在1MHz以下,以避免干扰和提高通信稳定性。

使用特权

评论回复
14
bestwell| | 2025-1-5 11:29 | 只看该作者
MPU6050有两个IIC地址,分别是0x68和0x69,这取决于AD0引脚的电平。确保在读取数据时使用正确的设备地址。

使用特权

评论回复
15
vivilyly| | 2025-1-5 13:43 | 只看该作者
MPU6050 需要稳定的电源供应,通常工作电压为 3.3V 或 5V。要确保电源的纹波系数较小,并且在数据读取过程中不会出现电压波动。如果电源不稳定,可能会导致 MPU6050 工作异常,从而影响数据读取的准确性。

使用特权

评论回复
16
plsbackup| | 2025-1-5 16:38 | 只看该作者
IIC 总线有一定的数据传输速率限制,要根据实际情况合理设置 SCL 时钟频率。如果时钟频率过高,可能会导致 MPU6050 无法及时响应,出现通信错误;如果时钟频率过低,则会影响数据读取的速度。同时,在每次发送或接收数据后,要根据 MPU6050 的数据手册给出的响应时间,适当设置等待时间,以确保数据传输的完整性。

使用特权

评论回复
17
iyoum| | 2025-1-5 17:02 | 只看该作者
MPU6050内置了数字滤波器,可以通过配置寄存器来调整滤波器的参数,以改善数据的稳定性和准确性。

使用特权

评论回复
18
sdCAD| | 2025-1-5 18:44 | 只看该作者
MPU6050 输出的数据可能需要进行校准和单位换算。

使用特权

评论回复
19
elsaflower| | 2025-1-5 19:09 | 只看该作者
可以在通信端口串联电阻和电容,以增强抗干扰能力。

使用特权

评论回复
20
hilahope| | 2025-1-5 20:23 | 只看该作者
MPU6050支持中断功能,可以通过配置中断引脚来实现数据就绪中断。这可以减少CPU的轮询次数,提高系统的效率。

使用特权

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

本版积分规则

49

主题

127

帖子

0

粉丝