Fork me on GitHub

一 前记
MPU-60X0 是全球首例9 轴运动处理传感器。它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C 或SPI 接口输出一个9 轴的信号(SPI 接口仅在MPU-6000 可用)。MPU-60X0 也可以通过其I2C 接口连接非惯性的数字传感器,比如压力传感器。该传感器在可穿戴市场应用十分广泛。把该传感器和超低功耗的mcu芯片结合,可以实现穿戴式设备的小尺寸,超长待机等特点。
 
二 源码解析
 
笔者用的是该mcu芯片的I2C接口和该传感器做通信接口,具体初始化代码如下:
uint32_t app_mpu6050_init(void)
{
    int ret = 0;

    //reset mpu6050
    sensor_write(MPU_PWR_MGMT1_REG,0x80);

    am_util_delay_ms(100);

    //wake up mpu6050
    sensor_write(MPU_PWR_MGMT1_REG,0x00);
    MPU_Set_Gyro_Fsr(3);
    MPU_Set_Accel_Fsr(0);    
    MPU_Set_Rate(50);    

    sensor_write(MPU_INT_EN_REG,0x00); // close all irq
    sensor_write(MPU_USER_CTRL_REG,0x00); // i2c master closed
    sensor_write(MPU_FIFO_EN_REG,0x00); // close fifo mode
    sensor_write(MPU_INTBP_CFG_REG,0x80); //init low en

    uint8_t rx_addr = 0;
    rx_addr = sensor_read(MPU_DEVICE_ID_REG);
    am_util_stdio_printf("i2c rx addr is:0x%x \n\r",rx_addr);
    if(rx_addr == MPU_ADDR)
    {
        sensor_write(MPU_PWR_MGMT1_REG,0x01);
        sensor_write(MPU_PWR_MGMT2_REG,0x00);    //acceleration and gyros
        MPU_Set_Rate(50);                        //设置采样率为50Hz   
    }
    else
    {
        am_util_stdio_printf("app_mpu6050_init failed:0x%x \n",ret);

        return 1;
    }

    am_util_stdio_printf("app_mpu6050_init success:0x%x \n",ret);

    return 0;
}
处理函数:
void app_mpu6050_process(void)
{
    short aacx,aacy,aacz;
    short gyrox,gyroy,gyroz;
    uint32_t i2c_cnt = 0;

    while(1)
    {
        short temp_per = MPU_Get_Temperature();

        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);
        am_util_stdio_printf("get_temp:%d  \n",temp_per);
        am_util_stdio_printf("get_gyroscope is x:%d y:%d z:%d \n",gyrox,gyroy,gyroz);
        am_util_stdio_printf("get_acceleromoeter is x:%d y:%d z:%d \n",aacx,aacy,aacz);

        am_util_delay_ms(1000);
        am_util_stdio_printf("i2c_cnt:%d \n",i2c_cnt++);

    };
}
这里I2C的接口协议属于标准协议,只需要自己完成函数封装即可,这里不做赘述了。
 
三 效果展示:
 
从打印信息来看,数据能完整读取展现出来,如下图所示:

 

 这里接下来就是根据实际的应用,来做不同的算法处理了。


posted on 2022-04-07 15:26  虚生  阅读(363)  评论(0编辑  收藏  举报