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

[复制链接]
4170|37
 楼主| 聪聪哥哥 发表于 2024-12-30 16:29 | 显示全部楼层 |阅读模式
前言:实物如图所示,购买的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)。
寄存器说明:
1.png
该寄存器是配置陀螺仪输出速率的分频器,用于为MPU-6050生成采样速率。这里有个公式:采样频率=陀螺仪输出频率/(1+采样分频数)。当 DLPF(数字低通滤波器,见寄存器Configuration)禁用时,陀螺仪输出频率为8kHz;当 DLPF 使能,陀螺仪输出频率=1KHz。
2.png
该寄存器为陀螺仪和加速度计配置外部帧同步(FSYNC) 管脚的采样和数字低通滤波(DLPF)设置。其中,数字低通滤波器DLPF由DLPF_CFG配置。根据下表所示的DLPF_CFG值对加速度计和陀螺仪进行滤波。
3.png
FS为陀螺仪输出频率。SMPLRT_DIV由预设定的采样频率根据上述的公式计算得出。一般情况下,DPLF滤波频率为采样频率的一半,如设定采样频率为50Hz,由表可知当FS为1kHz,SMPLRT_DIV的值为1000/50-1=19。
4.png
该寄存器是用来触发陀螺仪自检和配置陀螺仪的满量程范围。其中,XG_ST、YG_ST、ZG_ST分别用来设置陀螺仪X轴、Y轴、Z轴自检,置0则不触发自检。FS_SEL[1:0]用于设置陀螺仪的满量程,如下表:
5.png
我们一般设置为3,即满量程为±2000°/s
6.png
寄存器是用来触发加速度计自检和配置加速度计的满量程范围。同时这个寄存器也可以用于配置数字高通滤波器(DHPF)。其中,XA_ST、YA_ST、ZA_ST分别用来设置加速度计X轴、Y轴、Z轴自检,置0则不触发自检。AFS_SEL[1:0]用于选择加速度计的满量程范围,如下表:
7.png
我们一般设置为0,即满量程为±2g
8.png
主要代码如下:
  1. void GY_521_Init(void)  //GY-521初始化
  2. {
  3.         GY521_GPIO_Init();  //GPIO初始化
  4.         //解除睡眠,失能温度传感器,选择X轴的陀螺仪时钟
  5.         WriteData(GY521_ADDR, MPU6050_PWR_MGMT_1, 0x09);
  6.         WriteData(GY521_ADDR, MPU6050_CONFIG, 0x06); //低通滤波
  7.         WriteData(GY521_ADDR, MPU6050_SMPRT_DIV, 0x09); //1KHz十分频为100Hz
  8.         WriteData(GY521_ADDR, MPU6050_GYRO_CONFIG, 0x18);//陀螺仪最大量程:正负2000°/秒
  9.         WriteData(GY521_ADDR, MPU6050_ACCEL_CONFIG, 0x18);//加速度计最大量程:正负16g
  10. }
  1. void MPU6050_GetData()  //获取MPU6050六轴数据
  2. {
  3.         uint8_t MPU6050_Raw_Data[14]={0};
  4.         //以MPU6050_ACCEL_XOUT_H为起始地址,连续读取14字节的数据
  5.         ReadData(GY521_ADDR,MPU6050_ACCEL_XOUT_H,MPU6050_Raw_Data,14);
  6.         //数据处理
  7.         Adata.X=(MPU6050_Raw_Data[0]<<8)|MPU6050_Raw_Data[1];
  8.         Adata.Y=(MPU6050_Raw_Data[2]<<8)|MPU6050_Raw_Data[3];
  9.         Adata.Z=(MPU6050_Raw_Data[4]<<8)|MPU6050_Raw_Data[5];
  10.         Gdata.X=(MPU6050_Raw_Data[8]<<8)|MPU6050_Raw_Data[9];
  11.         Gdata.Y=(MPU6050_Raw_Data[10]<<8)|MPU6050_Raw_Data[11];
  12.         Gdata.Z=(MPU6050_Raw_Data[12]<<8)|MPU6050_Raw_Data[13];
  13. }

  14. void display_MPL3115A2(struct MPL3115A2 *p)
  15. {

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

pmp 发表于 2025-1-3 11:25 | 显示全部楼层
在读取或写入MPU6050的寄存器之前,需要先发送设备地址和相应的读写位。
读写操作后,内部地址指针会自动加一,因此需要注意地址指针的变化。
jonas222 发表于 2025-1-3 11:57 | 显示全部楼层
在读取数据之前,需要将SDA引脚设置为输入模式(但在开漏输出模式下,如果施密特触发器打开,也可以不设置为输入模式直接读数据)。
mollylawrence 发表于 2025-1-3 13:47 | 显示全部楼层
在读取数据的过程中,注意处理可能的中断和错误情况。例如,检查设备ID以确认MPU6050已正确连接,并在读取寄存器时处理可能的通信错误
cashrwood 发表于 2025-1-3 14:54 | 显示全部楼层
在读取数据时,可能会遇到IIC通信错误或数据校验错误。确保在软件中实现错误处理机制,以确保系统的稳定性和可靠性。
janewood 发表于 2025-1-3 15:55 | 显示全部楼层
MPU6050传输的数据通常为16位无符号整型,可能以补码形式存在。
需要根据数据手册正确解析数据,以获取加速度、角速度等参数。
pixhw 发表于 2025-1-3 17:01 | 显示全部楼层
连接SCL(时钟线)和SDA(数据线),并在每条线上加上4.7kΩ的上拉电阻,以确保信号的稳定。
mnynt121 发表于 2025-1-3 17:29 | 显示全部楼层
MPU6050的加速度和陀螺仪数据以16位补码形式存储在寄存器中。读取数据后,需要进行适当的转换,以获得实际的加速度和角速度值。参考MPU6050的数据手册
hudi008 发表于 2025-1-3 20:30 | 显示全部楼层
MPU6050 返回的数据是以字节为单位的,并且数据格式有特定的规定。例如,加速度计和陀螺仪的数据是 16 位的有符号整数,在读取数据后,需要根据数据手册中的说明,正确地将字节组合成完整的数据,并进行符号位的处理。
hilahope 发表于 2025-1-3 23:31 | 显示全部楼层
实现适当的错误检测机制,例如检查NACK条件或者超时情况,以便能够在出现问题时采取适当的措施。
tifmill 发表于 2025-1-4 02:31 | 显示全部楼层
MPU6050的数据更新率可以通过配置寄存器来设置。
youtome 发表于 2025-1-4 07:26 | 显示全部楼层
微控制器的I2C接口已正确初始化,包括设置合适的时钟速率和地址。使用开漏输出模式,并在SCL和SDA线上添加适当的上拉电阻(通常为4.7kΩ),以保证通信的稳定性
primojones 发表于 2025-1-5 11:00 | 显示全部楼层
I2C通信的时钟频率应保持在MCU和MPU6050都能支持的范围内。
通常建议时钟频率保持在1MHz以下,以避免干扰和提高通信稳定性。
bestwell 发表于 2025-1-5 11:29 | 显示全部楼层
MPU6050有两个IIC地址,分别是0x68和0x69,这取决于AD0引脚的电平。确保在读取数据时使用正确的设备地址。
vivilyly 发表于 2025-1-5 13:43 | 显示全部楼层
MPU6050 需要稳定的电源供应,通常工作电压为 3.3V 或 5V。要确保电源的纹波系数较小,并且在数据读取过程中不会出现电压波动。如果电源不稳定,可能会导致 MPU6050 工作异常,从而影响数据读取的准确性。
plsbackup 发表于 2025-1-5 16:38 | 显示全部楼层
IIC 总线有一定的数据传输速率限制,要根据实际情况合理设置 SCL 时钟频率。如果时钟频率过高,可能会导致 MPU6050 无法及时响应,出现通信错误;如果时钟频率过低,则会影响数据读取的速度。同时,在每次发送或接收数据后,要根据 MPU6050 的数据手册给出的响应时间,适当设置等待时间,以确保数据传输的完整性。
iyoum 发表于 2025-1-5 17:02 | 显示全部楼层
MPU6050内置了数字滤波器,可以通过配置寄存器来调整滤波器的参数,以改善数据的稳定性和准确性。
sdCAD 发表于 2025-1-5 18:44 | 显示全部楼层
MPU6050 输出的数据可能需要进行校准和单位换算。
elsaflower 发表于 2025-1-5 19:09 | 显示全部楼层
可以在通信端口串联电阻和电容,以增强抗干扰能力。
hilahope 发表于 2025-1-5 20:23 | 显示全部楼层
MPU6050支持中断功能,可以通过配置中断引脚来实现数据就绪中断。这可以减少CPU的轮询次数,提高系统的效率。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

307

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部