M0G3507完美移植江科大软件IIC MPU6050

经过两天两夜的查阅文献资料、整理学习,成功的把江科大的软件IIC读写MPU6050移植到MSPM0G3507,亲测有效!!包的,为了让大家直观地感受下,先上图。记得点个赞哦!

学过江科大的STM32的小伙伴是不是觉得这个画面非常熟悉,在这里我选的是满量程为16g,且陀螺仪水平放置,根据Z轴的读数可以计算出当地的重力加速度值,计算公式为读数(X/2^15)*16,即1963/32768*16=0.96。

思路讲解

1.软硬件型号

选择CCS theia进行M0G3507的开发,显示屏为0.96寸4引脚OLED显示屏,陀螺仪选择常见的MPU6050,GY-521模块。

 2.软件IIC时序模拟

//IIC写SDA引脚
void MyI2C_W_SDA(uint8_t BitValue)
{
    SDA_ON();
    if(BitValue)
        DL_GPIO_setPins(GPIO_sda_PORT, GPIO_sda_PIN_0_PIN);
    else
        DL_GPIO_clearPins(GPIO_sda_PORT, GPIO_sda_PIN_0_PIN);
	Delay_us(8);					//延时8us,防止时序频率超过要求
}
//IIC写SCL引脚
void MyI2C_W_SCL(uint8_t BitValue)
{
    if(BitValue)
        DL_GPIO_setPins(GPIO_scl_PORT, GPIO_scl_PIN_1_PIN);
    else
        DL_GPIO_clearPins(GPIO_scl_PORT, GPIO_scl_PIN_1_PIN);
	Delay_us(8);	//延时8us,防止时序频率超过要求
}

//IIC开始
void MyI2C_Start(void)
{
    SDA_OUT();
	MyI2C_W_SDA(1);				//释放SDA,确保SDA为高电平
	MyI2C_W_SCL(1);				//释放SCL,确保SCL为高电平
	MyI2C_W_SDA(0);				//在SCL高电平期间,拉低SDA,产生起始信号
	MyI2C_W_SCL(0);				//起始后拉低SCL,为了占用总线,方便总线时序的拼接
}

 3.IIC发送一个字节数据

