
"Wireless machte einfach!" - Aktivieren Sie die Impulszählung einer Lorawan -Anwendung mit geringer Leistung

Die Software wird "wie es ist" bereitgestellt und geben einen Weg für Selbstversorgung und Selbstversorgung.
Dieses Repository enthält einen nicht unterstützten Beispielcode, der zur Beschleunigung der Kundenproduktentwicklung vorgesehen ist. Es wird weder für die Produktion validiert noch für die Best-Practices für Sicherheit geprüft.
Beachten Sie, dass dieses Repository zwar nicht unterstützt ist, Mikrochip-Begrüßungs-Community-Beiträge und alle Pull-Requests für die Aufnahme in das Repository berücksichtigt werden.
Interagieren Sie mit Gleichaltrigen in der Community im Lora Forum.
Basierend auf der aus ASFV3 generierten Lorawan-Anwendung zeigt dieser Beispielcode, wie ein leistungsstarkes Impulszählen aktiviert werden kann, während das Gerät im Standby-Modus platziert wird. Dies ist nützlich für batteriebetriebene Anwendungen,
Die Hauptanwendung besteht darin, den Zählerwert an einen Lorawan -Netzwerkanbieter -Cloud über ein Gateway zu übertragen. Für die Zwecke dieser Demo wurden TTN und TTI mit einem vorbewussten sicheren Element verwendet.
Klonen/Laden Sie das aktuelle Repo herunter, um die Software zu erhalten.
MUSS: Kaufen

Kaufen Sie das WLR089U0 Xplained Pro -Bewertungskit

Muss: Kauf eines Lora (R) -Torways (z. B. aus den Dingen Branchen) 
Optional: Kaufproben des ATECC608A-Tnglora Secure Element und des CryptoAuthentication UDFN Socket Kit
Laden Sie Microchip Studio 7.0 IDE herunter und installieren Sie sie.
Open Microchip Studio 7.0 IDE.
Installieren Sie aus Tools -> Erweiterungen und Updates erweiterte Software Framework (ASFV3) V3.49.1 Release oder obere Version.
Starten Sie Microchip Studio neu
Laden Sie ein serielles Terminalprogramm wie TERA Term herunter und installieren Sie sie.
Um den SAM R34 -Stromverbrauch zu extrahieren, muss die Karte wie unten erläutert konfiguriert werden:

Falls Sie TTI-Server und ein ATECC608A-Tnglora-sicheres Element verwenden, finden Sie dieses Repo für das Setup.
WLR089 Xplained Pro benötigt die Hardware -Änderung, um den Anwendungscode zu verwenden. Standardmäßig sind Induktor L301 (10UH) und Kondensator C316 (100 NF) nicht am WLR089 Xplained Pro montiert. Beide müssen montiert werden, um die Demo -Anwendung zu verwenden und Buck Converter als Hauptspannungsregler im aktiven Modus auszuwählen.
Weitere Informationen finden Sie in der Dokumentation WLR089 Xplained Pro.



