【库函数版本】基于STM32F103的MPU6050的原始数据读取程序详解

 因为我的博客已经对I2C协议的详细过程已经做了一个例子!所以这个MPU6050的程序我将使用库函数完成!


第一步:硬件连接:



第二步:初始化I2C端口的函数:

/***PB6/PB7 端口初始化****/

static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB,ENABLE ); 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; 
GPIO_Init(GPIOB, &GPIO_InitStructure); 
}

/***模式设置 使能I2C***/

static void I2C_Mode_Config(void)
{
I2C_InitTypeDef I2C_InitStructure; 

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; 
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; 
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; 
I2C_InitStructure.I2C_ClockSpeed = 50000; 

I2C_Init(I2C1, &I2C_InitStructure);   

I2C_Cmd  (I2C1,ENABLE); 

I2C_AcknowledgeConfig(I2C1, ENABLE);   
}

/***初始化***/

void I2C_MPU6050_Init(void)
{   
  I2C_GPIO_Config();
I2C_Mode_Config();


第三步:写一个写数据函数和一个读数据函数

/** 读数据函数****/

void I2C_ByteWrite(uint8_t REG_Address,uint8_t REG_data)
{
  I2C_GenerateSTART(I2C1,ENABLE);

  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);

  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  I2C_SendData(I2C1,REG_Address);

  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  I2C_SendData(I2C1,REG_data);

  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  I2C_GenerateSTOP(I2C1,ENABLE);
}


/*** 读数据函数 **/

uint8_t I2C_ByteRead(uint8_t REG_Address)
{
uint8_t REG_data;

while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

I2C_GenerateSTART(I2C1,ENABLE);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_Cmd(I2C1,ENABLE);

I2C_SendData(I2C1,REG_Address);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTART(I2C1,ENABLE);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Receiver);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

I2C_AcknowledgeConfig(I2C1,DISABLE);

I2C_GenerateSTOP(I2C1,ENABLE);

while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));

REG_data=I2C_ReceiveData(I2C1);

return REG_data;
}

  

/** mpu6050初始化***/  

void InitMPU6050(void)
{
I2C_ByteWrite(PWR_MGMT_1,0x00);

I2C_ByteWrite(SMPLRT_DIV,0x07);

I2C_ByteWrite(CONFIG,0x06);

I2C_ByteWrite(GYRO_CONFIG,0x18);

I2C_ByteWrite(ACCEL_CONFIG,0x01);
}


最后一步:

先写一个获取数据的函数:

unsigned int GetData(unsigned char REG_Address)
{
char H,L;
H=I2C_ByteRead(REG_Address);
L=I2C_ByteRead(REG_Address+1);
return (H<<8)+L;   
}

/**打印输出**/

主函数:

int main(void)
{
      //延时函数自己写
USART1_Config(); //串口数据发送自己写

I2C_MPU6050_Init(); 

         InitMPU6050();

while(1)
{
printf("\r\n---------加速度X轴原始数据--------%d \r\n",GetData(ACCEL_XOUT_H));
printf("\r\n---------加速度Y轴原始数据---------%d \r\n",GetData(ACCEL_YOUT_H));
printf("\r\n---------加速度Z轴原始数据----------%d \r\n",GetData(ACCEL_ZOUT_H));
printf("\r\n---------陀螺仪X轴原始数据----------%d \r\n",GetData(GYRO_XOUT_H));
printf("\r\n---------陀螺仪Y轴原始数据----------%d \r\n",GetData(GYRO_YOUT_H));
printf("\r\n---------陀螺仪Z轴原始数据----------%d \r\n",GetData(GYRO_ZOUT_H));
delay_ms(2000);
printf("===================================================================== /r/n");
}

}


PC显示结果:


完成了!!!

  • 19
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
以下是基于STM32F103MPU6050姿态测量程序的示例代码: ```c #include "stm32f10x.h" #include "math.h" #include "uart.h" #include "mpu6050.h" #define PI 3.1415926535f float Acc_X, Acc_Y, Acc_Z; float Gyro_X, Gyro_Y, Gyro_Z; float Roll, Pitch, Yaw; void Delay(u32 count) { u32 i,j; for(i=0;i<count;i++) { for(j=0;j<1000;j++); } } void MPU6050_Init(void) { I2C_WriteByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x00); I2C_WriteByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_CONFIG, 0x06); I2C_WriteByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_SMPLRT_DIV, 0x00); I2C_WriteByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, 0x18); I2C_WriteByte(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_CONFIG, 0x01); } void MPU6050_Read(void) { Acc_X = (float)I2C_ReadWord(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H) / 16384.0f; Acc_Y = (float)I2C_ReadWord(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_YOUT_H) / 16384.0f; Acc_Z = (float)I2C_ReadWord(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_ZOUT_H) / 16384.0f; Gyro_X = (float)I2C_ReadWord(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_XOUT_H) / 16.4f; Gyro_Y = (float)I2C_ReadWord(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_YOUT_H) / 16.4f; Gyro_Z = (float)I2C_ReadWord(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_ZOUT_H) / 16.4f; } void Get_Attitude(void) { Roll = atan2(Acc_Y, Acc_Z) * 180.0f / PI; Pitch = atan2(-Acc_X, sqrt(Acc_Y * Acc_Y + Acc_Z * Acc_Z)) * 180.0f / PI; Yaw = Gyro_Z * 0.001f; } int main(void) { UART_Config(); I2C_Config(); MPU6050_Init(); while(1) { MPU6050_Read(); Get_Attitude(); printf("Roll: %.2f, Pitch: %.2f, Yaw: %.2f\r\n", Roll, Pitch, Yaw); Delay(100); } } ``` 代码解析: 1. 在 `MPU6050_Init()` 函数中,写入 MPU6050 的初始化配置,包括关闭睡眠模式、配置陀螺仪和加速度计的满量程范围等。 2. 在 `MPU6050_Read()` 函数中,读取 MPU6050 的加速度计和陀螺仪数据,并将数据转换为浮点数类型。 3. 在 `Get_Attitude()` 函数中,根据加速度计数据计算出 Roll 和 Pitch 角度,根据陀螺仪数据计算出 Yaw 角速度。 4. 在 `main()` 函数中,循环读取 MPU6050 数据并计算姿态角,并通过串口输出。 需要注意的是,以上代码中的 `UART_Config()`、`I2C_Config()`、`I2C_WriteByte()`、`I2C_ReadWord()` 函数并未给出实现,需要根据实际情况自行实现或引用已有的库函数
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值