void MyI2C_SendByte(uint8_t Byte)
{
    SDA_ON();
	uint8_t i;
	for (i = 0; i < 8; i ++)				//循环8次,主机依次发送数据的每一位
	{
		MyI2C_W_SDA(Byte & (0x80 >> i));	//使用掩码的方式取出Byte的指定一位数据并写入到SDA线
		MyI2C_W_SCL(1);						//释放SCL,从机在SCL高电平期间读取SDA
		MyI2C_W_SCL(0);						//拉低SCL,主机开始发送下一位数据
	}
}
4.IIC接收一个字节的数据
uint8_t MyI2C_ReceiveByte(void)
{
    SDA_ON();
	uint8_t i, Byte = 0x00;	//定义接收的数据,并赋初值0x00
	MyI2C_W_SDA(1);			//接收前,主机先确保释放SDA,避免干扰从机的数据发送
	for (i = 0; i < 8; i ++)	//循环8次,主机依次接收数据的每一位
	{
        SDA_OFF();
		MyI2C_W_SCL(1);						//释放SCL,主机机在SCL高电平期间读取SDA
		if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}	//读取SDA数据,并存储到Byte变量
	//当SDA为1时,置变量指定位为1,当SDA为0时,不做处理,指定位为默认的初值0
		MyI2C_W_SCL(0);						//拉低SCL,从机在SCL低电平期间写入SDA
	}
	return Byte;							//返回接收到的一个字节数据
}
5.IIC发送应答位
void MyI2C_SendAck(uint8_t AckBit)
{
    SDA_ON();
	MyI2C_W_SDA(AckBit);					//主机把应答位数据放到SDA线
	MyI2C_W_SCL(1);							//释放SCL,从机在SCL高电平期间,读取应答位
	MyI2C_W_SCL(0);							//拉低SCL,开始下一个时序模块
}
6.IIC接收应答位
uint8_t MyI2C_ReceiveAck(void)
{
    SDA_ON();
	uint8_t AckBit;							
	MyI2C_W_SDA(1);			//接收前,主机先确保释放SDA,避免干扰从机的数据发送
	MyI2C_W_SCL(1);			//释放SCL,主机机在SCL高电平期间读取SDA
    SDA_OFF();
	AckBit = MyI2C_R_SDA();			
	MyI2C_W_SCL(0);				//拉低SCL,开始下一个时序模块
	return AckBit;				//返回定义应答位变量
}
7.MPU6050写数据
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//发送从机地址(0xD0),读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(Data);				//发送要写入寄存器的数据
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_Stop();						//I2C终止
}
8.MPU6050读数据
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t Data;
	  
	MyI2C_Start();						//I2C起始
	MyI2C_SendByte(MPU6050_ADDRESS);	//发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);			//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	
	MyI2C_Start();						//I2C重复起始
	MyI2C_SendByte(MPU6050_ADDRESS | 0x01);	//发送从机地址,读写位为1,表示即将读取
	MyI2C_ReceiveAck();					//接收应答
	Data = MyI2C_ReceiveByte();			//接收指定寄存器的数据
	MyI2C_SendAck(1);					//发送应答,给从机非应答,终止从机的数据输出
	MyI2C_Stop();						//I2C终止
	
	return Data;
}
9.main.c
#include "ti_msp_dl_config.h"
#include "oled.h"
#include "mpu6050.h"
#include "ti/driverlib/dl_gpio.h"
int16_t AX,AY,AZ,GX,GY,GZ;
int main(void)
{
    SYSCFG_DL_init();
    OLED_Init();
    OLED_CLS();
    MPU6050_Init();
    //MPU6050_WriteReg(0x19,0x00);
    while (1)
    {
        MPU6050_GetData(&AX,&AY,&AZ,&GX,&GY,&GZ);
        OLED_ShowString(2,1,"AX:");
		OLED_ShowSignedNum(2,4,AX,4);

        OLED_ShowString(3,1,"AY:");
		OLED_ShowSignedNum(3,4,AY,4);

        OLED_ShowString(4,1,"AZ:");
		OLED_ShowSignedNum(4,4,AZ,4);

        OLED_ShowString(2,9,"GX:");
		OLED_ShowSignedNum(2,12,AX,4);

        OLED_ShowString(3,9,"GY:");
		OLED_ShowSignedNum(3,12,GY,4);

        OLED_ShowString(4,9,"GZ:");
		OLED_ShowSignedNum(4,12,GZ,4);


    }
}
10.总结

        在syscfg中配置好MPU6050的SDA和SCL引脚,通过软件模拟IIC时序,对MPU6050进行读写操作。作为嵌入式的小伙伴们,都知道MPU6050的重要性,它可以用于飞行控制和姿态稳定,提供的角速度和加速度数据对于无人机的稳定飞行至关重要,能够帮助无人机实现精确的姿态调整和位置控制,在智能小车中,MPU6050可用于检测机器人的姿态和运动状态,帮助机器人实现自主导航和避障。

        现在比较成功的案例是嘉立创的1306系列的开发板,但是讲解资料少,羞涩难懂,小编这个成功地将江科大讲解的MPU6050移植到M0G3507,视频讲解细致,函数形式和参数通俗易懂,包会的!!需要完整的MPU6050代码可以留言哦,然后可以搭配自己的OLED进行结果的展示,这是小编花了两天多的时间才成功移植,成功地读取到了陀螺仪的六轴数据,接下来就可以进行姿态解算继续完成M0G3507的项目啦!

MPU6050引脚M0G3507引脚
GNDGND
SCLPA9
SDAPA8
VCCVCC

参考资料:STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

百度网盘,无需密码,配合自己的OLED

  • 93
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 212
    评论
