收藏官网首页
查看: 34487|回复: 2

[技术分享] ESP8266 可配置的睡眠模式

50

主题

94

帖子

2135

积分

金牌会员

Rank: 6Rank: 6

积分
2135
跳转到指定楼层
楼主
发表于 2017-4-26 12:28:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块
本帖最后由 true 于 2017-4-26 12:34 编辑

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

三种模式的区别如下:

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 模式:

  1. 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 模式:

  1. wifi_set_sleep_type(LIGHT_SLEEP_T)
复制代码


在 Wi-Fi 连接后,并且 CPU 处于空闲状态时,会自动进入 Light-sleep 状态

3.3 唤醒
在 Light-sleep 模式下,CPU 在暂停状态下不会响应来自**硬件接口的信号与中断,因此需要配置通过外部 GPIO 信号将 ESP8266 唤醒,唤醒过程小于 3 ms

通过 GPIO 唤醒只能配置为电平触发模式,接口如下:

  1. void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state);

  2. * uint32 i                   唤醒功能的 IO 序号
  3. * 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:

  1. void system_deep_sleep(uint32 time_in_us)
复制代码

uint32 time_in_us =0 不会定时唤醒,即不会主动醒来
uint32 time_in_us ≠0 会在设定的时间后,⾃自动唤醒(单位μs)

可以通过以下接口配置 Deep-sleep 唤醒时的软件工作流程,从而影响长期运行的平均功耗:

  1. bool system_deep_sleep_set_option(uint8 option)

  2. deep_sleep_set_option(0) 由 init 参数的第 108 字节控制 Deep-sleep 醒来后的是否作 RF 校准
  3. deep_sleep_set_option(1) 表示下一次 Deep-sleep 醒来后要作 RF 校准,功耗较大
  4. deep_sleep_set_option(2) 表示下一次 Deep-sleep 醒来后不作 RF 校准,功耗较小
  5. 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 模式下仍然可以保存数据),然后一次发送出去

4

主题

18

帖子

515

积分

高级会员

Rank: 4

积分
515
沙发
发表于 2017-7-21 11:07:54 | 只看该作者
GAgent 没有这些模式

4

主题

18

帖子

515

积分

高级会员

Rank: 4

积分
515
板凳
发表于 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的方式更好的接受数据。
三、最后总结
这边关于低功耗的一些事情基本说的差不多了,里面应该还存在一些我没有发现的问题,还有说错的地方望大神们提点提点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表