
「ワイヤレスは簡単です!」 - 低電力ロラワンアプリケーションでカウントするパルスを有効にする

ソフトウェアは「現状のまま」と提供され、自己サポートと自己メンテナンスの道を与えます。
このリポジトリには、クライアント製品の開発を加速するのに役立つサポートされていないサンプルコードが含まれています。生産については検証されておらず、セキュリティのベストプラクティスのために監査されません。
このリポジトリはサポートされていませんが、Microchipはコミュニティへの貢献を歓迎し、すべてのプルレクエストがリポジトリに含めることが考慮されることに注意してください。
Lora Forumのコミュニティの仲間と交流します。
ASFV3から生成されたLorawanアプリケーションに基づいて、このサンプルコードは、デバイスがスタンバイモードに配置されている間に電力効率の高いパルスカウントを有効にする方法を示しています。
メインアプリケーションは、ゲートウェイを通してロラワンネットワークプロバイダークラウドにカウンター値を送信することに構成されています。このデモの目的のために、事前に解決された安全な要素を備えたTTNとTTIが使用されています。
現在のリポジトリをクローン/ダウンロードして、ソフトウェアを取得します。
必須:SAM R34 Xplained Pro評価キットを購入します

WLR089U0 Xplained Pro評価キットを購入します

必須:Lora(R)ゲートウェイを購入する
オプション:ATECC608A-TNGLORAセキュアエレメントと暗号化されたUDFNソケットキットの購入サンプル
Microchip Studio 7.0 IDEをダウンロードしてインストールします。
Microchip Studio 7.0 IDEを開きます。
ツールから - >拡張機能と更新、Advanced Software Framework(ASFV3)v3.49.1リリースまたは上位リリースをインストールします。
マイクロチップスタジオを再起動します
Tera Termのようなシリアル端末プログラムをダウンロードしてインストールします。
SAM R34の電流消費を抽出するには、以下で説明するように、ボードを構成する必要があります。

TTIサーバーとATECC608A-TNGLORAセキュア要素を使用している場合は、セットアップについてはこのリポジトリを参照してください。
WLR089 Xplained Proは、アプリケーションコードを使用するためにハードウェアの変更が必要です。デフォルトでは、インダクタL301(10UH)およびコンデンサC316(100NF)は、WLR089 Xplained Proにマウントされていません。デモアプリケーションを使用し、アクティブモードのメイン電圧レギュレータとしてバックコンバーターを選択するために、両方をマウントする必要があります。
詳細については、WLR089 Xplained Proドキュメントをご覧ください。



SAMR34/R35デバイスには、正確な低電力の外部オシレーターと内部発振器があります。異なるクロックドメインを独立して構成するように異なる周波数で実行され、最適なクロック周波数で各周辺機器を実行することで電力節約を可能にするため、電力消費を削減しながら高いCPU周波数を維持できます。
SAM R34/R35デバイスには、アイドル、スタンバイ、バックアップ、オフの4つのソフトウェア選択可能なスリープモードがあります。
アイドルモードでは、CPUが停止し、他のすべての機能が実行され続ける可能性があります。
スタンバイモードでは、実行を続けるために選択されたクロックを除き、すべてのクロックと機能が停止されます。このモードでは、すべてのラムとロジックの内容が保持されます。このデバイスは夢遊病をサポートします。これにより、一部の周辺機器は事前定義された条件に基づいて睡眠から目覚めることができ、DMA転送や/またはCPUなどの内部操作が必要な場合にのみ目覚めることができます。たとえば、しきい値が交差する場合、または結果が準備ができている場合。イベントシステムは、同期イベントと非同期イベントをサポートしているため、周辺機器はスタンバイモードでもイベントを受け取り、反応し、送信できます。
バックアップモードでは、ロジックセルとアナログセルのほとんどは電源が切れています。利用可能な機能はほとんどありません(RTC、バックアップレジスタ、外部ピンからの目覚め)。
内部SPIバスの高インピーダンスにより、メッカ材が収容可能になるため、オフモードはお勧めしません。
SAM R34/R35デバイスには、2つのソフトウェア選択性パフォーマンスレベル(PL0およびPL2)があり、ユーザーが動作周波数をサポートする最低コア電圧レベルをスケーリングできます。現在の消費、特に漏れ散逸をさらに最小限に抑えるために、デバイスは、ロジック状態を維持しながら、いくつかのロジック領域をオフにするために、保持を伴うパワードメインゲーティング技術を利用します。この手法は、ハードウェアで完全に処理されています。
Microchip Lorawan Stack(MLS)は、スタックに電力管理モジュール(PMM)を提供します。 MLSの上で実行されているアプリケーションは、PMMを使用してアイドル時間中に電源を節約することを選択できます。アイドル中に電力を節約することに加えて、PMMはトランザクション中であっても消費電力を削減しようとします。電力保存は、MCUを利用可能な低電力モードの1つに切り替えることで行われます。現在、PMMはSAM R34 MCUでのみサポートされており、スタンバイまたはバックアップスリープモードで構成できます。
スタンバイモード:
バックアップモード:
PMMは、Macro 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クロックからクロックされます。 RTCクロックソースとして内部32KHzウルトラローパワーオシレーターを使用することは可能ですが、異なるクロック設定が必要です。 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)の場合です。
イベントシステムは、次の2つのイベントリソースで構成されています。
現在のアプリケーションでは、イベントシステムは以下のように構成されています。

