[藍點無限] 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);

寄存器說明:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM