true 发表于 2017-4-26 12:28:58

ESP8266 可配置的睡眠模式

本帖最后由 true 于 2017-4-26 12:34 编辑

1 概述ESP8266 系列芯片提供以下三种可配置的睡眠模式,您可以根据应用按需选用:
[*]Modem-sleep
[*]Light-sleep
[*]Deep-sleep

三种模式的区别如下:http://wiki.jackslab.org/images/Esp8266-sleep.jpg
2 Modem Sleep2.1 特性目前 ESP8266 的 Modem-sleep 仅工作在 Station 模式下,连接路由器后生效。ESP8266 通过 Wi-Fi 的 DTIM Beacon 机制与路由器保持连接 (一般路由器的 DTIM Beacon 间隔为 100 ms ~ 1000 ms)
在 Modem-sleep 模式下,ESP8266 会在两次 DTIM Beacon 间隔时间内,关闭 Wi-Fi 模块电路,达到省电效果,在下次 Beacon 到来前自动唤醒。睡眠时间由路由器的 DTIM Beacon 时间决定。睡眠同时可以保持与路由器的 Wi-Fi 连接,并通过路由器接受来自手机或者服务器的交互信息。
2.2 接口SDK API,通过以下接口进入 Modem-sleep 模式:
wifi_set_sleep_type(MODEM_SLEEP_T)
注意:在 Modem-sleep 模式下,系统可以自动被唤醒,无需配置接口
2.3 应用Modem-sleep 一般用于必须打开芯片 CPU 的应用场景,例如 PWM 彩灯,需要 CPU 实时控制
3 Light Sleep3.1 特性Light-sleep 的工作模式与 Modem-sleep 相似,不同的是,除了关闭 Wi-Fi 模块电路以外,在 Light-sleep 模式下,还会关闭时钟并暂停内部 CPU,比 Modem-sleep 功耗更低
3.2 接口SDK API,通过以下接口进入 Light-sleep 模式:
wifi_set_sleep_type(LIGHT_SLEEP_T)

在 Wi-Fi 连接后,并且 CPU 处于空闲状态时,会自动进入 Light-sleep 状态
3.3 唤醒在 Light-sleep 模式下,CPU 在暂停状态下不会响应来自**硬件接口的信号与中断,因此需要配置通过外部 GPIO 信号将 ESP8266 唤醒,唤醒过程小于 3 ms
通过 GPIO 唤醒只能配置为电平触发模式,接口如下:
void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state);

* uint32 i                   唤醒功能的 IO 序号
* GPIO_INT_TYPE intr_state   唤醒的触发模式 GPIO_PIN_INTR_LOLEVEL/GPIO_PIN_INTR_HILEVEL

3.4 应用Light-sleep 模式可用于需要保持与路由器的连接,可以实时响应路由器发来的数据的场合。并且在未接收到命令时,CPU 可以处于空闲状态。⽐比如 Wi-Fi 开关的应用,大部分时间 CPU 都是空闲的,直到收到控制命令,CPU 才需要进行 GPIO 的操作
注意:若系统应用中有小于 DTIM Beacon 间隔时间的循环定时,系统将不能进入 Light-sleep 模式
4 Deep Sleep4.1 特性相对于其他两种模式,Deep-sleep 由用户控制,调用接口函数就可立即进入 Deep-sleep 模式在该模式下,芯片会断开所有 Wi-Fi 连接与数据连接,进入睡眠模式,只有 RTC 模块仍然工作,负责芯片的定时唤醒使用 Deep-sleep 必须将 GPIO16 与芯片 EXT_RSTB 管脚连接。
4.2 接口SDK API, 通过以下接口使能 Deep-sleep:
void system_deep_sleep(uint32 time_in_us)
uint32 time_in_us =0 不会定时唤醒,即不会主动醒来uint32 time_in_us ≠0 会在设定的时间后,⾃自动唤醒(单位μs)
可以通过以下接口配置 Deep-sleep 唤醒时的软件工作流程,从而影响长期运行的平均功耗:
bool system_deep_sleep_set_option(uint8 option)

