
“无线变得容易!” - 启用脉搏计算低功率Lorawan应用程序

该软件是“原样”提供的,并为自支撑和自我维护提供了途径。
该存储库包含旨在帮助加速客户产品开发的示例代码。它未通过生产验证,也没有对安全性最佳实践进行审核。
请注意,尽管该存储库不支持,但Microchip欢迎社区的贡献,以及所有的拉值都将被考虑将其纳入存储库。
在洛拉论坛上与社区中的同伴互动。
基于从ASFV3生成的Lorawan应用程序,此示例代码演示了如何在设备处于待机模式下启用功率效率的脉冲计数,这对于智能计量中使用的电池供电应用程序有用
主应用程序包括将计数器值传输到洛万网络提供商云通过网关。出于此演示,已使用了具有预先置换的安全元件的TTN和TTI。
克隆/下载当前存储库以获取软件。
必须:购买SAM R34 XPLAINE PRO评估套件

购买WLR089U0 XPLAINE PRO评估套件

必须:购买洛拉(R)网关(例如,来自行业的事物) 
可选:购买atecc608a-tnglora安全元件和加密授权udfn插座套件的样品
下载并安装Microchip Studio 7.0 IDE。
开放Microchip Studio 7.0 IDE。
从工具 - >扩展和更新中,安装高级软件框架(ASFV3)v3.49.1发布或上限发布。
重新启动Microchip Studio
下载并安装诸如TERA术语之类的串行终端程序。
要提取SAM R34电流消耗,董事会需要配置如下所述:

如果您使用的是TTI服务器和ATECC608A-TNGLORA安全元素,请参阅此存储库的设置。
WLR089 Xplained Pro需要使用硬件修改才能使用应用程序代码。默认情况下,电感器L301(10UH)和电容器C316(100NF)未安装在WLR089 XPLAINE PRO上。两者都需要安装以使用演示应用程序,然后在活动模式下选择“降压转换器”作为主电压调节器。
查看WLR089 XPLAINE PRO文档以获取更多详细信息。



SAMR34/R35设备具有准确的低功率外部和内部振荡器。可以独立地配置不同的时钟域以不同的频率运行,从而通过以最佳时钟频率运行每个外围,从而避免功率,从而保持较高的CPU频率,同时降低功耗。
SAM R34/R35设备具有四种可选择的软件睡眠模式:空闲,待机,备份和OFF。
在空闲模式下,CPU停止,而所有其他功能都可以保持运行。
在待机模式下,除了选择继续运行的那些时,所有时钟和功能都将停止。在此模式下,保留所有RAM和逻辑内容。该设备支持梦游,这允许一些外围设备根据预定义的条件从睡眠中醒来,从而使某些内部操作只有在需要时只有在需要时醒来;例如,当越过阈值或准备就绪时。事件系统支持同步和异步事件,允许外围设备接收,反应和发送事件,甚至在待机模式下。
在备份模式下,大多数逻辑和模拟单元格被关闭。只有很少的功能可用(RTC,备份寄存器,外部引脚唤醒)。
不建议使用OFF模式,因为对内部SPI总线的高阻抗会导致亚稳定性。
SAM R34/R35设备具有两个可选择的软件性能水平(PL0和PL2),使用户可以扩展支持工作频率的最低核心电压水平。为了进一步最大程度地减少当前消耗,特别是泄漏耗散的漏气,设备利用具有保留的功率域门控技术来关闭某些逻辑领域,同时保持其逻辑状态。该技术在硬件中完全处理。
Microchip Lorawan堆栈(MLS)在堆栈中提供了电源管理模块(PMM)。在MLS之上运行的应用程序可以选择使用PMM在空闲时间中节省电源。除了在空闲期间节省电力外,PMM即使在交易期间也试图减少功耗。通过将MCU切换到可用的低功率模式之一来完成动力。当前,PMM仅在SAM R34 MCU上支持,并且可以在备用或备份睡眠模式下配置。
待机模式:
备份模式:
PMM通过宏CONF_PMM_ENABLE启用。该宏控制应用程序和堆栈中PMM的添加和去除。在应用程序代码中启用PMM功能后,将汇编和执行以下部分的所有代码部分:
#ifdef CONF_PMM_ENABLE
..
#endif
当前应用程序( lorawan_app.c文件)已经实现了使用PMM功能所需的所有代码。并提供以下详细信息以获取信息。
要在应用程序中使用PMM,需要包括以下标头文件:
#ifdef CONF_PMM_ENABLE
#include "pmm.h"
#include "conf_pmm.h"
#include "sleep_timer.h"
#include "sleep.h"
#endif
默认情况下,应用程序睡眠时间将配置30秒,可以更改为所需的值。应用程序睡眠请求时间由宏配置:
#define DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS 30000 // Sleep duration in ms
但是睡眠持续时间必须属于可接受的范围,这是下表中的吉文。

必须初始化睡眠计时器模块以启用RTC模块:
#ifdef CONF_PMM_ENABLE
SleepTimerInit() ;
#endif
文件rtc_count.h包含RTC模块的可用时钟源。
#ifdef FEATURE_RTC_CLOCK_SELECTION
/**
* brief Available clock source for RTC.
* RTC clock source.
*/
enum rtc_clock_sel {
/** 1.024KHz from 32KHz internal ULP oscillator */
RTC_CLOCK_SELECTION_ULP1K = OSC32KCTRL_RTCCTRL_RTCSEL_ULP1K_Val,
/** 32.768KHz from 32KHz internal ULP oscillator */
RTC_CLOCK_SELECTION_ULP32K = OSC32KCTRL_RTCCTRL_RTCSEL_ULP32K_Val,
#if !(SAML22)
/** 1.024KHz from 32KHz internal oscillator */
RTC_CLOCK_SELECTION_OSC1K = OSC32KCTRL_RTCCTRL_RTCSEL_OSC1K_Val,
/** 32.768KHz from 32KHz internal oscillator */
RTC_CLOCK_SELECTION_OSC32K = OSC32KCTRL_RTCCTRL_RTCSEL_OSC32K_Val,
#endif
/** 1.024KHz from 32KHz external oscillator */
RTC_CLOCK_SELECTION_XOSC1K = OSC32KCTRL_RTCCTRL_RTCSEL_XOSC1K_Val,
/** 32.768KHz from 32.768KHz external crystal oscillator */
RTC_CLOCK_SELECTION_XOSC32K = OSC32KCTRL_RTCCTRL_RTCSEL_XOSC32K_Val,
};
#endif
对于此应用程序,RTC模块将从外部32kHz时钟进行计时。使用内部32KHz超低功率振荡器作为RTC时钟源,但需要不同的时钟设置。使用XOSC32将导致更好的性能,频率漂移较小,从而更高的稳定性。
在待机模式下,所有时钟源都停止了,除了设置了模块的Runstdby(备用备用)位或将Ondemand位设置为零的时钟源。默认情况下,使用待机睡眠模式时,调节器在低功率模式下运行。在进入待机模式之前,必须确保禁用大量的时钟和外围设备,以免电压调节器过载。为了避免过载,应配置外围设备,以便内部调节器在低功率模式下提供的总功耗应小于50μA。如果需要在待机模式下运行的外围设备消耗超过50UA,则应将调节器配置为以正常模式运行,并且可以通过在SYSCTRL-> VREG中设置Runstdby位来从软件中完成。
该应用程序实现了以下功率优化功能,从而使SAM R34设备的超低功率体系结构的好处。
static void configure_sleep(void)
{
/* Disable BOD33 */
SUPC->BOD33.reg &= ~(SUPC_BOD33_ENABLE);
/* Select BUCK converter as the main voltage regulator in active mode */
SUPC->VREG.bit.SEL = SUPC_VREG_SEL_BUCK_Val;
/* Wait for the regulator switch to be completed */
while(!(SUPC->STATUS.reg & SUPC_STATUS_VREGRDY));
/* Set Voltage Regulator Low power Mode Efficiency */
SUPC->VREG.bit.LPEFF = 0x1;
/* Apply SAM L21 Erratum 15264 */
SUPC->VREG.bit.RUNSTDBY = 0x1;
SUPC->VREG.bit.STDBYPL0 = 0x1;
/* SRAM configuration in standby */
PM->STDBYCFG.reg = PM_STDBYCFG_BBIASHS(1) | PM_STDBYCFG_VREGSMOD_LP ;
}
有关微控制器的低功率体系结构的更多详细信息,请参阅SAM L21家庭产品数据表。 https://www.microchip.com/wwwproducts/en/atsaml21j18b
通常,流传感器以脉冲形式将动能从旋转转换为电数字信号。
在此应用程序中,SAM R34设备在保持待机模式时计算脉冲数。得益于SAM R34设备中可用的事件系统(EVSYS)功能,可以启用外科间通信,从而有助于降低系统的CPU负载和功耗。它允许在不使用CPU带宽的情况下自主控制外围设备,并且可以在待机模式下保持更长的时间。
某些外围设备可以继续以备用模式,源时钟运行的位置运行,而计时器计数器(TC)或计时器计数器的情况是控制应用程序(TCC)的情况。
事件系统由以下两个事件资源组成:
在当前应用程序中,事件系统已配置如下。

