无线传感网

NB-IOT省电模式

作者:陈广
日期:2021-4-24


拿到开发板后就可以开始学习AT指令了,首先从下面链接下载AT指令助手:

http://www.iotxfd.cn/down/NB-IOT/ATHelper.zip

AT指令助手的使用请参考以下文章:

http://article.iotxfd.cn/WSN/AT-ABC

解压后打开ATHelper文件夹,然后双击ATHelper.exe文件启动AT指令助手。选择正确的串口号将电脑连至开发板。按自锁按钮启动开发板后,在AT指令助手中输入第一个命令:AT,单击圆形绿色按钮发送指令(注意:AT指令必须以\r\n结尾,指令助手可以自动添加,如果是其它串口工具需手动自行添加),此时发现无任何响应。请注意,这里是一个坑,我开发板买回来后试了半天才发现,起初还以为开发板出问题了,直到看硬件手册才知道开发板通电后需要给PWR_ON/OFF引脚高电平2秒才能启动开发板。有点坑,真不知道在开发板上没有主控的情况下,如何去给这个引脚2秒的高电平。请按住开发板上的【PWR】键,直到指令助手中出现如下字样后松手:

*ATREADY: 1

+CFUN: 1

+CPIN: READY

此时表明开发板已经启动。再次发送AT指令,如果返回OK,则说明可以正常使用开发板了。

省电模式

在学习AT指令之前,首先需要掌握芯片的睡眠模式,否则在实验过程中会深受困扰。而要理解睡眠模式,首先需要理解NB-IOT的省电模式。NB-IOT与其它通信技术相比,最为重要的特点就是省电,NB-IOT节点往往要求其电池可以使用几年。NB-IoT支持三种省电模式:

  • PSM (Power Saving Mode,省电模式)
  • DRX(Discontinuous Reception,不连续接收模式)
  • eDRX(Extended DRX,扩展不连续接收模式)。

我们从简单到复杂的顺序介绍这三种模式。

DRX

我们在编写串口或Socket程序的时候经常会用到while(1)循环来不停地判断通信端口是否有数据到达,使用这种方法表明需要永不停歇地工作,自然会永不停歇地耗电。那么如果要省电,我们很自然地想到,是不是可以时不时地偷下懒呢?所以DRX模式应运而生,如下图所示:

如上图所示,终端首先判断是否有下行数据(接收数据),然后休息一小段时间,然后再接收数据再休息...。这里所说的休息在M5311给出的资料里叫浅睡眠,定义为:关闭部分外设功能,串口无响应,串口输入AT指令可唤醒浅睡眠。 而一个接收数据+休自己的周期称为DRX周期,这个周期的时间由运营商网络侧设置决定,一般为1.28秒至10.24秒。也就是说,如果核心网有下行数据,最迟10.24秒后可以接收到,有一些延时,但如果对于实时性要求不太高的业务是可以接受的。

需要注意,我们在之后的学习过程中,需要主动发送AT指令,AT指令发送完成后只要几秒钟没有动作,芯片就会进入浅睡眠状态。此时再发送AT指令往往不会有反应,多发一次就可以了。

eDRX

DRX虽然已经很省电了,但省得还不够狠,有规律地拿掉部分接收数据状态(正规的称呼应当为:寻呼监听),拉长浅睡眠时间,于是产生了新模式:eDRX,如下图所示:

此时,终端只有在寻呼时间窗口(Paging Time Window,PTW)内可以接收到数据,功耗相比DRX大为降低,但无法接收到数据的时间从DRX的最长10.24秒变成了eDRX的最长2.92小时。

PSM

eDRX是不是已经足够省电了呢?当然不是,假设电表上安装NB-IOT,每天只上报一次数据,eDRX每天至少也会被唤醒8次,对于这种情况来说是有点浪费了。更重要的是,浅睡眠状态耗电1mA,有点多了,可不可以把能关的都关掉,接近关机,把耗电大幅降低呢?深度睡眠,即PSM就是为此准备的。我们看看M5311中对深度睡眠的定义:PSM 模式,外设断电、AT命令任务终止、UART无响应,触发WAKEUP_IN下降沿可唤醒深度睡眠。 PSM模式如下图所示:

上图中的TAU为Tracking Area Update(跟踪区更新)。PSM和eDRX非常类似,只是PSM在非寻呼监听状态时由浅睡眠状态变为深度睡眠状态,深度睡眠的电流很感人,为0.005mA。为电池使用个8至10年打下了坚实的基础。终端何时进入PSM状态,以及在PSM状态驻留的时长由核心网和终端协商,如果IOT设备支持PSM,在附着或TAU过程中,将向网络表明其能力,从而两者之间协商好定时器值。PSM模式的寻呼监听状态以及睡眠时长由定时器T3324(Active Timer)和T3412(Extended TAU)决定。

  • T3324=空闲态时长,取值范围:2秒至3.1小时
  • T3412=空闲态时长+PSM时长,取值范围:2秒至4800小时(200天)