deep_sleep_set_option(0) 由 init 参数的第 108 字节控制 Deep-sleep 醒来后的是否作 RF 校准
deep_sleep_set_option(1) 表示下一次 Deep-sleep 醒来后要作 RF 校准,功耗较大
deep_sleep_set_option(2) 表示下一次 Deep-sleep 醒来后不作 RF 校准,功耗较小
deep_sleep_set_option(4) 表示下一次 Deep-sleep 醒来后,不打开 RF,和 Modem-sleep 一样,电流最小
说明:init 参数即 esp_init_data_default.bin 内的参数值。比如将第108 字节的数据改为 8,并且调用 deep_sleep_set_option(0),则表示芯片每 8 次 Deep-sleep 唤醒才会进行 RF 校准。详情参考:https://github.com/EspressifSystems/low_power_voltage_measurement/wiki
4.3 唤醒在 Deep-sleep 状态下,可以通过外部 IO 在芯片 EXT_RSTB 管脚上产生一个低电平脉冲,芯片即可被唤醒并启动
注意:如果自动唤醒与外部唤醒须要同时作用,须要在外部电路设计时,使用合适的线逻辑操作电路
4.4 应用Deep-sleep 可以用于低功耗的传感器应用,或者大部分时间都不需要进行数据传输的情况设备可以每隔一段时间从 Deep-sleep 状态醒来测量数据并上传,之后继续进入 Deep-sleep也可以将多个数据存储于RTC memory(RTC memory 在 Deep-sleep 模式下仍然可以保存数据),然后一次发送出去

fishingok 发表于 2017-7-21 11:07:54

GAgent 没有这些模式

fishingok 发表于 2017-7-21 11:08:19


ESP8266有关于低功耗模式(主要是睡眠模式)一些说明
2015年10月30日 ESP8266 暂无评论

第一部分:模块低功耗资料说明


一、睡眠模式的分类:
1.1由最新的SDK说明下面的指令可知道有两条指令:
①:AT GSLP=<TIME>
②:AT SLEEP=<MODE>
1.2可以知道总的有三种睡眠模式。分别是:
①:Deep-Sleep;
②:Light-Sleep;
③:Modem-Sleep;


二、睡眠模式的特性
2.1 Deep-Sleep
顾名思义,深度睡眠,相对于其他两种模式,Deep-sleep 由户控制,用指令AT GSLP=<TIME>就可即进Deep-sleep模式。在该模式下,芯会断开所有Wi-Fi连接与数据连接,进睡眠模式,只有RTC模块仍然作,负责芯的定时(指令里面的TIME(ms))唤醒。使Deep-sleep必须将GPIO16与芯EXT_RSTB管脚连接。
2.2 Light-Sleep
Light-sleep的工作模式与Modem-sleep相似,不同的是,除了关闭Wi-Fi模块电路以外,在Light-sleep模式下,还会关闭时钟并暂停内部CPU,Modem-sleep功耗更低。
2.3 Modem-Sleep
目前ESP8266的Modem-sleep仅作在Station模式下,连接路由器后效。ESP8266通过Wi-Fi的DTIM Beacon机制与路由器保持连接。


三、唤醒机制
3.1 Deep-Sleep
3.1.1 外部唤醒
在Deep-sleep状态下,可以通过外部IO在芯EXT_RSTB管脚上产个低电平脉冲,芯即可被唤醒并启动。
3.1.2 自动唤醒
AT GSLP=<TIME>,到达时间TIME(ms)后自动唤醒。
3.2 Light-Sleep
3.2.1 外部唤醒
在Light-sleep模式下,CPU在暂停状态下不会响应来**硬件接的信号与中断,因此需要配置通过外部GPIO信号将ESP8266唤醒,唤醒过程小于3 ms。
3.2.2 自动唤醒
通过连接的路由器中的DTIM的设置,如在DTIM1的情况下,100ms唤醒一次,唤醒时间3ms。即
DTIMN的唤醒时间为N*100ms
由于我不是搞通讯的,所以在这边卡住了,这边的DTIM是路由器本身的,就是模块是设置不了的。
3.3 Modem-Sleep
3.3.1 自动唤醒
同3.2.2


四、适用环境
4.1 Deep-Sleep
Deep-sleep可以于低功耗的传感器应,或者部分时间都不需要进数据传输的情况。设备可以每隔段时间从Deep-sleep状态醒来测量数据并上传,之后继续进Deep-sleep。也可以将多个数据存储于RTCmemory(RTC memory在Deep-sleep模式下仍然可以保存数据),然后次发送出去。
简单的理解就是在模块不需要被动接受,是指定一段时间发送一次数据(一段时间上传服务器一串数据),在这一段时间内你可以使用深度睡眠,如果有被动接受数据,这中间的数据有可能会丢掉。
4.2 Light-Sleep
Light-sleep模式可于需要保持与路由器的连接,可以实时响应路由器发来的数据的场合。并且在未接收到命令时,CPU可以处于空闲状态。如Wi-Fi开关的应,部分时间CPU都是空闲的,直到收到控制命令,CPU才需要进GPIO的操作。
4.3 Modem-Sleep
Modem-sleep般于必须打开芯CPU 的应场景,例如PWM彩灯,需要CPU实时控制。


五、功耗大致计算
由上述可以看出,Deep-Sleep功耗最低,但是适用范围相对较小,而Light-Sleep的自动唤醒和Modem-Sleep需要DTIM,这中间的功耗就关系到路由器的设置。