该应用程序旨在计算来自脉冲源的脉冲并通过Lorawan RF协议传输。

当按下按钮SW0时,将Extint8模块(物理连接到板上存在的用户按钮)配置为生成事件。 SW0连接到PA28,该PA28可以在Extint上产生中断[8]。
// configure external interrupt for SW0
void configure_extint(void)
{
// configure external interrupt controller
struct extint_chan_conf extint_chan_config ;
extint_chan_config.gpio_pin = CONF_EIC_PIN ;
extint_chan_config.gpio_pin_mux = CONF_EIC_MUX ;
extint_chan_config.gpio_pin_pull = EXTINT_PULL_UP ;
extint_chan_config.detection_criteria = EXTINT_DETECT_RISING ;
extint_chan_config.filter_input_signal = true ;
extint_chan_set_config(CONF_EIC_CHAN, &extint_chan_config) ;
// configure external interrupt module to be an event generator
struct extint_events extint_event_config ;
extint_event_config.generate_event_on_detect[CONF_EIC_CHAN] = true ;
extint_enable_events(&extint_event_config) ;
}
这是通过事件系统通道8将其路由到计时器/计数器TC0。
// configure event system for generators and users
void configure_eventsystem(void)
{
// configure event system
struct events_resource event_res ;
// configure channel
struct events_config config ;
events_get_config_defaults(&config) ;
config.generator = CONF_EVENT_GENERATOR_ID ;
config.edge_detect = EVENTS_EDGE_DETECT_RISING ;
config.path = EVENTS_PATH_ASYNCHRONOUS ;
config.run_in_standby = true ;
events_allocate(&event_res, &config) ;
// configure user
events_attach_user(&event_res, CONF_EVENT_USER_ID) ;
}
TC0配置为从Extint模块生成的事件上增加16位计数器。
// configure_tc
void configure_tc(void)
{
// configure TC module for counting
static struct tc_config tc_counter_config ;
tc_reset(&tc_counter_module) ;
tc_get_config_defaults(&tc_counter_config) ;
tc_counter_config.clock_prescaler = TC_CLOCK_PRESCALER_DIV1 ;
tc_counter_config.count_direction = TC_COUNT_DIRECTION_UP ;
tc_counter_config.counter_size = TC_COUNTER_SIZE_16BIT ;
tc_counter_config.on_demand = true ;
tc_counter_config.run_in_standby = true ;
tc_init(&tc_counter_module, CONF_TC, &tc_counter_config) ;
struct tc_events tc_event = {
.on_event_perform_action = true,
.event_action = TC_EVENT_ACTION_INCREMENT_COUNTER,
.generate_event_on_overflow = false
} ;
tc_enable_events(&tc_counter_module, &tc_event) ;
// enable TC module
tc_enable(&tc_counter_module) ;
}
由于TC具有无数位,因此在备用模式下,它可以改善对TCC模块的功耗。在conf_pulse_counter.h中,可以选择使用TC或TCC作为计数器。两者都可以在待机模式下计数。
#ifndef CONF_PULSE_COUNTER_H
#define CONF_PULSE_COUNTER_H
// Counter selection
#define USE_TC 0
#define USE_TCC 1
#define COUNTER_SELECTED USE_TC
// EXTINT Config
#define CONF_EIC_CHAN BUTTON_0_EIC_LINE // EXTINT8
#define CONF_EIC_PIN BUTTON_0_EIC_PIN
#define CONF_EIC_MUX BUTTON_0_EIC_MUX
// EVSYS Config
#define CONF_EVENT_GENERATOR_ID EVSYS_ID_GEN_EIC_EXTINT_8
#if (COUNTER_SELECTED == USE_TCC)
#define CONF_EVENT_USER_ID EVSYS_ID_USER_TCC1_EV_0
#else
#define CONF_EVENT_USER_ID EVSYS_ID_USER_TC4_EVU // must match with CONF_TC
#endif
// TCC
#define CONF_TCC TCC1
#define CONF_CAPTURE_CHAN_0 0
#define CONF_CAPTURE_CHAN_1 1
// TC
#define CONF_TC TC4 // TC0 is already used in LoRaWAN stack (hw_timer.c, conf_hw_timer.h)
#endif
使用Microchip Studio 7 IDE打开当前项目
在顶部菜单中,转到项目 - >属性
如果安全元素连接到SAM R34 XPLAINE PRO板,请确保定义了Macro CRYPTO_DEV_ENABLED 。选择工具链> ARM/GNU C编译器>符号

从工具设置中,选择您的板作为具有SWD接口的EDBG调试器


在顶部菜单中,打开工具>数据可视化器

在DGI控制面板下,选择SAMR34 XPLAINE PRO,然后单击Connect

准备就绪后,选择“电源”接口,然后单击“启动”以在板上启动电源分析。

数据可视化器应显示SAM R34设备的功耗,并使I/O和外部芯片芯片消耗进行抽象。
开放式TERA术语UART控制台配置为115200 bps,8-data bit/no parity/1-stop bit
按SAM R34 XPLAINE PRO板上的“重置”按钮,以查看打印到控制台的输出
如果定义了Macro CRYPTO_DEV_ENABLED ,并且将安全元素连接到SAM R34 Xplained Pro通过Ext3 Connector:

如果未定义宏CRYPTO_DEV_ENABLED ,则使用lorawan_app.c中的otaa凭据:

当设备成功加入Lorawan网络时,该应用程序将每60秒定期醒来,并通过Lorawan网络传输上行链路消息。该消息将计数器值和温度封装在°C和°F中。

在主动模式下,在每个唤醒中,设备将发出变速箱,然后发出两个接收窗口。

在两个传输之间,备用模式下的功耗约为8UA

在待机模式下,可以在不唤醒CPU的情况下进行脉冲计数。

与SAM R34数据表相比,额外的UA电流是由于RF开关始终在当前的Xplained Pro Board设计中启动的事实。
使用WLR089U0 XPLAINE PRO板,RF开关由应用程序控制,并且随着这种改进,测量的当前消耗要低得多。
结果也可以在Lorawan网络服务器控制台上观察到。

对于A级设备;大部分时间都在睡觉;当设备未执行无线电交易时,考虑到功率的量很重要。使用具有较长睡眠时间参数的PMM是减少唤醒事件数量并减少整体功耗的好习惯。当您想优化设备的整体功耗时,需要考虑的其他因素是
如果启用了占空比(例如使用EU868频段),则占空比计时器正在中断睡眠并发出意外的唤醒。