现在别说一天上传一次信息,大半年发一次信息都没问题。请注意,实际上先有PSM才出现eDRX的。

省电模式的AT指令

PSM参数的查询

AM22E芯片默认使用的是PSM省电模式,下面演示如何使用AT指令查询T3324和T3412定时器的值。

连接开发板,输入AT指令:AT+CPSMS?,结果如下所示。

注意,如果输入指令没有响应,可能处于浅睡眠状态,需再发一次指令。如果还没有响应,说明进入了深睡眠状态,此时需按下开发板上的WAKEUP键唤醒,然后再输入指令。可以先输入ATE0指令关闭AT指令回响。

>>>>>>>>>>  AT+CPSMS?

+CPSMS: 1,,,"00100011","00100010"
OK

响应内容表明了是否启用了PSM模式以及定时器的时长,如下图所示:

定时器时长由八位二进制字串表示,其中高3位表示Timer单位,低5位表示Timer数值。

  1. T3324定时器的高三位含义如下:
Bit8 Bit7 Bit6 含义
0 0 0 指示Timer单位为2秒
0 0 1 指示Timer单位为1分钟
0 1 0 指示Timer单位为1/10小时
1 1 1 指示Timer不使用

所以,我们刚才查询到的T3324定时器值为:00100010,其高3位值为001,表明定时器单位为1分钟;低5位的值为00010,转换为十进制为:2。所以最终T3324定时器时长为 1分钟*2 = 2分钟。

  1. T3412定时器的高三位含义如下:
Bit8 Bit7 Bit6 含义
0 0 0 指示Timer单位为10分钟
0 0 1 指示Timer单位为1小时
0 1 0 指示Timer单位为10小时
0 1 1 指示Timer单位为2秒
1 0 0 指示Timer单位为30秒
1 0 1 指示Timer单位为1分钟
1 1 0 指示Timer单位为320小时
1 1 1 指示Timer不使用

刚才查询到的T3412定时器值为:00100011,其高3位值为001,表明定时器单位为1小时;低5位为00011,转换为十进制为:3。所以最终T3412定时器时长为 1小时*3 = 3小时。

睡眠状态指示

可以通过WAKEUP_OUT引脚和STATE引脚的电平输出观察睡眠模式的动作,这两个引脚我都接了LED灯。但默认情况下,这项功能是关闭的,每次开机都需要输入AT指令才能将其打开。

  1. WAKEUP_OUT引脚用于指示深度睡眠,打开命令为:
AT+CMSYSCTRL=1,1

WAKEUP_OUT引脚电平与深度睡眠对应关系如下:

WAKEUP_OUT 睡眠状态
高电平(LED灯亮) 唤醒状态
低电平(LED灯灭) 深度睡眠
  1. STATE引脚指示浅睡眠状态,打开命令为:
AT+CMSYSCTRL=0,1

STATE引脚电平与浅睡眠状态的对应关系如下:

STATE 睡眠状态
高电平(LED灯亮) 浅睡眠
低电平(LED灯灭) 唤醒睡眠

AT+CMSYSCTRL=0,1后面的两个整数含义为:

  • 第一个整数表示要操作的引脚:
    0:选择操作STATE(Pin21)引脚
    1:选择操作WAKEUP-OUT(Pin16)引脚

  • 第二个整数表示模式,默认值为0:
    0:禁止电平输出
    1:启动睡眠指示功能,允许电平输出
    2:第一个整数为0时才能使用。开启STATE引脚的EPS注册状态输出。

    • 当M5311 EPS未注册时,此引脚默认将循环输出高电平80ms和低电平800毫秒。
    • 当M5311 EPS已经注册,它将默认循环输出高电平80ms和低电平3000ms。
    • 当M5311进入深度睡眠模式,它将关闭,直至被唤醒。

注意,WAKEUP_UP灯亮表示处于唤醒状态,而STATE灯亮表示处于浅睡眠状态,两者正好相反。进入深度睡眠状态后,两盏灯都会灭掉。

现在,可以用肉眼观察AM22E芯片默认的省电状态了。开发板断电后重新上电(注意,必须要重新上电方能观察到以下现象),长按PWR键启动开发板,输入如下命令:

*ATREADY: 1

+CFUN: 1

+CPIN: READY

>>>>>>>>>>  AT
AT
OK

>>>>>>>>>>  ATE0 //关闭回响
ATE0
OK

>>>>>>>>>>  AT+CMSYSCTRL=0,1 //启用浅睡眠指示
OK

>>>>>>>>>>  AT+CMSYSCTRL=1,1 //启用深度睡眠指示
OK

