4G模组PSM+超低功耗详解,该选择那种功耗模式?

ops/2024/10/18 2:47:51/

合宙4G-Cat.1模组支持三种功耗模式:常规模式、低功耗模式、PSM+模式。

很多客户的实际应用场景,是不需要和服务器保持长连接的,一天甚至一周上传一两次数据,就能满足实际的项目需求了。

如果用合宙推荐的第二种低功耗模式,有些大材小用,针对这种情况——可以使用PSM+模式。

用户可以根据不同的应用场景,按需选择不同的合宙4G-Cat.1模组功耗模式,以及三种功耗模式之间的相互转换。

合宙4G-Cat.1模组优异的低功耗表现,既有来自硬件设计的加持,也有软件协议算法的帮助。除实验室数据外,合宙更关注实网环境下的功耗表现,呈现给用户的效果更多以实网在线表现为准。

今天,带大家过过PSM+模式下——LuatOS开发代码。

一、硬件准备

这里大致说下需要准备的硬件条件:

  • Air780E全IO开发板一块:
    测试前需要将开发板上端USB下方的C2处ESD吹掉,要不会有大约20微安的漏电流。

  • 支持数据传输的USB线

  • 一个可调电源:
    可调电源最好是能精确的捕捉到μA电流的电源,本次笔者使用的是合宙自研的Air9000P手持可调电源。

图片

二、下载PSM+超低功耗示例源码

本文示例中用到的代码,可以在这里gitee.com/openLuat/LuatOS-Air780E/tree/master/demo/pm

需要用的代码在“780E_Lowpower”文件夹目录下:

图片

如果您手上是其他模组,如Air780EP或者Air780EPS,则可以查看Air780EP/Air780EPS对应仓库下的pm文件夹

三、PSM+超低功耗示例源码

接下来,我们开始进行PSM+超低功耗示例源码的大致讲解。

 3.1  main.lua

LuatOS中,代码的起始位置是从main.lua第一行开始的,本文使用的是PSM+模式,所以打开第12行的注释,屏蔽第11行的代码。

图片

 3.2  psm_plus.lua

1)设置服务器

进入psm_plus.lua可以看到:

图片

在这里,改成用户自己使用的服务器的IP/域名以及端口号;如果仅作测试,也可以使用合宙提供的测试服务器。

进入后选择打开TCP/UDP,根据用户服务器类型自行选择。

图片

打开后,如下图红框所示位置即是IP和端口号:

图片

local period = 3*60*60*1000 --3小时唤醒一次

这一句是唤醒时间的设置,时间设置唤醒的时间单位为ms。所以如果你有更长时间的唤醒需求,如一天唤醒一次,可以改动最前面的3为24。

特别提醒:
这个TCP服务器仅能当作测试来用,刷新一下网页或者你电脑网络有波动断网一下,就会断开,重新打开TCP端口就会变。

2)获取唤醒原因

图片

上面两句是获取了一下当前唤醒的原因,是正常开机,还是设置的定时器启动,或是串口/AGPIO唤醒。

3)testTask函数

直接拉到psm_plus.lua最后一行;其实上面所有的函数都是基于最后一行的task跑的:

图片

本句的意思是启动一个task,在task里运行第14行的testTask函数,并传入了d1Name这个变量,传入了netCB这个回调函数,以及给testTask传入了server_ip和server_port这两个参数。

接下来,我们看看testTask这个函数的前一小段:

图片

先判断了一下当前唤醒是什么原因唤醒的,并将对应原因赋值给了一个叫做txData的变量,并且判断了下是上电开机还是休眠唤醒。

如果是休眠唤醒,则主动退出飞行模式(因为模组在休眠的时候会进入飞行模式,减小因为可能的网络波动引起的功耗增大等异常)。

下面这一段就是与TCP服务器链接的全过程,如果链接失败会重连3次:

图片

图片

