
"Le sans fil est facilité!" - Activer le comptage d'impulsions sur une application Lorawan à faible puissance

Le logiciel est fourni "tel quel" et donne un chemin d'auto-support et d'auto-entretien.
Ce référentiel contient un exemple de code non pris en charge destiné à accélérer le développement de produits clients. Il n'est pas validé pour la production ni vérifié pour les meilleures pratiques de sécurité.
Notez que même si ce référentiel n'est pas pris en charge, les contributions communautaires de bienvenue à Microchip et que tous les refontes seront envisagés pour l'inclusion dans le référentiel.
Interagissez avec les pairs de la communauté du Forum Lora.
Sur la base de l'application Lorawan générée à partir d'ASFV3, cet exemple de code montre comment activer un comptage d'impulsions économe en puissance tandis que l'appareil est placé en mode veille, utile pour les applications alimentées par batterie utilisées dans la mesure intelligente
L'application principale consiste à transmettre la valeur de comptoir à un cloud de fournisseur de réseau Lorawan via une passerelle. Aux fins de cette démo, TTN et TTI avec un élément sécurisé pré-provisionné ont été utilisés.
Clone / Téléchargez le dépôt actuel pour obtenir le logiciel.
MUST: Acheter le kit d'évaluation SAM R34 XPlated Pro

Achetez le kit d'évaluation WLR089U0 XPlated Pro

MUST: Acheter une passerelle lora (R) (par exemple dans les industries de choses) 
Facultatif: Achetez des échantillons de l'élément sécurisé Atecc608A-Tnglora et du kit de prise UDFN cryptoauthentification
Téléchargez et installez Microchip Studio 7.0 IDE.
Open Microchip Studio 7.0 IDE.
À partir des outils -> Extensions et mises à jour , installez Advanced Software Framework (ASFV3) V3.49.1 Version ou version supérieure.
Redémarrer Microchip Studio
Téléchargez et installez un programme de terminal série comme Tera Term.
Pour extraire la consommation de courant SAM R34, la carte doit être configurée comme expliqué ci-dessous:

Dans le cas où vous utilisez des serveurs TTI et un élément sécurisé ATECC608A-TNGLORA, reportez-vous à ce référentiel pour la configuration.
WLR089 XPlaten Pro a besoin de modification matérielle pour utiliser le code d'application. Par défaut, l'inducteur L301 (10UH) et le condensateur C316 (100NF) ne sont pas montés sur le WLR089 XPlated Pro. Les deux doivent être montés pour utiliser l'application de démonstration et sélectionner le convertisseur Buck comme régulateur de tension principal en mode actif.
Consultez la documentation WLR089 XPlated Pro pour plus de détails.



