M0G3507完美移植江科大软件IIC MPU6050
dogs-tom 2024-08-16 13:35:07 阅读 58
经过两天两夜的查阅文献资料、整理学习,成功的把江科大的软件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时序模拟
<code>//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引脚 |
GND | GND |
SCL | PA9 |
SDA | PA8 |
VCC | VCC |
参考资料:STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili
百度网盘,无需密码,配合自己的OLED
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。