打印
[STM32C0]

【STM32C092RC 测评】+读取MPU6050数据测评

[复制链接]
276|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuyu40|  楼主 | 2025-5-21 18:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wuyu40 于 2025-5-23 16:30 编辑

#申请原创# 项目方案
在对四轴飞行器控制时需要检测空间3维速度和加速度,所以这个测试就是采集MPU6050传感器数据。本文介绍了 Nucleo-STM32C092 开发板通过IIC协议从MPU6050读取数据。
使用 STM32CubeMX 创建工程,配置 PC10、PC12分别设置为SDA和SCL引脚,需要配置为开漏模式;STM32CubeIDE 代码编译和初始化代码生成;
工程创建
使用 STM32CubeMX 快速创建工程,开启引脚设置。

生成代码,然后添加代码:
这里使用了江协科技的源码进行修改,将以下文件拷贝到工程文件夹下:

在项目管理器下进行设置:

在魔术棒中设置头文件路径:

修改关键代码:
void Delay_us(uint16_t i)
{i=i+30;
  while(i--);
}//延时时间可以调节,不一定是1us,cubemx实现us级别的延时不好实现//
void MyI2C_W_SCL(uint8_t BitValue)
{ if(BitValue!=0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
else  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
Delay_us(10);
}
//使用引脚模拟IIC协议,输出时钟
void MyI2C_W_SDA(uint8_t BitValue)
{
if(BitValue!=0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET);
else  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET);
Delay_us(10);
}
//使用引脚模拟IIC协议,输出数据
uint8_t MyI2C_R_SDA(void)
{
uint8_t BitValue;
BitValue =  HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_10);
Delay_us(10);
return BitValue;
}
void MyI2C_Start(void)
{
MyI2C_W_SDA(1);
Delay_us(1);
MyI2C_W_SCL(1);
Delay_us(1);
MyI2C_W_SDA(0);
Delay_us(1);
MyI2C_W_SCL(0);
Delay_us(1);
}
void MyI2C_Stop(void)
{
MyI2C_W_SDA(0);
Delay_us(1);
MyI2C_W_SCL(1);
Delay_us(1);
MyI2C_W_SDA(1);
Delay_us(1);
}
void MyI2C_SendByte(uint8_t Byte)
{
uint8_t i;
for (i = 0; i < 8; i ++)
{
MyI2C_W_SDA(!!(Byte & (0x80 >> i)));
Delay_us(1);
MyI2C_W_SCL(1);
Delay_us(1);
MyI2C_W_SCL(0);
Delay_us(1);
}
}
uint8_t MyI2C_ReceiveByte(void)
{
uint8_t i, Byte = 0x00;
MyI2C_W_SDA(1);
Delay_us(1);
for (i = 0; i < 8; i ++)
{
MyI2C_W_SCL(1);
Delay_us(1);
if (MyI2C_R_SDA()){Byte |= (0x80 >> i);}
MyI2C_W_SCL(0);
Delay_us(1);
}
return Byte;
}
void MyI2C_SendAck(uint8_t AckBit)
{
MyI2C_W_SDA(AckBit);
Delay_us(1);
MyI2C_W_SCL(1);
Delay_us(1);
MyI2C_W_SCL(0);
Delay_us(1);
}
uint8_t MyI2C_ReceiveAck(void)
{
uint8_t AckBit;
MyI2C_W_SDA(1);
Delay_us(1);
MyI2C_W_SCL(1);
Delay_us(1);
AckBit = MyI2C_R_SDA();
Delay_us(1);
MyI2C_W_SCL(0);
Delay_us(1);
return AckBit;
}
主函数较简单:
MX_GPIO_Init();
MPU6050_Init();
MPU6050_GetID();
while (1) {MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ); }
还有其他头文件、数据类型等都需要一一修改,最后给出调试结果:


使用特权

评论回复
沙发
AdaMaYun| | 2025-6-8 22:41 | 只看该作者
MPU6050非常不错

使用特权

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

本版积分规则

12

主题

41

帖子

0

粉丝