Les appareils SAMR34 / R35 ont des oscillateurs externes et internes à faible puissance précis. Différents domaines d'horloge peuvent être configurés indépendamment pour s'exécuter à différentes fréquences, permettant une économie de puissance en exécutant chaque périphérique à sa fréquence d'horloge optimale, maintenant ainsi une fréquence de CPU élevée tout en réduisant la consommation d'énergie.
Les appareils SAM R34 / R35 disposent de quatre modes de sommeil sélectionnables par logiciel: inactif, veille, sauvegarde et off.
En mode inactif , le CPU est arrêté tandis que toutes les autres fonctions peuvent être en cours d'exécution.
En mode veille , toutes les horloges et fonctions sont arrêtées, sauf celles sélectionnées pour continuer à fonctionner. Dans ce mode, tous les RAM et contenus logiques sont conservés. L'appareil prend en charge le somnambulisme, ce qui permet à certains périphériques de se réveiller du sommeil en fonction des conditions prédéfinies, permettant ainsi à certaines opérations internes comme le transfert DMA et / ou le processeur de se réveiller uniquement en cas de besoin; Par exemple, lorsqu'un seuil est franchi, ou qu'un résultat est prêt. Le système d'événements prend en charge les événements synchrones et asynchrones, permettant aux périphériques de recevoir, de réagir et d'envoyer des événements même en mode veille.
En mode de sauvegarde , la plupart des cellules logiques et analogiques sont éteintes. Seules quelques fonctionnalités sont disponibles (RTC, registres de sauvegarde, réveil des broches externes).
Le mode OFF n'est pas conseillé, car une impédance élevée sur le bus SPI interne entraîne une métastabilité.
Les appareils SAM R34 / R35 ont deux niveaux de performance sélectionnables par logiciel (PL0 et PL2) permettant à l'utilisateur d'échec le niveau de tension de base le plus bas qui prend en charge la fréquence de fonctionnement. Pour minimiser davantage la consommation actuelle, en particulier la dissipation de fuite, les appareils utilisent une technique de déclenchement du domaine de puissance avec rétention pour désactiver certaines zones logiques tout en gardant leur état logique. Cette technique est entièrement gérée dans le matériel.
La pile Microchip Lorawan (MLS) fournit un module de gestion de l'alimentation (PMM) dans la pile. Une application exécutée en plus de MLS peut choisir d'utiliser PMM pour économiser de l'énergie pendant les temps d'inactivité. En plus d'économiser la puissance pendant le ralenti, PMM essaie de réduire la consommation d'énergie même pendant une transaction. L'économie d'énergie est effectuée en passant le MCU à l'un des modes de faible puissance disponibles. Actuellement, PMM est pris en charge uniquement sur SAM R34 MCU et il peut être configuré en mode veille ou de sommeil.
Mode de veille:
Mode de sauvegarde:
PMM est activé via le macro CONF_PMM_ENABLE . Cette macro contrôle l'addition et la suppression de PMM dans l'application et dans la pile. Après l'activation des fonctionnalités PMM dans le code d'application, toutes les parties du code situées entre la section suivante seront compilées et exécutées:
#ifdef CONF_PMM_ENABLE
..
#endif
L'application actuelle (fichier lorawan_app.c ) implémente déjà tout le code requis pour l'utilisation des fonctionnalités PMM. Et les détails suivants sont donnés pour plus d'informations.
Pour utiliser PMM dans une application, il est nécessaire d'inclure les fichiers d'en-tête suivants:
#ifdef CONF_PMM_ENABLE
#include "pmm.h"
#include "conf_pmm.h"
#include "sleep_timer.h"
#include "sleep.h"
#endif
Par défaut, le temps de sommeil de l'application est configuré pendant 30 secondes et peut être modifié en valeurs souhaitées. Le temps de demande de sommeil de l'application est configuré par la macro:
#define DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS 30000 // Sleep duration in ms
Mais la durée du sommeil doit se situer dans la plage acceptable qui est donnée dans le tableau suivant.

Le module de minuterie de sommeil doit être initialisé pour activer le module RTC:
#ifdef CONF_PMM_ENABLE
SleepTimerInit() ;
#endif
Le fichier rtc_count.h contient les sources d'horloge disponibles pour le module 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
Pour cette application, le module RTC sera chronométré à partir de l'horloge externe de 32 kHz. L'utilisation de l'oscillateur interne 32KHz Ultra Low Power car la source d'horloge RTC est possible mais nécessite des paramètres d'horloge différents. L'utilisation de XOSC32 entraînera de meilleures performances, moins de dérive de fréquence et par conséquent une stabilité plus élevée.
En mode veille, toutes les sources d'horloge sont arrêtées, à l'exception de celles où le bit Runstdby (exécuter en veille) pour le module est défini ou que le bit ondemand est défini sur zéro. Par défaut, le régulateur fonctionne en mode faible puissance lors de l'utilisation du mode de sommeil de veille. Avant d'entrer en mode veille, il faut s'assurer que une quantité importante d'horloges et de périphériques est désactivée, de sorte que le régulateur de tension n'est pas surchargé. Pour éviter la surcharge, les périphériques doivent être configurés afin que la consommation d'énergie totale fournie par le régulateur interne en mode faible puissance soit inférieure à 50 μA. Si les périphériques requis pour s'exécuter en mode veille consomment plus de 50UA, le régulateur doit être configuré pour fonctionner en mode normal, et cela peut être fait à partir du logiciel en définissant le bit Runstdby dans SySctrl -> Vreg.
L'application implémente la fonction d'optimisation d'alimentation suivante permettant l'avantage de l'architecture de puissance ultra-bas du dispositif 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 ;
}
Reportez-vous à la fiche technique du produit de la famille SAM L21 pour plus de détails sur l'architecture basse puissance du microcontrôleur. https://www.microchip.com/wwwproducts/en/atsaml21j18b
En général, le capteur de débit convertit l'énergie cinétique de la rotation en signaux numériques électriques sous forme d'impulsions.
Dans cette application, le périphérique SAM R34 compte le nombre d'impulsions tout en restant en mode veille. Grâce aux fonctionnalités du système d'événements (EVSYS) disponibles dans l'appareil SAM R34 pour permettre les communications inter-périphériques contribuent ainsi à réduire la charge du processeur et la consommation d'énergie du système. Il permet un contrôle autonome des périphériques sans aucune utilisation de la bande passante du processeur et il peut rester en mode veille pendant des périodes plus longues.
Certains périphériques peuvent continuer à fonctionner en mode veille, où l'exécution de l'horloge source, et c'est le cas du compteur de minuterie (TC) ou du compteur de minuterie pour les applications de contrôle (TCC).
Le système d'événements est composé des deux ressources d'événement suivantes:
Dans l'application actuelle, le système d'événements a été configuré comme ci-dessous.

