[藍點無限] UWB 定位數據融合 之 MPU9250 Wake-on-Motion 模式
接上一篇http://www.rzrgm.cn/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 中斷配置
在http://www.rzrgm.cn/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);
寄存器說明:

博客討論一些室內定位(DWM1000/CC2431/CC2530) 以及一些隨性的技術。博文可以轉載,但需要注明出處!

浙公網安備 33010602011771號