关键词:

低功耗设计, 无线通信产品, LoRa长距离, Contiki系统, 能耗实时跟踪

引言:

能耗对电池供电的产品来说是一个重大问题。一旦电能耗尽设备将“罢工”。在《MCU低功耗设计(一)理论》中,我们介绍了节能的原理;在《MCU低功耗设计(二)实践》中,实測了STM8L151C8的低功耗值。

本文介绍无线通信产品的低功耗设计,首先实測MCU与射频芯片I/O设置的功耗,然后測试射频芯片不同模式下功耗,其次使用Contiki系统的energest模块实时跟踪能耗值,最后总结低功耗设计和展望无线组网中低功耗特征。Let’sgo!

一、      无线通信产品简单介绍

iWL881A无线通信模块是“长沙市锐米通信科技有限公司(www.rimelink.com)”的LoRa长距离低功耗产品(例如以下图),它内嵌高效强大的物联网操作系统Contiki,支持星型/树型/MESH网络。与公司的集中器和云server组成“端管云”系统。典型应用场景为:居民抄表(水/电/气)、路灯控制、工厂採集、安全报警等。

该款微功耗无线通信产品应用场景基本由电池供电,因此低功耗设计成了首个“主战场”。

MCU选用了ST公司超低功耗处理器STM8L151C8。射频芯片(RF)使用Semtech公司SX1278,该芯片基于LoRa扩频通信原理,在同等条件下能够取得比FSK调制近4倍的距离。

关于LoRa通信原理。请參考作者的博文《LoRa无线通信设计(一)原理》。

MCU与RF通过SPI总线连接,此外另一些控制引脚,SX1278硬件原理图例如以下:RF通过DIO0~5引脚给MCU发通知信号,NSS / SCK/ MISO / MOSI是SPI总线,NRRST是MCU复位RF的引脚。

二、      静态低功耗

1.   MCU引脚配置

真正做产品的低功耗,第一件事情是正确配置I/O引脚,单个I/O口的耗能达到mA级。换句话说,假设不小心漏掉或错配置一个I/O引脚。那么它将无情地“吞噬”你苦心经营MCU低功耗模式而得到的成绩。

MCU的I/O引脚大致分成4类:未连接、接3.3V、IC输入MCU输出、IC输出MCU输入。接下来,我们进行一系列实验。看看这4类引脚该怎样配置。

:接3.3V的I/O口。须要设置成Output,
high level个上接3.3V的I/O引脚实验结果例如以下:

push-pull: 0.4 uA

open-drain:29.3 uA

结论:对于接3.3V的I/O,节能模式下须要设置成 Output, push-pull, highlevel。

 

种模式,各能耗数据例如以下:

Input, floating:                         536 uA

Input, pull-up:                          0.4 uA

Output, open-drain, low level:            0.4 uA

Output, open-drain, high-impedance level: 530 uA

Output, push-pull, low level:              0.4 uA

Output, push-pull, high level:             0.4 uA

结论:悬空I/O引脚能够设置为:(1)Input, pull-up; (2)Output, push-pull, high(low) level。

 

种模式,能耗例如以下:

Input, floating:                          489 uA

Input, pull-up:                          482 uA

Output, open-drain, low level:            660 uA

Output, open-drain, high-impedance level: 494 uA

Output, push-pull, low level:              661 uA

Output, push-pull, high level:             574 uA

结论: 外部IC为输入的引脚,节能模式下须要设置成:Input, pull-up。

 

种模式,能耗例如以下:

Input, floating:                         430 uA

Input, pull-up:                          574 uA

结论: 外部IC为输出的引脚。节能模式下须要设置成:Input, floating。

 

 

MCU引脚配置基本原则总结例如以下:

图例

特性

节能配置模式

 

IC输出。MCU输入:输入,浮动

Input floating, no external interrupt

 

IC输入,MCU输出:输入,上拉