注意,>>>>>>>>>>后面的是用户输入的命令,其它都是返回内容。

可以观察到,命令完成后,WAKEUP_UP(橙色)灯点亮,表示不处于深度睡眠状态。隔一小段时间不发送命令后,STATE(蓝色)灯开始闪烁,表示进入PTW状态,STATE灯亮表示进入IDEL状态,STATE灯灭表示进行寻呼监听状态,此时如输入AT指令,第一次不会有响应(作用为将芯片从浅睡眠状态唤醒),第二次则会有响应。2分钟后两盏灯均灭掉,表示芯片进入深度睡眠状态,这里输入任何命令都不会响应,按下WAKEUP按钮可唤醒深度睡眠,这里再输入命令就有响应了。如果停止输入AT指令,很快芯片又再次进入深度睡眠状态,这次不会再有浅睡眠过度了,再次进入PTW状态需等待3小时以后。

更改PSM定时器时长

为了更好地观察PSM的运行,我们将T3324和T3412定时器的时长大幅缩短,T3324设置为1分钟,T3412设置为3分钟。输入如下命令:

>>>>>>>>>>  AT
OK

>>>>>>>>>>  ATE0
OK

>>>>>>>>>>  AT+CMSYSCTRL=0,1 //浅睡眠指示
OK

>>>>>>>>>>  AT+CMSYSCTRL=1,1 //深度睡眠指示
OK

>>>>>>>>>>  AT+CPSMS=1,,,"10100011","00100001"  //T3324:1分钟;T3412:3分钟
OK

观察指示灯,TAU时间大概在10秒左右。我使用秒表测试定时器时间,基本准确。如果再把时间缩短,则结果将不准确,甚至根本无法进入深度睡眠状态。注意,这个更改是永久性的。我设置T3324:30秒;T3412:2分钟,未重启开发板时测试不准确,但重启后又准确了,大家有兴趣的话可以自行尝试摸索出最短时间。

设置eDRX

AM22E模组默认使用的是PSM模式,PSM的特点是找到设备需要花费很长的时间,如果NB-IOT的使用场景是共享单车,PSM肯定是不合适的,总不能开个锁需要用户等上2分钟吧!这种情况下,需要将省电模式设置为eDRX。eDRX的设置使用如下命令:

其中:

  • <mode>表示终端是否启用eDRX。
    • 0:禁用eDRX
    • 1:启用eDRX
    • 2:启用eDRX,并启用主动请求结果代码
    • 3:禁用eDRX,并清除eDRX的所有参数,或者,如果可以,重载出厂默认值
  • <AcT-type>指示接入技术类型。
    • 0:接入技术不使用eDRX。此参数值仅在主动请求结果代码中使用
    • 5:E-UTRAN(NB-S1模式)
  • <NW-provided_eDRX_value>表示eDRX周期值,用一个4-bit二进制串表示,含义如下:
Bit3 Bit2 Bit1 Bit0 eDRX周期(秒)
0 0 1 0 20.48
0 0 1 1 40.96
0 1 0 1 81.92
1 0 0 1 163.84
1 0 1 0 327.68
1 0 1 1 655.36
1 1 0 0 1310.72
1 1 0 1 2621.44
  • <Paging_time_window>表示寻呼时间窗口的时间,用一个4-bit二进制串表示,含义如下:
Bit3 Bit2 Bit1 Bit0 PTW(秒)
0 0 0 0 2.56
0 0 0 1 5.12
0 0 1 0 7.68
0 0 1 1 10.24
0 1 0 0 12.8
0 1 0 1 15.36
0 1 1 0 17.92
0 1 1 1 20.48
1 0 0 0 23.04
1 0 0 1 25.6
1 0 1 0 28.16
1 0 1 1 30.72
1 1 0 0 33.28
1 1 0 1 35.84
1 1 1 0 38.4
1 1 1 1 40.96

接下来可以设置eDRX模式了,依次输入如下命令:

>>>>>>>>>>  ATE0
ATE0
OK

>>>>>>>>>>  AT+CMSYSCTRL=0,1 //浅睡眠指示
OK

>>>>>>>>>>  AT+CMSYSCTRL=1,1 //深度睡眠指示
OK

>>>>>>>>>>  AT+CPSMS=0,,,"10100011","00100001" //关闭PSM
OK

>>>>>>>>>>  AT*EDRXCFG=1,5,"0010","0011" //启用eDRX,并将eDRX周期设置为2.48秒,PTW设置为10.24秒
OK

指令完成后,观察指示灯,WAKEUP_UP(橙色)灯处于常亮状态,表明不会再进入深度睡眠状态。STATE(蓝色)灯闪烁表明模块处于PTW时间窗口内,常亮则表示不再进行寻呼监听,处于浅睡眠状态。

注意:M5311模块并不支持DRX,但可将PTW时间和eDRX周期设置为相同值,其效果与DRX相同。

睡眠模式

之前为讲解省电模式已经简单介绍了睡眠模式,这里还是要单独拎出来做详细介绍的。

深度睡眠

模组在以下四种情况下,若在条件成立前 10s 内无 AT 命令输入,会进入深度睡眠模式:

  1. 在飞行模式(AT+CFUN=0)下,模组在 10s 后进入深度睡眠;
  2. 在 TCP 断开连接前提下,附着上网络并同步进入 PSM 模式后,模组进入深度睡眠;
  3. 在 TCP 断开连接前提下,若 eDRX 有效周期大于 81.92s,并同步进入 eDRX 模式,模组进入深度睡眠;
  4. 在插入 SIM 卡前提下,模组搜索完全频段,尝试驻网失败(AT+CEREG?返回+CEREG: 0,0)后,进入深度睡眠模式;若不插 SIM 卡,AT+CEREG?返回+CEREG: 0,0 模组不会进入深睡眠模式。

注意:若在模组睡眠前,输入 AT 命令,若此时即使满足睡眠条件,模组仍然会维持 10s 的唤醒状态;若持续输入间隔小于 10s 的 AT 命令,模组在发送 AT 命令期间将持续维持唤醒,直到最后一条 AT 命令输入完成后 10s,模组才能在满足睡眠条件下进入睡眠;若要实现发送完最后一条 AT 命令立即进入深/浅睡眠,可输入 AT*ENTERSLEEP。

进入深度睡眠后 AT 命令不会做应答,且输入 AT 命令无法唤醒模组,深度睡眠可以通过将WAKEUP_IN由高电平拉至低电平方式(按下WAKEUP按钮)唤醒,唤醒模组后,可保持唤醒状态的默认时间长为 10s(可通过 AT*WAKETIME 指令配置唤醒时长),期间发送 AT 有响应:

浅睡眠

模组在以下情况下,若在条件成立前 10s 内无 AT 命令输入,会进入到浅睡眠模式:

  1. 进入空闲态后,模组立即进入浅睡眠模式;
  2. 若保持 TCP 连接,附着上网络并同步进入 PSM 模式后,模组只会进入浅睡眠,而不会进入深睡眠;
  3. 若保持 TCP 连接,若 eDRX 有效周期大于 81.92s,并同步进入 eDRX 模式,模组只会进入浅睡眠,而不会进入深睡眠;
  4. 若不插 SIM 卡,AT+CEREG?返回+CEREG: 0,0,模组只会进入浅睡眠,而不会进入深睡眠;
  5. 若 TCP 连接未关闭情况下,因信号丢失而导致驻网失败,模组会进入浅睡眠,而不会进入深睡眠。

进入浅睡眠以后,可以通过以下方式唤醒,唤醒时间默认为 10s,期间发送 AT 有响应:

  1. 输入”AT”唤醒:输入的首个 AT 只做唤醒中断,而不做响应,第二个 AT 才会响应。CMIOT 规定只可以输入 AT 唤醒浅睡眠,并待第二个 AT 响应返回 OK,方可输入其他 AT 命令进行操作。实际情况是M5311中任何AT指令都可以唤醒模组,而不是只能输入AT
  2. WAKEUP_IN 由高电平拉至低电平,并保持低电平一定时间(按下WAKEUP按钮)。

开关睡眠

关闭睡眠以后,模组将维持在唤醒状态。例如:

AT+SM=LOCK //关闭睡眠,模组维持唤醒状态,输入 AT 命令有响应。
           //仅生效一次,重启或深睡眠唤醒后该设置失效。
OK
AT+SM=LOCK_FOREVER  //永久关闭睡眠,模组维持唤醒状态,输入 AT 命令有响应。
                    //重启模组后该设置依然生效。
OK

在学习阶段,可以考虑永久关闭睡眠,可以省去很多麻烦。

打开睡眠使用如下命令:

AT+SM=UNLOCK //打开睡眠,模组会进入相应的深睡眠或浅睡眠模式。
             //仅生效一次,重启或深睡眠唤醒后该设置失效。
OK
AT+SM=UNLOCK _FOREVER //永久打开睡眠,模组会进入相应的深睡眠或浅睡眠模式。
                      //重启模组后该设置依然生效。
OK

需要注意,永久设置命令输入完成后需按PWR按钮或RESET按钮重启开发板方能永久生效,直接给模组断电将无效,重启后又恢复原样,这个坑折腾了我半天。

关于省电模式的指令,这里并没有讲解完毕,不过这些也够了,要详细了解,请参考M5311的AT指令手册。

;

© 2018 - IOT小分队文章发布系统 v0.3