[蓝点无限] UWB 定位数据融合 之 MPU9250 Wake-on-Motion 模式

接上一篇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);

寄存器说明:

posted @ 2021-08-29 09:10  tuzhuke  阅读(542)  评论(0编辑  收藏  举报
document.body.oncopy=function(){ event.returnValue=false; var t=document.selection.createRange().text; l4ever = parent.document.location; var s=”本文来源: Position 闲谈”; var y=”原文地址:” + ” “; clipboardData.setData(’Text’,”+t+’\r\n’+s+’\r\n’+y+”); }