接下来这段配置了uart1的波特率为9600,方便外部串口设备从串口唤醒模组(注:9600状态下唤醒模组比较方便,如果是115200或其他波特率,可能需要发送多次数据才能走串口唤醒模组)。

如果不影响产品功能,需要将所有AGPIO在休眠状态下的高电平输出关闭,可以进一步节省耗电,比如本示例中对GPIO32的操作就是这一原因。

关于AGPIO和GPIO对应编号,如下图所示:

图片

图片

最后这段代码,启动了深度休眠也就是PSM+模式的定时器:

图片

后面的period参数,就是脚本最上面我们设置的定时休眠唤醒时间;后面进入飞行模式,是避免因为基站网络波动导致的异常功耗;然后,才真正进入了PSM+模式。如果进入不成功,15秒后会重启模组。

  • 如果是定时器唤醒,那么服务器会收到"timer wakeup";

  • 如果当前是上电开机去链接服务器,那么服务器会收到"normal wakeup"。

  • 如果是串口唤醒,那么服务器会收到”uart1 wakeup“的数据;

  • 如果是GPIO唤醒,那么服务器会收到"pad wakeup";

在没有数据发送的时候,模组实测待机功耗为下图的3μA:

图片


http://www.ppmy.cn/ops/126367.html

相关文章

12.5 Linux_进程间通信_信号灯

概述 什么是信号灯: 信号灯也称为信号量,代表的是一类资源,其值表示系统中该资源的数量。 主要用途是实现进程、线程的同步。 什么是P/V操作: P操作就是申请资源,V操作就是释放操作。 信号灯的种类: …

了解Android中的事件分发机制

Android中的事件分发机制详解 在Android开发中,事件分发机制是处理用户输入事件(如触摸、点击、滑动等)的核心部分。深入理解这一机制对于开发者来说至关重要,它有助于我们更好地处理用户输入,提升应用的交互体验。以…

从MySQL到OceanBase离线数据迁移的实践

本文作者:玉璁,OceanBase 生态产品技术专家。工作十余年,一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作,致力于为 OceanBase 建设一套完善的生态工具体系。 背景介绍 在互联网与云数据库技…

【Kubernets】容器网络基础二:通讲CNI(Container Network Interface)容器网络接口实现方案

文章目录 背景知识Underlay网络Overlay网络一、基本概念二、工作原理三、实现方案四、应用场景 两者对比示意图 CNI实现有哪些?FlannelFlannel 的工作原理Flannel 的主要组件数据传输机制总结 Calico一、架构基础二、核心组件与功能三、路由与数据包转发四、安全策略…

jvm介绍

JVM,即Java虚拟机(Java Virtual Machine),是运行Java程序的抽象平台。它是一个能够执行Java字节码的虚拟机实例,负责将Java字节码转换为特定平台上的机器码并执行。下面我将从几个方面对JVM进行详细介绍: 1…

串口空闲中断加DMA数据搬运

1 usart.c #include "stm32f10x.h" // Device header #include <stdio.h> #include <stdarg.h>//void Serial_Init(void) //{ // //使能GPIOA 以及串口1的时钟 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_US…

C++ IO多路复用 poll模型

原文链接&#xff1a;C IO多路复用 poll模型 预备知识 poll模型前置需要了解的可以参考: IO控制:fcntl库:IO控制库 多线程:C Linux多线程同步通信-信号量 socket:C Linux多进程Socket通信 select模型:C IO多路复用 select模型 poll模型 特性 原理 poll是对select的改…

C#从零开始学习(Head First C#)

想要开发游戏&#xff0c;C#是unity用的编程语言,所以想系统的巩固和学习一下&#xff0c;在此记录自己的学习笔记&#xff0c;来和大家共同学习&#xff0c;同时也希望能够帮助一些想入门的同学&#xff0c;因此我会使用Head First C#这本书籍,从最开始的章节记录。给自己定个…