第二部分:模块的睡眠电流实测


一:各个部分电流的检测
1.1 打开通讯通道之后,没有数据接受和发送时的电流:14ma左右1ma跳动;
1.2 打开通讯通道之后,并平凡发送和接受数据的电流:79ma左右1ma跳动;
1.3 打开通讯通道之后,让其进入Light-Sleep睡眠模式的电流:2ma多一点点;
注:通讯为连接路由器,UDP通讯,Light-Sleep睡眠为自动唤醒。


二:分阶段电流检测
1.1 频繁收发数据和一段时间不通讯:电流在14ma和79ma之间跳动
1.2 睡眠之后的电流:14ma和2ma之间跳动;(这边解释为14ma为正常情况下的电流,2ma为睡眠电流,也就是说这边是睡眠,唤醒相互交替,就是自动唤醒,自动进入睡眠)
1.3 睡眠之后,对模块发送一串数据:电流同1.2,数据接受正常(这边的电流还是维持在14ma的原因应该是Light-Sleep自动唤醒下,在唤醒之后会接受AP中的Beacon包,将包发送给MCU接受,之后又进入睡眠)
1.4 睡眠之后,对模块一直发送数据:电流先在2ma和14ma之间跳动,过一段时间之后在14ma-79ma之间跳动;(前一段时间的2ma-14ma之间跳动同1.3的Beacon包形式发送,之后数据一直存在,就跳回正常的14ma-79ma,不再睡眠)
1.5 1.4持续发送数据之后停止数据发送:电流从14-79ma跳回14ma一会之后跳回到正常睡眠情况2ma-14ma来回跳动。
这是现在的测试情况,后续出MCU的睡眠和8266的睡眠配合调试。




第三部分:模块和MCU相互睡眠及唤醒测试


一、电流问题
进过这次测试,模块用Light-Sleep模式睡眠,MCU用Stop模式。
1、正常情况下(两个都不睡眠)电流109ma。(都不睡眠,且模块没有数据)
2、正常情况下(两个都不睡眠)电流168ma。(都不睡眠,且模块有数据)
3、模块先睡眠:93ma。
4、MCU最后睡眠:63ma。
5、手机APP向模块发数据使两个都唤醒(模块的唤醒为上一次前面楼层所说,MCU通过串口接受脚的数据,连接到外部中断进行唤醒):电流回到168ma
6、通讯之后,继续相继进入睡眠模式:63ma
说明:
①:由上面可以看出,在模块睡眠之后,电流差上一次只测试模块时睡眠的电流差不多,为正常。
②:MCU睡眠后降低了30ma(我这边只是调用了函数进行睡眠,并没有关闭无用外设,我试过在关闭所有外设的情况下,我的产品样板可降低75ma)。
③:由5和6可以看出在能正常唤醒,并在我APP上能正常收到数据。


二、数据问题
在这次的测试中,发现数据并没有掉帧的现象
这边又分成2中情况:
1、首先正常情况
正常情况,按照理论上来说这边确实是会掉帧,这边就需要查看各个MCU唤醒所需的时长和自己MCU和WIFI模块的通讯速率进行计算和判断,我是建议这边最好做掉帧处理,简单的可以直接扔掉,复杂一点就需要全部解码解出来。(这边我用的是115200的传输速率,也就是86.8us一个数据,MCU的唤醒时间还没有查看)
2、我的情况(我的分析,也可能有错,因为我也不太确定)
由于我接受数据是通过串口DMA接受,在MCU停止的模式下,由于我没有关闭外设(DMA还开着),我又是用的串口空闲中断来接受数据的,所以一串数据来的时候,我们的协议最少是60个数据,也就是将近最少5ms的时间来给我MCU系统的唤醒,这样就会好很多,就应该不会出现掉帧,但是掉帧处理还是需要。
3、两者的区别
对于大神和懂的人,看了上面两个应该就已经懂了,但是我还是比较以下1和2的区别,其中1的接受方式在于一个数据一个数据的接受,2的接受方式是数据过来了,我先放到自己设定好的缓存里面去,一串放好了之后,串口空闲了,来个中断提示我有一串数据需要处理。中间存在的是时间问题,1的方式也就是如果你MCU的唤醒需要1ms,那么按照115200的速率来说,你就有可能丢掉12个数据。2的方式是接受到数据之后硬件会自动把数据放入缓存,并不需要你去干预,这边即节省了CPU资源,有能比1的方式更好的接受数据。
三、最后总结
这边关于低功耗的一些事情基本说的差不多了,里面应该还存在一些我没有发现的问题,还有说错的地方望大神们提点提点。
页: [1]
查看完整版本: ESP8266 可配置的睡眠模式