本帖最后由 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); }
还有其他头文件、数据类型等都需要一一修改,最后给出调试结果:
|