我一直在试验ESP8266 wifi芯片和MPU9250 IMU的睡眠选项 . ESP具有深度睡眠命令,基本上将芯片从实时时钟切断,直到RESET引脚被拉低,由ESP GPIO16或外部中断拉低 .
MPU9250以其WOM(运动唤醒)功能的形式提供此中断,这使得芯片具有最小功能,直到它检测到内置加速度计上的运动,此时其INT引脚被拉高(我附上了这个)引脚连接到ESP的RESET引脚和GND之间的NMOS晶体管的栅极,以反转中断) .
但是,当我进行设置并使用以下代码时,设置进入复位循环;两个打印语句都执行,但我不确定ESP是否真的有时间执行DeepSleep命令,因为它会在“Got here”打印后立即重置,并且不会等待运动 .
但是,如果在程序运行时断开并重新连接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;
}