Input pull-up, no external interrupt

 

3.3V引脚:输出,上拉,高电平

Output push-pull, high level, 2MHz

 

未接引脚:输出,上拉。低电平

Output push-pull, low level。2MHz

 

实际开发中。我们能够先用Excel表列举出MCU引脚的配置需求,针对上述4种类型。借鉴“地铁线路”颜色(英国人的发明)标识。如:

No.

I/O

名称

低功耗配置

作用

14

PE0

LORA_RXTX

Input floating, no external interrupt

RF输出:指示RF当前是接收或发送状态

15

PE1

NC

Output push-pull, low level, 2MHz

 

16

PE2

LORA_RXE

Input pull-up, no external interrupt

RF接收:RXE=1。TXE=0

17

PE3

UART2_RX

Output push-pull, low level, 2MHz

没有使用

18

PE4

UART2_TX

Output push-pull, low level, 2MHz

19

PE5

NC

Output push-pull, low level, 2MHz

 

20

PD0

LED1

Output push-pull, high level, 2MHz

外接3.3V。设置push-pull高电平节能

2.   RF工作模式

对于无线通信产品,贪婪地“吞噬”电能是射频模块(RF)。我们先看看SX1278官方宣称的能耗值:

序号

1

2

3

4

模式

Sleep

Standby

Receive

Transmit

20dBm

17dBm

13dBm

7dBm

能耗

0.2 uA

1.6 mA

12 mA

120 mA

87 mA

29 mA

20 mA

实际产品中,MCU+RF的整机功耗例如以下呢?我们继续看实验数据:

:MCU配置全部I/O引脚为低功耗模式,通过SPI总线设置RF进入Sleep模式,MCU关闭SPI时钟和恢复SPI总线引脚到低功耗模式,进入Halt。

结果:整机功耗=0.6 uA。

在《MCU低功耗设计(二)实践》中,我们知道MCU进入Halt模式,功耗为0.4 uA;再加上RF在Sleep模式下的0.2 uA。一共0.6 uA。

:MCU配置全部I/O引脚为低功耗模式,通过SPI总线设置RF进入Standby模式,MCU关闭SPI时钟和恢复SPI总线引脚到低功耗模式,进入Halt。

结果:整机功耗=1.493 mA。

这个1.493 mA的功耗。就是RF在Standby模式下的功耗。由于此时MCU功耗仅0.4 uA。差点儿能够忽略了。

:MCU配置全部I/O引脚为低功耗模式,通过SPI总线设置RF进入Receive模式(该模式能够长久保持),MCU关闭SPI时钟和恢复SPI总线引脚到低功耗模式,进入Halt。

结果:整机功耗=15.97 mA。

当RF处于Receive侦听模式下功耗大到近16 mA,这个数据远大于MCU全速执行的功耗(约5 mA)。

:MCU配置全部I/O引脚为低功耗模式,通过SPI总线设置RF进入Transmit模式,MCU运行WFI(Waitfor
Interrupt)指令节能。当发送结束后MCU唤醒,循环发送数据帧。分别測试发送功率为:+20dBm on PA_BOOST和+7dBm
on RFO_LF下的功耗值:

结果:+20dBm on PA_BOOST=123mA, +7dBm on RFO_LF =11mA

发射功率大的惊人吧,尤其是开启功放和调整到最大功率+20dBm时,电流达到123 mA。

三、      动态低功耗

法国SigFox和俄罗斯的一些公司常常标称抄表无线产品用2节普通AA电池能够工作10年。開始听到认为人家要么吹牛,要么技术太高了让国人自惭形秽。

人家是怎样实现的呢?我们一起来看看。

从上面的实验得知,当无线产品处于Sleep模式下功耗仅0.6uA。Receive模式下功耗16mA,TX模式下功耗100mA(超长距离)。不论什么一种无线通信节能技术的核心是尽可能地Sleep,这样将带来极低的整机平均功耗。

看一个实例。在大多数能耗表计的无线抄读要求:大约15分钟发送一次数据帧。约100ms;4秒内能唤醒,即每4秒须要一次5ms的接收侦听。其它时间都处于Sleep休眠。

以15分钟(900秒)为单位。能耗例如以下:

发送:100ms * 100mA= 10mA.s

接收:(900 / 4) *5ms * 16mA = 18mA.s

休眠:898s * 0.6uA= 0.54mA.s

平均功耗:(10mA.s +18mA.s + 0.54mA.s) / 900s = 0.0317mA

设2节AA电池总电能为3000mAH,能功耗的时间为:3000mAH / 0.0317mA = 94637H=10.8年。

从上述实例能够看出。要尽可能地延长无线通信产品的寿命须要下面设计原则:

l 尽可能地Sleep,且Sleep下功耗尽可能地低;

l 降低侦听的时间;

l 提高通信成功率。尽可能地避免冲突重传。

实现上述设计,须要优秀的网络协议栈,特别是RDC(Radio Duty Cycle)层算法要合理。而协议栈和软件执行的基础是操作系统,印证了智能产品设计“三分硬件,七分软件”的规律。

iWL881A选用了功耗强大的物联网操作系统Contiki和Rime无线通信协议栈,产品的动态功耗使用Contiki的energest模块来跟踪。

Contiki系统为方便跟踪节能设计了energest模块。它能跟踪组件执行时间。它的数据结构例如以下图所看到的,energest_total_time记录组件总执行时间,energest_current_time记录组件开启时刻。energest_current_mode记录组件当前是否开启,时间的单位为rtimer_clock_t。

energest数据结构

当一个组件开启时调用ENERGEST_ON()。当该组件关闭时调用ENERGEST_OFF()。这2个动作的时序逻辑例如以下图所看到的。

energest时序逻辑

当用户须要统计组件执行时间,首先调用energest_flush()函数,它将全部组件的执行时间结算到当前时刻;然后调用energest_type_time()函数,取出相应组件的执行时间;最后能够依据组件的功率换算成消耗电能。

iWL881A使用Contiki的energest模块能够实时打印能耗跟踪信息:

CPU=5977ms, RF_TX=179ms,RF_RX=1512ms, IRQ count=30303

CPU=6023ms, RF_TX=181ms,RF_RX=1507ms, IRQ count=30304

CPU=5984ms, RF_TX=180ms,RF_RX=1497ms, IRQ count=30303

上述时间是300秒内的统计值。它说明:CPU大约6000 / 1000 / 300 * 100%=2%占空比,RF的发射大约180 / 1000 / 300 * 100%=0.06%的占空比,RF的接收大约1500 / 1000 / 300 * 100%=0.5%的占空比,中断次数约30300 / 300=101次(測试系统包括100Hz的“心跳”时钟)。

四、      组网低功耗

无线产品在组网的执行中。往往会有冲突重传、睡眠唤醒、路由转发等多种通信模式。这里能耗的跟踪将更具挑战性,请继续关注“长沙市锐米通信科技有限公司”的LoRa组网系列博文。

相关文章:

《MCU低功耗设计(一)理论》

《MCU低功耗设计(二)实践》

欢迎增加“LoRaWAN论坛”http://lora.timeddd.com/forum.php

