MPU9250 卡在使用 WOM 的 ESP8266 的复位循环中

Posted

技术标签:

【中文标题】MPU9250 卡在使用 WOM 的 ESP8266 的复位循环中【英文标题】:MPU9250 getting stuck in reset loop with ESP8266 using WOM 【发布时间】:2018-06-28 05:55:09 【问题描述】:

我一直在试验 ESP8266 wifi 芯片和 MPU9250 IMU 的睡眠选项。 ESP 有一个深度睡眠命令,除了实时时钟之外,它基本上会关闭芯片,直到 RESET 引脚被 ESP 的 GPIO16 或外部中断拉低。

MPU9250 以其 WOM(运动唤醒)功能的形式提供此中断,该功能使芯片达到最低限度的功能,直到它检测到内置加速度计上的运动,此时其 INT 引脚被拉高(我将此引脚连接到 ESP 的 RESET 引脚和 GND 之间的 NMOS 晶体管的栅极以反转中断)。

但是,当我设置并使用以下代码时,设置会进入重置循环;两个打印语句都会执行,但我不确定 ESP 是否真的有时间执行 DeepSleep 命令,因为它会在“到达这里”打印后立即重置并且不等待动作。

但是,如果我在程序运行时从 NMOS 断开并重新连接 INT 连接,它会暂时工作并休眠,直到它检测到运动,此时复位循环再次开始(即使 MPU9250 在之后完全保持静止)移动)。这意味着 WOM 功能正在工作,但是某些原因导致 INT 引脚在不应该的情况下 ping 为高电平,我无法弄清楚问题出在哪里。有谁知道是什么问题?我可以单独使用代码来解决吗?

主代码(loop()为空):

#include <quaternionFilters.h>
#include <MPU9250.h>
#include <ESP8266WiFi.h>

extern "C" 
  #include "gpio.h"


extern "C" 
  #include "user_interface.h"


MPU9250 myIMU;

void setup()

    Wire.begin(5, 14);
    Serial.begin(74880);
    printf("WAKE ME UP INSIDE");
    delay(500);
    sensorMpu9250WomEnable();
    printf("Got Here");
    ESP.deepSleep(0, WAKE_RF_DEFAULT);


在单独的文件中:

bool sensorMpu9250WomEnable(void)

  uint8_t val;
  // Clear registers
  val = 0x80;
  myIMU.writeByte(MPU9250_ADDRESS, PWR_MGMT_1, val);
  delay(10);

  // Enable accelerometer, disable gyro
  val = 0x07;
  myIMU.writeByte(MPU9250_ADDRESS, PWR_MGMT_2, val);
  delay(10);

  // Set Accel LPF setting to 184 Hz Bandwidth
  val = 0x01;
  myIMU.writeByte(MPU9250_ADDRESS, ACCEL_CONFIG2, val);
  delay(10);

  // Enable Motion Interrupt
  val = 0x40;
  myIMU.writeByte(MPU9250_ADDRESS, INT_ENABLE, val);
  delay(10);

  // Enable Accel Hardware Intelligence
  val = 0xC0;
  myIMU.writeByte(MPU9250_ADDRESS, MOT_DETECT_CTRL, val);
  delay(10);

  // Set Motion Threshold
  val = 0x40;
  myIMU.writeByte(MPU9250_ADDRESS, WOM_THR, val);
  delay(10);

  // Set Frequency of Wake-up
  val = 6;
  myIMU.writeByte(MPU9250_ADDRESS, LP_ACCEL_ODR, val);
  delay(10);


  // Enable Cycle Mode (Accel Low Power Mode)
  val = 0x20;
  myIMU.writeByte(MPU9250_ADDRESS, PWR_MGMT_1, val);
  delay(10);

  return true;

【问题讨论】:

运动阈值约240mg左右,唤醒频率约15Hz 唤醒只是加速度计检查它是否需要 ping INT 引脚,而不是真正触发 ESP 唤醒 您是否发现在深度睡眠时将引脚拉至高电平的原因是什么? @Gero 这是很久以前的事了????不过,如果我记得的话,唤醒引脚在重置 esp 之前没有时间拉高,所以这是某种硬件问题。然后我可能会将 WOM 引脚配置更改为高电平有效并添加晶体管或 FET 或类似的东西。 我可能完全错了,或者把它和我记忆中的另一个旧项目混在一起 【参考方案1】:

非常感谢这个 sn-ps,他们帮助我启动并运行了我的项目。

我可以通过在开始深度睡眠之前添加延迟来解决此问题:

Wire.begin(I2C_SDA, I2C_SCL);
Serial.begin(115200);
Serial.println("WAKE ME UP INSIDE");
delay(500);
sensorMpu9250WomEnable();
Serial.println("Got Here");

Serial.flush();
delay(1000);
esp_sleep_enable_ext0_wakeup(GPIO_NUM_27, 1);
esp_deep_sleep_start();

希望对你也有帮助。

【讨论】:

以上是关于MPU9250 卡在使用 WOM 的 ESP8266 的复位循环中的主要内容,如果未能解决你的问题,请参考以下文章

龙邱MPU9250传感器 | 使用ESP32 模块进行测试

项目ES32获取mpu9250数据网页交互显示 (程序1) esp32获取mpu9250数据

项目ES32获取mpu9250数据网页交互显示

mpu9250陀螺仪折腾小记

MPU9250简单快速更改MPL驱动,方便使用MPL和DMP

[Motion]MPU9250的详细功能