Die SAMR34/R35 -Geräte haben genaue externe und interne Oszillatoren mit geringer Leistung. Verschiedene Taktdomänen können unabhängig so konfiguriert werden, dass sie bei unterschiedlichen Frequenzen ausgeführt werden, wodurch die Leistungssparung durch Ausführen jedes peripheren Taktfrequenz ermöglicht wird, wodurch eine hohe CPU-Frequenz beibehalten wird und gleichzeitig der Stromverbrauch verringert wird.
Die SAM R34/R35-Geräte verfügen über vier Software-ausgewählte Schlafmodi: Leerlauf, Standby, Backup und Aus.
Im Leerlaufmodus wird die CPU gestoppt, während alle anderen Funktionen möglicherweise ausgeführt werden.
Im Standby -Modus werden alle Uhren und Funktionen gestoppt, mit Ausnahme derjenigen, die ausgewählt wurden, um weiter zu laufen. In diesem Modus werden alle RAMs und Logikinhalte aufbewahrt. Das Gerät unterstützt das Schlafwandeln, wodurch einige Peripheriegeräte aus dem Schlaf basierend auf vordefinierten Bedingungen aufwachen können, sodass einige interne Operationen wie DMA-Übertragung und/oder die CPU nur bei Bedarf aufwachen können. Zum Beispiel, wenn eine Schwelle gekreuzt wird oder ein Ergebnis bereit ist. Das Ereignissystem unterstützt synchrone und asynchrone Ereignisse, sodass Peripheriegeräte auch im Standby -Modus Ereignisse empfangen, auf Ereignisse reagieren und senden können.
Im Sicherungsmodus werden die meisten Logik- und analogen Zellen ausgeschaltet. Es sind nur wenige Funktionen verfügbar (RTC, Backup-Register, Weck-up von externen Stiften).
Der Off -Modus wird nicht empfohlen, da eine hohe Impedanz im internen SPI -Bus zu Metastabilität führt.
Die SAM R34/R35-Geräte verfügen über zwei Software-ausgewählte Leistungsstufen (PL0 und PL2), mit der der Benutzer die niedrigste Kernspannungsstufe skalieren kann, die die Betriebsfrequenz unterstützt. Um den aktuellen Verbrauch weiter zu minimieren, speziell die Ablaufdissipation, verwenden die Geräte eine Power -Domain -Gating -Technik mit Aufbewahrung, um einige Logikbereiche auszuschalten und gleichzeitig ihren logischen Zustand zu halten. Diese Technik wird in Hardware vollständig behandelt.
Der Microchip Lorawan Stack (MLS) bietet ein Power Management -Modul (PMM) im Stapel. Eine auf MLS ausgeführte Anwendung kann PMM verwenden, um in den Leerlaufzeiten Strom zu sparen. Neben der Einsparung von Strom im Leerlauf versucht PMM, den Stromverbrauch auch während einer Transaktion zu reduzieren. Die Leistungseinsparung erfolgt durch Umschalten der MCU auf einen der verfügbaren Modi mit geringer Leistung. Derzeit wird PMM nur für SAM R34 MCU unterstützt und kann entweder im Standby- oder im Backup -Schlafmodus konfiguriert werden.
Standby -Modus:
Sicherungsmodus:
PMM wird über das Macro CONF_PMM_ENABLE aktiviert. Dieses Makro steuert die Zugabe und Entfernung von PMM in der Anwendung und im Stapel. Nachdem die PMM -Funktionen im Anwendungscode aktiviert wurden, werden alle Teile des zwischen dem folgenden Abschnitt befindlichen Codes kompiliert und ausgeführt:
#ifdef CONF_PMM_ENABLE
..
#endif
Die aktuelle Anwendung ( lorawan_app.c -Datei) implementiert bereits alle Code, die für die Verwendung von PMM -Funktionen erforderlich sind. Und die folgenden Details werden Informationen zur Verfügung gestellt.
Um PMM in einer Anwendung zu verwenden, müssen die folgenden Header -Dateien einbezogen werden:
#ifdef CONF_PMM_ENABLE
#include "pmm.h"
#include "conf_pmm.h"
#include "sleep_timer.h"
#include "sleep.h"
#endif
Standardmäßig wird die Anwendungsschlafzeit 30 Sekunden lang konfiguriert und kann in die gewünschten Werte geändert werden. Die Anwendungsanforderungszeit wird vom Makro konfiguriert:
#define DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS 30000 // Sleep duration in ms
Die Schlafdauer muss jedoch in den akzeptablen Bereich fallen, der in der folgenden Tabelle givin ist.

Das Schlaf -Timer -Modul muss initialisiert werden, um das RTC -Modul zu aktivieren:
#ifdef CONF_PMM_ENABLE
SleepTimerInit() ;
#endif
Die Datei rtc_count.h enthält die verfügbaren Uhrenquellen für das RTC -Modul.
#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
Für diese Anwendung wird das RTC -Modul von externen 32 -kHz -Takten getaktet. Die Verwendung des internen 32 -kHz -Ultra -Niedrigen -Stromzillators als RTC -Taktquelle ist möglich, erfordert jedoch unterschiedliche Takteinstellungen. Die Verwendung von XOSC32 führt zu einer besseren Leistung, einer geringeren Frequenzdrift und folglich höherer Stabilität.
Im Standby -Modus werden alle Taktquellen gestoppt, mit Ausnahme derjenigen, bei denen das Bit des Moduls für das Modul eingestellt ist oder das OnDemand -Bit auf Null eingestellt hat. Standardmäßig arbeitet der Regler im Niedrigpalaturmodus, wenn der Standby -Ruhemodus verwendet wird. Vor dem Eintritt in den Standby -Modus muss sichergestellt werden, dass eine erhebliche Menge an Uhren und Peripheriegeräten deaktiviert ist, sodass der Spannungsregler nicht überlastet ist. Um eine Überlastung zu vermeiden, sollten die Peripheriegeräte so konfiguriert werden, dass der vom interne Regler im niedrigen Leistungsmodus gelieferte Gesamtstromverbrauch weniger als 50 μA betragen sollte. Wenn die Peripheriegeräte, die im Standby -Modus ausgeführt werden müssen, mehr als 50UA benötigen, sollte der Regulierungsbehörde so konfiguriert werden, dass er im normalen Modus betrieben werden kann. Dies kann aus der Software durchgeführt werden, indem das Runstdby -Bit in SYSCTRL -> VRreg eingestellt wird.
Die Anwendung implementiert die folgende Leistungsoptimierungsfunktion, die den Nutzen der ultra-niedrigen Leistungsarchitektur des SAM R34-Geräts ermöglicht.
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 ;
}
Weitere Informationen zur Architektur mit niedriger Leistung des Mikrocontrollers finden Sie im SAM L21 -Familienprodukt -Datenblatt. https://www.microchip.com/wwwproducts/en/atsaml21j18b
Im Allgemeinen wandelt der Durchflusssensor die kinetische Energie in Form von Impulsen in elektrische digitale Signale um.
In dieser Anwendung zählt das SAM R34 -Gerät die Anzahl der Impulse, während sie im Standby -Modus bleiben. Dank der Veranstaltungssysteme (EVSYS), die im SAM R34-Gerät verfügbar sind, um interperiphere Kommunikation zu ermöglichen, hilft dies bei der Senkung des CPU-Lasts und des Stromverbrauchs des Systems. Es ermöglicht eine autonome Kontrolle von Peripheriegeräten ohne Verwendung der CPU -Bandbreite und kann über längere Zeiträume im Standby -Modus bleiben.
Einige Peripheriegeräte können weiterhin im Standby -Modus arbeiten, in dem die Quelluhr ausgeführt wird, und dies ist der Fall des Timer -Zählers (TC) oder des Timer -Zählers für Steueranwendungen (TCC).
Das Ereignissystem besteht aus den folgenden zwei Ereignisressourcen:
In der aktuellen Anwendung wurde das Ereignissystem wie unten konfiguriert.

Diese Anwendung zielt darauf ab, die Impulse aus einer Impulsquelle zu zählen und über das Lorawan -HF -Protokoll zu übertragen.