MCU低功耗设计(三)产品的更多相关文章

  1. (数字IC)低功耗设计入门(一)

    低功耗设计这个专题整理了好久,有一个月了,有图有证据: 然而最近一直有些烦心事.郁闷事,拖延了一下,虽然现在还是有点烦,但是还是先发表了吧.下面我们就来聊聊低功耗设计吧,由于文章比较长,因此我就不一次 ...

  2. (数字IC)低功耗设计入门(一)——低功耗设计目的与功耗的类型

    低功耗设计这个专题整理了好久,有一个月了,有图有证据: 然而最近一直有些烦心事.郁闷事,拖延了一下,虽然现在还是有点烦,但是还是先发表了吧.下面我们就来聊聊低功耗设计吧,由于文章比较长,因此我就不一次 ...

  3. SAP Marketing Cloud功能简述(三) 营销活动内容设计和产品推荐

    Grace的前两篇文章: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Cloud功能简述(二) : Target Grou ...

  4. (数字IC)低功耗设计入门(三)——系统与架构级

    前面讲解了使用EDA工具(主要是power compiler)进行功耗分析的流程,这里我们将介绍在数字IC中进行低功耗设计的方法,同时也结合EDA工具(主要是Design Compiler)如何实现. ...

  5. (数字IC)低功耗设计入门(二)——功耗的分析

    前面学习了进行低功耗的目的个功耗的构成,今天就来分享一下功耗的分析.由于是面向数字IC前端设计的学习,所以这里的功耗分析是基于DC中的power compiler工具:更精确的功耗分析可以采用PT,关 ...

  6. (数字IC)低功耗设计入门(四)——RTL级低功耗设计

    二.RTL级低功耗设计 前面介绍了系统级的低功耗设计,换句话说就是在系统级降低功耗可以考虑的方面.系统级的低功耗设计,主要是由系统级设计.具有丰富经验的人员实现,虽然还轮不到我们设计,我们了解一下还是 ...

  7. (数字IC)低功耗设计入门(五)——RTL级低功耗设计(续)

    二.RTL级低功耗设计(续) 前面一篇博文我记录了操作数隔离等低功耗设计,这里就主要介绍一下使用门控时钟进行低功耗设计. (4)门控时钟 门控时钟在我的第一篇博客中有简单的描述,这里就进行比较详细的描 ...

  8. (数字IC)低功耗设计入门(六)——门级电路低功耗设计优化

    三.门级电路低功耗设计优化 (1)门级电路的功耗优化综述 门级电路的功耗优化(Gate Level Power Optimization,简称GLPO)是从已经映射的门级网表开始,对设计进行功耗的优化 ...

  9. (数字IC)低功耗设计入门(八)——物理级低功耗设计&to be continued?

    前面学习了从系统级到门级的低功耗设计,现在简单地了解了一下物理级设计.由于物理级的低功耗设计与后端有关了,这里就不详细学习了.这里主要是学习了一些基本原则,在物理级,进行低功耗设计的基本原则是:    ...

随机推荐

  1. du 命令计算隐藏文件夹或文件

    du -sh * .[^.]*

  2. 一起看看 scrollHeight,clientHeight,offsetHeight,scrollTop是个啥

    scrollHeight最终数值的组成: var scrollHeight = currentElementContent.height +currentElement.paddingTop+curr ...

  3. extract a page from a multiple pages pdf on Ubuntu OS

    extract a page from a multiple pages pdf 1 extract a page from a multiple pages pdf use pdftk packag ...

  4. photon Unity RPC 调用流程

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:car ...

  5. WeChat-小程序-tabbar

    WeChat-小程序-tabbar https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#%E5%85%A8%E ...

  6. 【16】AngularJS API

    AngularJS API API 意为 Application Programming Interface(应用程序编程接口). AngularJS 全局 API AngularJS 全局 API ...

  7. CodeForcesGym 100753B Bounty Hunter II

    Bounty Hunter II Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  8. BNUOJ 26224 Covered Walkway

    Covered Walkway Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on HDU. Origi ...

  9. TensorFlow Ops

    TensorFlow Ops 1. Fun with TensorBoard In TensorFlow, you collectively call constants, variables, op ...

  10. POJ 1026 置换群的k次幂问题

    题目大意: 给定了一组对应关系,经过k次幂后,得到新的对应关系b[i],然后将给定的字符串上的第i位字符放置到b[i]的位置上, 如果字符串长度不足n就用空格补足,这里的是空格,也就是str[i] = ...