豌豆爹 发表于 2022-8-4 10:32

[经验] 外设学习-mpu6050

本帖最后由 豌豆爹 于 2022-8-4 10:34 编辑

MPU6050模块内部整合三轴陀螺仪、三轴加速度计以及数字运动处理器,通过IIC输出信号,可测量角加速度,通过数据处理得到pitch
Yaw、Roll角,自带数字温度传感器,VCC接5V,GND接单片机GDN、IIC接口为SCL(PB8)、SDA(PB9)、AD0设置地址角。
官方提供数据处理源码,如下:

代码:

豌豆爹 发表于 2022-8-4 10:35

先配置IO口,查看芯片手册,SCL为PB8,SDA为PB9,接着根据时序图配置。


豌豆爹 发表于 2022-8-4 10:36

看时序图,刚开始SDA和SCL都是高电平,接着SDA先变低电平,SCL接着变低电平,这是起始信号。

//停止信号
void IIC_Stop(void)
{
        SDA_OUT();
        IIC_SCL=0;
        IIC_SDA=0;
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;
        delay_us(4);
}

豌豆爹 发表于 2022-8-4 10:37

停止信号,SCL和SDA都是低电平,SCL先变高电平,SDA接着变高电平,这是结束信号。

void IIC_Wait_ACK(void)
{
      u8 ucErrTime=0;
      SDA_IN();
      IIC_SDA=1;delay_us(1);
      IIC_SCL=1;delay_us(1);
      while(READ_SDA)
      {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
      }
      IIC_SCL=0;
      return 0;
}

//产生应答
void IIC_ACK(void)
{
      IIC_SCL=0;
      SDA_OUT();
      IIC_SDA=0;
      delay_us(2);
      IIC_SCL=1;
      delay_us(2);IIC_SCL=0;}//不产生应答void IIC_NAck(void){        IIC_SCL=0;        SDA_OUT();        IIC_SDA=1;        delay_us(2);        IIC_SCL=1;        delay_us(2);        IIC_SCL=0;}


豌豆爹 发表于 2022-8-4 10:38

IIC总线上的数据都是8位字节传送,发送器每发送一个字节,在时钟脉冲期间释放数据线,由接收器反馈一个应答信号,ack=0(应答成功),ack=1(应答失败)

//IIC发送一个字节
void IIC_Send_Byte(u8 txd)
{
        u8 t;
        SDA_OUT();
        IIC_SCL=0;
        foR(t=0;t<8;t++)
        {
                IIC_SDA=(txd&0x80)>>7;
                txd<<=1;
                delay_us(2);
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;
                delay_us(2);
        }
}

//读一个字节
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//数据输入
        for(i=0;i<8;i++)
        {
                IIC_SCL=0;
                delay_us(2);
                IIC_SCL=1;
                receive<<=1;
                if(READ_SDA)receive++;
                delay_us(1);
        }
        if(!ack)
                        IIC_NAck();
        else
                  IIC_Ack();
        return receive;
}
MPU6050.C(正点原子官方代码)

//初始化MPU6050
//返回值:0,成功
//    其他,错误代码
u8 MPU_Init(void)
{
        u8 res;
        IIC_Init();//初始化IIC总线
        MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050
    delay_ms(100);
        MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050
        MPU_Set_Gyro_Fsr(3);                                        //陀螺仪传感器,±2000dps
        MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g
        MPU_Set_Rate(50);                                                //设置采样率50Hz
        MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //关闭所有中断
        MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭
        MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO
        MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效
        res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
        if(res==MPU_ADDR)//器件ID正确
        {
                MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考
                MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作
                MPU_Set_Rate(50);                                                //设置采样率为50Hz
        }else return 1;
        return 0;
}
//设置MPU6050陀螺仪传感器满量程范围

yiyigirl2014 发表于 2022-8-4 17:00

谢谢分享
页: [1]
查看完整版本: [经验] 外设学习-mpu6050