zoukankan      html  css  js  c++  java
  • [蓝点无限] 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);

    寄存器说明:

    博客讨论一些室内定位(DWM1000/CC2431/CC2530) 以及一些随性的技术。博文可以转载,但需要注明出处!
  • 相关阅读:
    urlEncode
    rsyslog queue队列权威指南
    rsyslog的安装、使用、详解
    长连接及心跳保活原理简介
    python时间日期格式化和反格式化
    无锁编程
    如何快速定位找出SEGV内存错误的程序Bug
    ElasticSearch搜索数据到底有几种方式?
    golang string和[]byte的对比
    PHP中使用Redis长连接笔记
  • 原文地址:https://www.cnblogs.com/tuzhuke/p/15201897.html
Copyright © 2011-2022 走看看