MPU6050 运动终端 运动检测 终端引脚输出

做项目需要用到6050判断运动状态,设备不动的时候,系统部分休眠,运动的时候唤醒,查了网上的资料。
配置的运动中断: MPU_Read_Byte(GYRO_ADDRESS,INT_ENABLE,0x40); //#define MPU_INT_EN_REG 0X38 //中断使能寄存器 只配置了加速度中断
读取 :MPU_Read_Byte(MPU_INT_STA_REG); //#define MPU_INT_STA_REG 0X3A 中断状态寄存器
结果读出来的反应很不灵敏。

——————————————————————————————

后来改成 终端配置:配置的运动中断: MPU_Read_Byte(GYRO_ADDRESS,INT_ENABLE,0x50); //#define MPU_INT_EN_REG 0X38 //中断使能寄存器 置了运动中断和加速度中断
读取:MPU_Read_Byte(MOT_DETECT_STATUS);#define MOT_DETECT_STATUS 0x61 //运动状态寄存器
实测,反应灵敏,终端输出正常。
代码:

#define MPU6050_RA_MOT_THR  0X1F  //加速度中断阈值寄存器
#define MPU6050_RA_MOT_DUR  0X20  //加速中断时间寄存器#define MPU6050_RA_ZRMOT_THR 0X21 //静止中断阈值寄存器
#define MPU6050_RA_ZRMOT_DUR 0X22 //静止中断时间寄存器#define MPU6050_RA_FF_DUR 0X1D //自由落体中断阈值寄存器
#define MPU6050_RA_FF_THR 0X1E //自由落体中断时间寄存器#define MPU_CFG_REG				0X1A	//配置寄存器
#define MPU_ACCEL_CFG_REG		0X1C	//加速度计配置寄存器
#define MPU_INTBP_CFG_REG		0X37	//中断/旁路设置寄存器
#define MPU_INT_EN_REG			0X38	//中断使能寄存器//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR				0X68void Free_Fall_Interrupt(void)          //自由落体中断
{MPU_Write_Byte(MPU6050_RA_FF_THR,0x01);             //自由落体阈值MPU_Write_Byte(MPU6050_RA_FF_DUR,0x01);             //自由落体检测时间20ms 单位1ms 寄存器0X20
}
void Motion_Interrupt(void) //运动中断
{MPU_Write_Byte(MPU6050_RA_MOT_THR, 0x05); //运动阈值 MPU_Write_Byte(MPU6050_RA_MOT_DUR, 0x01); //检测时间20ms 单位1ms 寄存器0X20
}
void Zero_Motion_Interrupt(void)        //静止中断
{MPU_Write_Byte(MPU6050_RA_ZRMOT_THR,0x20);          //静止阈值MPU_Write_Byte(MPU6050_RA_ZRMOT_DUR,0x20);          //静止检测时间20ms 单位1ms 寄存器0X20
}void MPU_INT_Init(void)
{Motion_Interrupt();                      //运动中断MPU_Write_Byte(MPU_CFG_REG, 0x04);       //配置外部引脚采样和DLPF数字低通滤波器MPU_Write_Byte(MPU_ACCEL_CFG_REG, 0x1C); //加速度传感器量程和高通滤波器配置 +-4g 分辨率 8193 LSB/gMPU_Write_Byte(MPU_INTBP_CFG_REG, 0X30); //INT引脚 中断时高电平,读取运动状态寄存器清中断MPU_Write_Byte(MPU_INT_EN_REG, 0x50);    //中断使能寄存器 使能运动中断和加速度中断 
}#define MOT_DETECT_STATUS     0x61  //运动状态寄存器
//在主循环里面读取运动状态寄存器,会清除中断,INT电平会变低
void main(int)
{	
res = i2c_init(I2C_MASTER_2, 100); //初始化IIC总线if (res != 0){printf("IIC init error:%X\n", res);}printf("IIC init OK:%X\n", res);MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X80); //复位MPU6050osDelay(100);MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X00); //唤醒MPU6050MPU_Set_Gyro_Fsr(3);					 //陀螺仪传感器,±2000dpsMPU_Set_Accel_Fsr(0);					 //加速度传感器,±2gMPU_Set_Rate(50);						 //设置采样率50HzMPU_Write_Byte(MPU_INT_EN_REG, 0X40);	 //开启运动检测中断MPU_Write_Byte(MPU_USER_CTRL_REG, 0X00); //I2C主模式关闭MPU_Write_Byte(MPU_FIFO_EN_REG, 0X00);	 //关闭FIFOMPU_Write_Byte(MPU_INTBP_CFG_REG, 0X80); //INT引脚高电平有效res = MPU_Read_Byte(MPU_DEVICE_ID_REG);//读取MPU6050地址printf("MPU_DEVICE_ID_REG = %x\n", res);if (res == MPU_ADDR) //器件ID正确{MPU_INT_Init();}while(1){res = MPU_Read_Byte(MOT_DETECT_STATUS);cm_printf("MOT_DETECT_STATUS = %d\n", res);delay(1000);}
}

摘出来的用到的寄存器和部分代码,有疑问的小伙伴可以私信我~

——————————————————————————————

中断使能寄存器:INT_ENABLE (这是从网友那里看的,点击进入链接)

寄存器名助记符寄存器地址
中断使能寄存器INT_ENABLEx38
寄存器位功能
bit7自由落体中断使能
bit6加速度中断使能
bit5静止中断使能
bit4运动检测中断使能
bit3FIFO溢出中断使能
bit2无定义
bit1无定义
bit0数据就绪中断使能

MPU6060的手册的寄存器表:
官方手册说明

当时按照网友的寄存器说明就写了,也没啥问题。
@wxan1989 按照官方手册,需要设置成0X40.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部