Das extert8 -Modul (physikalisch mit der auf der Karte vorhandenen Taste der Benutzer angeschlossen) ist so konfiguriert, dass ein Ereignis beim Drücken der Taste SW0 generiert wird. SW0 ist mit PA28 verbunden, was Interrupts auf extint erzeugen kann [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) ;
}
Dies wird vom Ereignissystemkanal 8 an Timer/Counter TC0 weitergeleitet.
// 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 ist so konfiguriert, dass ein 16-Bit-Zähler auf dem aus dem Enttint-Modul generierten Ereignis erhöht wird.
// 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) ;
}
Da TC ein OneDemand -Bit hat, verbessert es den Stromverbrauch im Standby -Modul gegen das TCC -Modul ein wenig. In conf_pulse_counter.h kann es ausgewählt werden, TC oder TCC als Zähler zu verwenden. Beide können im Standby -Modus zählen.
#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
Öffnen Sie das aktuelle Projekt mit Microchip Studio 7 IDE
Gehen Sie im oberen Menü zu Projekt -> Eigenschaften
Wenn ein sicheres Element mit SAM R34 Xplained Pro -Board verbunden ist, stellen Sie sicher, dass das Makro CRYPTO_DEV_ENABLED definiert ist. Wählen Sie Toolchain> Arm/GNU C -Compiler> Symbole

Wählen Sie aus Tooleinstellungen Ihre Karte als EDBG -Debugger mit SWD -Schnittstelle aus


Öffnen Sie im oberen Menü Tools> Data Visualizer

Wählen Sie im DGI -Bedienfeld SAMR34 Xplained Pro und klicken Sie auf Verbindung

Wenn Sie fertig sind, wählen Sie "Power" -Kinschnittstelle und klicken Sie auf Start, um die Stromanalyse auf der Karte zu starten.

Der Data Visualizer sollte den Stromverbrauch des SAM R34 -Geräts anzeigen und die Abstraktion des E/A- und externen Onboard -Chipverbrauchs vornehmen.
Open TERA Term UART-Konsole mit 115200 bps, 8-Daten-Bits/No Parity/1-Stop-Bit konfiguriert
Drücken Sie die Taste "Reset" auf der SAM R34 Xplained Pro -Karte, um zu sehen, wie die Konsole ausgedruckt ist
Wenn das Makro CRYPTO_DEV_ENABLED definiert ist und ein sicheres Element mit SAM R34 Xplained Pro über Ext3 -Anschluss verbunden ist:

Wenn das Makro CRYPTO_DEV_ENABLED nicht definiert ist, werden die in lorawan_app.c hart codierten OTAA-Anmeldeinformationen verwendet:

Wenn sich das Gerät erfolgreich dem Lorawan-Netzwerk angeschlossen hat, wird die Anwendung regelmäßig alle 60 Sekunden aufwachen und eine Uplink-Nachricht über das Lorawan-Netzwerk übertragen. Die Meldung verkauft den Zählerwert und die Temperatur in ° C und in ° F.

Im aktiven Modus gibt das Gerät bei jedem Aufwachen ein Getriebe aus, gefolgt von zwei Empfangsfenstern.

Zwischen zwei Übertragungen liegt der Stromverbrauch im Standby -Modus bei etwa 8UA

Im Standby -Modus ist die Impulszählung möglich, ohne die CPU aufzuwecken.

Im Vergleich zum SAM R34 -Datenblatt ist der zusätzliche UA -Strom darauf zurückzuführen, dass der RF -Switch im aktuellen Xplained Pro -Board -Design immer eingeschaltet wird.
Mit WLR089U0 Xplained Pro -Board wird der RF -Schalter von der Anwendung gesteuert und mit dieser Verbesserung ist der gemessene Stromverbrauch viel niedriger.
Das Ergebnis kann auch auf der Lorawan Network Server -Konsole beobachtet werden.

Für ein Gerät der Klasse A; das schläft die meiste Zeit; Es ist wichtig, die Leistung bei der Durchführung einer Funktransaktion zu berücksichtigen. Die Verwendung von PMM mit einem längeren Schlafzeitparameter ist eine gute Praxis, um die Anzahl der Weckereignisse zu verringern und den Gesamtverbrauch zu verringern. Andere Faktoren, die Sie berücksichtigen sollten, wenn Sie den Gesamtstromverbrauch Ihres Geräts optimieren möchten, sind
Wenn der Arbeitszyklus aktiviert ist (z. B. wenn das EU868-Band verwendet wird), unterbricht der Arbeitszyklus-Timer den Schlaf und gibt unerwartete Aufwachen.