このアプリケーションは、パルス源から来るパルスをカウントし、ロラワンRFプロトコルを介して送信することを目的としています。

extint8モジュール(ボードに存在するユーザーボタンに物理的に接続)は、ボタンSW0がプッシュされたときにイベントを生成するように構成されています。 SW0は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で現在のプロジェクトを開きます
トップメニューから、Project-> Propertiesに移動します
安全な要素がSAM R34 Xplained Proボードに接続されている場合、Macro CRYPTO_DEV_ENABLEDが定義されていることを確認してください。 [ツールチェーン]> [ARM/GNU Cコンパイラ]> [シンボル]を選択します

ツール設定から、SWDインターフェイスを備えたEDBGデバッガーとしてボードを選択します


トップメニューから、ツールを開く> Data Visualizer

DGIコントロールパネルの下で、samr34 xplained proを選択し、[接続]をクリックします

準備ができたら、「電源」インターフェイスを選択し、[スタート]をクリックしてボードの電源分析を開始します。

Data Visualizerは、SAM R34デバイスの消費電力を表示し、I/Oおよび外部オンボードチップ消費の抽象化を行う必要があります。
115200 bps、8-dataビット/パリティなし/1ストップビットで構成されたオープンテラ用語uartコンソール
SAM R34 Xplained Proボードの「リセット」ボタンを押して、コンソールに出力が印刷されているのを見る
Macro CRYPTO_DEV_ENABLEDが定義され、安全な要素がExt3コネクタを介してSAM R34 Xplaine Proに接続されている場合:

Macro CRYPTO_DEV_ENABLED定義されていない場合、 lorawan_app.cでハードコードされたOTAA資格情報が使用されます。

デバイスがロラワンネットワークに成功した場合、アプリケーションは60秒ごとに定期的に目覚め、ロラワンネットワーク上でアップリンクメッセージを送信します。メッセージは、°Cと°Fのカウンター値と温度をカプセル化します。

アクティブモードでは、目覚めるたびに、デバイスは送信を発行し、その後2つの受信ウィンドウが発行されます。

2つのトランスミッションの間に、スタンバイモードでの消費電力は8UA前後です

スタンバイモードでは、CPUを目覚めることなくパルスカウントが可能です。

SAM R34データシートと比較して、追加のUA電流は、RFスイッチが現在のXplained Proボード設計で常に電源を入れているという事実によるものです。
WLR089U0 Xplained Proボードを使用すると、RFスイッチはアプリケーションによって制御され、その改善により測定された現在の消費量ははるかに低くなります。
結果は、Lorawan Network Serverコンソールでも観察できます。

クラスAデバイスの場合;ほとんどの場合眠っています。デバイスが無線トランザクションを実行していない場合の電力量を考慮することが重要です。睡眠時間の長いパラメーターでPMMを使用することは、ウェイクアップイベントの数を減らし、全体的な消費電力を削減するための良い習慣です。デバイスの全体的な電力消費を最適化したいときに考慮すべきその他の要因は
デューティサイクルが有効になっている場合(例:EU868バンドが使用されている場合)、デューティサイクルタイマーは睡眠を中断し、予期しないウェイクアップを与えています。