### 回答1: CubeMX是一款由STMicroelectronics开发的软件工具,用于配置和生成基于ST微电子产品的嵌入式软件。它为嵌入式系统开发提供了强大的图形化界面,可以简化配置过程并生成代码框架。MPU6050是一款六轴陀螺仪与加速度计传感器,由InvenSense公司制造,可以用于测量和检测设备的姿态、加速度和角速度等信息。 使用CubeMX配置I2C(Inter-Integrated Circuit)通信协议与MPU6050传感器进行通信是相对简单的过程。首先,打开CubeMX并选择您的STM32微控制器型号。然后,从外设中选择I2C,并启用所需的I2C通道。接下来,您需要在参数设置中配置I2C的时钟频率和模式。在配置完I2C外设后,您需要为MPU6050传感器定义一个I2C设备地址。通常,MPU6050的I2C设备地址为0x68或0x69,具体取决于AD0引脚的连接方式。 完成配置后,使用CubeMX生成代码框架。生成的代码将包含初始化I2C外设的函数和配置MPU6050传感器的函数。在您的应用程序中,您可以调用这些函数来初始化I2C并与MPU6050传感器进行通信。通常,MPU6050传感器的数据可以通过读取寄存器来获取。例如,您可以读取加速度计和陀螺仪的数据寄存器,并使用相应的算法进行处理和解读。 总之,CubeMX是一个实用的配置工具,可以简化I2C与MPU6050传感器的集成过程。通过正确配置I2C外设和定义MPU6050的I2C设备地址,您可以使用生成的代码框架与MPU6050传感器进行通信并获取其测量数据。 ### 回答2: CubeMX是一个适用于STM32系列微控制器的集成开发环境(IDE)。它可以帮助开发者在STMCube软件生态系统中生成初始化代码。而IIC(Inter-Integrated Circuit)是一种串行通信协议,用于在微控制器和其他外设之间进行数据传输。MPU6050则是一种六轴惯性测量单元(IMU),可以测量加速度和角速度。 使用CubeMX进行IICMPU6050的集成开发可以方便地初始化和配置IIC总线及MPU6050。在CubeMX中,可以选择使用哪个IIC总线,设置数据传输速率和寄存器地址等参数。然后,生成的初始化代码可以在IDE中使用,通过IIC总线与MPU6050进行通信。 在代码中,可以使用IIC库函数来实现IIC通信,并通过读写MPU6050的寄存器来读取传感器的数据。例如,可以读取加速度数据和角速度数据,以及温度数据。这些数据可以用来进行姿态估计、运动控制等应用。 通过使用CubeMX和IIC,我们可以快速且方便地实现STM32微控制器与MPU6050之间的通信。这样,开发者可以更专注于应用程序的开发,而无需过多关心底层的硬件配置和通信细节。同时,这也提高了开发效率,缩短了开发周期。 ### 回答3: Cubemx是一个集成开发环境(IDE)软件,主要用于进行嵌入式系统的开发。IIC是一种串行通信协议,全称为Inter-Integrated Circuit,常用于连接微控制器和外部设备。MPU6050是一种集成了三轴加速度计和三轴陀螺仪的传感器,常用于检测和测量物体的运动。 在使用Cubemx进行MPU6050IIC通信时,首先需要通过Cubemx的界面配置IIC总线的相关参数,包括引脚分配、时钟频率等。然后,通过编写C代码,利用Cubemx提供的函数库,实现相应的IIC读写操作。 首先,我们需要初始化MPU6050传感器。利用IIC通信,我们可以写入相应的控制寄存器,设置传感器的工作模式、测量范围等参数。然后,我们可以通过IIC读取相应的寄存器,获取传感器测量到的加速度和角速度值。 以读取加速度值为例,我们可以使用Cubemx提供的函数库中的相应函数,将MPU6050的寄存器地址和读取数据的长度作为参数,发送读取命令,然后接收传感器返回的数据。接收到数据后,我们可以进行进一步的处理,将其转换为加速度值。类似地,我们也可以通过IIC通信读取MPU6050测量到的角速度值。 通过Cubemx的配置和相应的编程操作,我们可以实现基于MPU6050的加速度计和陀螺仪的相关功能。这对于需要测量和检测物体运动的嵌入式系统开发非常有用。
评论 212
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值