Cette application vise à compter les impulsions provenant d'une source d'impulsion et à transmettre sur le protocole Lorawan RF.

Le module EXTINT8 (connecté physiquement au bouton utilisateur présent sur la carte) est configuré pour générer un événement lorsque le bouton SW0 est appuyé. SW0 est connecté à PA28, qui peut générer des interruptions sur l'extinction [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) ;
}
Ceci est acheminé vers Timer / Counter TC0 par le canal du système d'événements 8.
// 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 est configuré pour incrémenter un compteur 16 bits sur l'événement généré à partir du module d'extinction.
// 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) ;
}
Étant donné que TC a un bit ondemand, il améliore un peu la consommation d'énergie en mode veille par rapport au module TCC. Dans conf_pulse_counter.h , il est possible de sélectionner d'utiliser TC ou TCC comme compteur. Les deux sont capables de compter en mode veille.
#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
Ouvrez le projet actuel avec Microchip Studio 7 IDE
Dans le menu supérieur, accédez au projet -> Propriétés
Dans le cas où un élément sécurisé est connecté à SAM R34 Xplatenf Pro Board, assurez-vous que la macro CRYPTO_DEV_ENABLED est définie. Sélectionnez Toolchain> Compilateur ARM / GNU C> Symboles

Dans les paramètres de l'outil, sélectionnez votre carte comme débogueur EDBG avec interface SWD


Dans le menu supérieur, ouvrez les outils> Visualiseur de données

Sous Panneau de configuration DGI, sélectionnez SAMR34 XPlatening Pro et cliquez sur Connexion

Lorsqu'il est prêt, sélectionnez l'interface "alimenter" et cliquez sur Démarrer pour démarrer l'analyse de l'alimentation sur la carte.

Le visualiseur de données doit afficher la consommation d'énergie du périphérique SAM R34 et faire l'abstraction des E / S et la consommation de puces embarquée externe.
Open Tera Term UART Console configuré à 115200 bps, 8 données / pas de parité / 1 bit-stop
Appuyez sur le bouton "Réinitialiser" sur la carte Pro SAM R34 XPlatenée pour voir la sortie imprimée à la console
Si la macro CRYPTO_DEV_ENABLED est définie et qu'un élément sécurisé est connecté au connecteur SAM R34 XPlaend Pro sur Ext3:

Si la macro CRYPTO_DEV_ENABLED n'est pas définie, les informations d'identification OTAA dans lorawan_app.c sont utilisées:

Lorsque l'appareil a rejoint avec succès le réseau Lorawan, l'application se réveille périodiquement toutes les 60 secondes et transmettra un message de liaison montante sur le réseau Lorawan. Le message résume la valeur du comptoir et la température en ° C et en ° F.

En mode actif, à chaque réveil, l'appareil émettra une transmission suivie de deux fenêtres de réception.

Entre deux transmission, la consommation d'énergie en mode veille est d'environ 8UA

En mode veille, le comptage d'impulsions est possible sans réveiller le CPU.

En comparaison avec la fiche technique SAM R34, le courant UA supplémentaire est dû au fait que l'interrupteur RF est toujours allumé dans la conception actuelle de la carte PRO XPlated.
Avec la carte Pro WLR089U0 XPlated, le commutateur RF est contrôlé par l'application et avec cette amélioration, la consommation de courant mesurée est beaucoup plus faible.
Le résultat peut également être observé sur la console de serveur réseau Lorawan.

Pour un appareil de classe A; qui dort la plupart du temps; Il est important de prendre en considération la quantité de puissance lorsque l'appareil n'effectue pas de transaction radio. L'utilisation de PMM avec un paramètre de temps de sommeil plus long est une bonne pratique pour réduire le nombre d'événements de réveil et réduire la consommation d'énergie globale. D'autres facteurs à considérer lorsque vous souhaitez optimiser la consommation d'énergie globale de votre appareil sont
Si le cycle de service est activé (par exemple, si la bande EU868 est utilisée), le temporisateur du cycle interrompt le sommeil et donne des réveils inattendus.
