接上一篇https://www.cnblogs.com/tuzhuke/p/15196091.html,继续分享MPU9250 一个运动检测功能。
如果没有阅读上篇,建议从上篇开始。
使用MPU9250 通常会读取9轴数据,或者DMP 四元数据,而我们这里使用的是一个运动检测功能, Wake-on-Motion 模式。
这个模式也是MPU9250 自带的一个功能。
大概功能描述:
设定一个加速度变化阈值,当MPU9250 检测到加速度超过这个阈值后,可以发送一个中断信息给主控。
官方文档说明:
UWB定位,尤其给人定位,其实人的行走都不是一个匀速过程,存在微小的加速度,适当调整MPU9250 加速度阈值,即可实现人的运动检测功能。再结合UWB本身完成数据融合。
测试代码实现:
按照MPU9250 流程图,实现Wake-on-Motion ,并拉STM32中断,在中断里点亮LED。
1. Wake-on-Motion 配置函数
void Enable_MPU9250_MovetionDetection(MPU9250_t *MPU9250)
{
//0x6b, 0b00000001
writeByte(&hi2c1, MPU9250->I2C_Addr, PWR_MGMT_1, 0x01);
//0x6c, 0b00000111
writeByte(&hi2c1, MPU9250->I2C_Addr, PWR_MGMT_2, 0x07);
//0x1d, 0b00000101
writeByte(&hi2c1, MPU9250->I2C_Addr, ACCEL_CONFIG_2, 0x05);
//0x37, 0b0011 0000 -- 只有读取值才clear 中断
//writeByte(&hi2c1, MPU9250->I2C_Addr, INT_PIN_CFG, 0x00);
//0x69, 0b11000000
writeByte(&hi2c1, MPU9250->I2C_Addr, MOT_DETECT_CTRL, 0xC0);
//0x1f, 0x7f
writeByte(&hi2c1, MPU9250->I2C_Addr, WOM_THR, 0x01);
//0x38, 0x40
writeByte(&hi2c1, MPU9250->I2C_Addr, INT_ENABLE, 0x40);
//0x1e, 0b00000100
writeByte(&hi2c1, MPU9250->I2C_Addr, LP_ACCEL_ODR, 0x04);
//0x6b, 0b0010 0000
writeByte(&hi2c1, MPU9250->I2C_Addr, PWR_MGMT_1, 0x20);
// writeByte(&hi2c1, MPU9250->I2C_Addr, INT_STATUS, 0xFF);
}
2. STM32 中断配置
在https://www.cnblogs.com/tuzhuke/p/15196091.html
我们提供了MPU9250 和 STM32 的链接图,MPU9250 输出中断链接到STM32 PB15,中断配置代码如下
/*Configure GPIO pin : PB15 */
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
3 中断处理函数
中断处理函数中,实习点亮LED
/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); //PB7 = 1 LED_ON
/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
4 顶层测试函数
初始化MPU9250 后,配置Wake-on-Motion,在while循环中,关闭由中断点亮的LED,从而实现当运动时LED亮,1S内没有运动LED熄灭。
int Mpu9250_Test(void)
{
Sw_I2C_Init();
MPU9250_Init(&mpu9250, MPU9250_Device_0, ACCEL_SCALE_16G, GYRO_SCALE_2000dps, MAG_SCALE_16bit);
Enable_MPU9250_MovetionDetection(&mpu9250);
HAL_Delay(1000);
while (1)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, !GPIO_PIN_SET); //PB7 = 1 LED_ON
HAL_Delay(1000);
}
}
5 关于阈值设定说明
加速度阈值设定如下语句实现,这里设定值为1. 实际测试,当设定为1,人体微动可以检测。设置2-3,摆手可以检测,如果设置为F,用力甩臂可以检测。
writeByte(&hi2c1, MPU9250->I2C_Addr, WOM_THR, 0x01);
寄存器说明: