4、PSM(省电模式)深度解析:PSM状态机、进入与退出条件、定时器配置(T3412/T3324)、实测功耗数据。

PSM,全称 Power Saving Mode,省电模式。说白了,就是让模组在没数据收发时,进入一种「深度休眠」状态。这时候模组几乎不干活,电流能降到微安级别。

我刚开始接触蜂窝模组低功耗设计时,觉得 PSM 很简单——不就是让模组睡大觉嘛。后来踩了不少坑才发现,PSM 的状态机、定时器配置、退出条件,每一个细节都能决定你的产品能不能达到预期的续航。

这一章,咱们就把 PSM 彻底讲透。

4.1 PSM 状态机:模组的「清醒-浅睡-深睡」三态

PSM 不是一上来就睡死过去。它有三个核心状态,我习惯叫它们:清醒态、轻睡眠态、深睡眠态。

核心概念:PSM 的三个状态对应不同的功耗等级。清醒态(Connected/Idle)功耗最高,轻睡眠态(Light Sleep)次之,深睡眠态(PSM)功耗最低。

PSM 状态机流程图 清醒态 Connected / Idle 轻睡眠态 Light Sleep 深睡眠态 PSM TAU 超时 / 无活动 T3324 超时 TAU / 上行数据 / 寻呼 寻呼 / 数据 说明: 清醒态包含 Connected 和 Idle 两个子状态。Idle 状态下模组仍监听寻呼,功耗约 10-30 mA。PSM 深睡态下电流可降至 3-5 μA。

你想想看,模组从清醒态进入轻睡眠态,再进入深睡眠态,每一步都有严格的触发条件。我见过不少工程师直接把模组丢进 PSM,结果网络侧找不到设备,导致业务中断。

4.2 进入与退出条件:什么时候睡,什么时候醒

4.2.1 进入 PSM 的条件

模组要进入 PSM,必须满足两个条件:

  1. 网络侧允许:核心网在 Attach 或 TAU 过程中,通过 EPS network feature support 信元告知模组是否支持 PSM。
  2. 模组主动请求:模组在 Attach Request 或 TAU Request 中携带 T3324 定时器值,告诉网络「我想睡多久」。

避坑指南:我曾经在一个 NB-IoT 项目中,模组死活进不了 PSM。抓日志发现,网络侧返回的 EPS network feature support 里 PSM 位是 0。换了个运营商 SIM 卡就好了。所以,不是所有网络都支持 PSM,测试前先确认。

4.2.2 退出 PSM 的条件

模组一旦进入 PSM,就像关机了一样——不监听寻呼,不响应网络。只有以下事件能把它唤醒:

  • T3412(TAU 周期)超时:模组必须定期向网络报告位置,这是硬性要求。
  • 上行数据需要发送:应用层有数据要发,模组自动醒来。
  • 本地事件触发:比如 GPIO 中断、定时器溢出、RTC 闹钟。

嗯,这里要注意:网络侧无法主动唤醒 PSM 中的模组。你想给设备发一条指令,它必须等到下一个 TAU 周期或者自己主动发数据时才能收到。这就是为什么 PSM 适合「上行为主」的业务。

4.3 定时器配置:T3412 和 T3324 的博弈

PSM 的核心是两个定时器:T3412 和 T3324。我习惯把它们比作「闹钟」和「贪睡按钮」。

定时器 名称 作用 取值范围 典型值
T3412 TAU 周期定时器 模组最长能睡多久,到期必须醒来做 TAU 0 ~ 35712 秒(约 10 小时) 3600 秒(1 小时)
T3324 Active Time 定时器 模组进入 PSM 前,在 Idle 状态等待的时间 0 ~ 186 秒(3 分钟) 20 秒

配置这两个定时器,说白了就是一场博弈:

  • T3412 越大:模组睡得更久,功耗更低,但网络侧失联时间更长。
  • T3324 越小:模组更快进入 PSM,但留给网络下行的窗口变短。

警告:不要把 T3412 设得太大。我曾经在一个项目中把 TAU 周期设为 6 小时,结果网络侧认为模组失联,直接 Detach 了设备。恢复连接需要重新 Attach,反而更耗电。建议 T3412 不超过 2 小时。

4.3.1 代码示例:AT 指令配置 PSM

以移远 BC95 模组为例,配置 PSM 的 AT 指令如下:

// 查询当前 PSM 配置
AT+CPSMS?

// 设置 PSM:启用,T3324=20秒,T3412=3600秒
// 格式:AT+CPSMS=<mode>,<Requested_Periodic_TAU>,<Requested_Active_Time>
// <mode>: 0=禁用, 1=启用
// <Requested_Periodic_TAU>: T3412, 编码格式见 3GPP 24.008
// <Requested_Active_Time>: T3324, 编码格式见 3GPP 24.008

AT+CPSMS=1,"10100001","00100001"

// 解释:
// "10100001" = T3412 = 3600 秒(1 小时)
// "00100001" = T3324 = 20 秒

// 保存配置
AT+CSVM

// 重启生效
AT+NRB

嗯,编码格式有点绕。我一般直接用模组厂商提供的计算工具,或者查 3GPP 24.008 的定时器编码表。手动算容易出错。

4.4 实测功耗数据:数字会说话

理论讲完了,咱们看实测数据。我用的是某款主流 NB-IoT 模组,供电 3.8V,环境温度 25°C。

状态 平均电流 持续时间 单次能耗 备注
Connected(发送数据) 120 mA 2 秒 240 mAs 发射功率 23 dBm
Idle(监听寻呼) 15 mA 20 秒(T3324) 300 mAs 每 1.28 秒唤醒一次
PSM(深睡) 4 μA 3578 秒(T3412-20) 14.3 mAs 几乎不耗电
TAU 过程 80 mA 1 秒 80 mAs 每 1 小时一次

看到这组数据,你可能会问:PSM 的电流才 4 μA,那为什么实际产品续航还是不够?

原因在于:PSM 省下的电,往往被 Idle 状态吃掉了。T3324 设得越大,模组在 Idle 状态耗电越多。我算过一笔账:

  • 如果 T3324=20 秒,每天发 10 次数据,PSM 占比 99.5%,日均功耗约 0.8 mAh。
  • 如果 T3324=120 秒,同样频率,日均功耗飙到 3.2 mAh,差了 4 倍。

经验之谈:我个人习惯把 T3324 控制在 10-30 秒。既能给网络留够下行窗口,又不会浪费太多电。如果你的业务完全不需要下行,甚至可以设 T3324=0,模组直接进 PSM。

4.5 避坑指南:PSM 常见问题

做 PSM 设计这几年,我踩过的坑不少。挑几个典型的说说:

  • 坑一:网络不支持 PSM。有些地区的基站没升级,PSM 位始终为 0。解决办法:测试前用 AT+CSQ 看信号,再用 AT+CPSMS? 确认网络返回。
  • 坑二:T3412 和 T3324 编码错误。3GPP 的定时器编码是 8 位二进制,单位是秒或分,很容易算错。我建议用模组厂商的 AT 指令手册里的例子,直接复制粘贴。
  • 坑三:PSM 醒来后网络失联。模组在 PSM 中睡太久,醒来后 TAU 失败。解决办法:缩短 T3412,或者增加重试机制。
  • 坑四:功耗测量不准确。万用表采样率太低,测不出 PSM 的微安级电流。我习惯用精密电阻 + 示波器,或者专门的功耗分析仪。

小技巧:调试 PSM 时,可以用 AT+CPMUTEMP 命令(部分模组支持)查看模组内部温度。如果温度异常升高,说明 PSM 没真正进入,可能是某个外设在漏电。

PSM 是蜂窝模组低功耗设计的基石。理解了状态机、定时器配置和实测数据,你就能根据业务场景灵活调整。记住:没有万能的配置,只有最适合你产品的配置。