
"¡Wireless hecho fácil!" - Habilitar el conteo de pulsos en una aplicación Lorawan de baja potencia

El software se proporciona "tal cual" y da una ruta para el autodesportamiento y el autodenimiento.
Este repositorio contiene un código de ejemplo no compatible destinado a ayudar a acelerar el desarrollo del producto del cliente. No está validado para la producción ni auditado para las mejores prácticas de seguridad.
Tenga en cuenta que si bien este repositorio no es compatible, las contribuciones de la comunidad de bienvenida a Microchip, y todas las solicitudes de extracción se considerarán para su inclusión en el repositorio.
Interactuar con sus compañeros en la comunidad en el foro de Lora.
Según la aplicación Lorawan generada por ASFV3, este código de muestra demuestra cómo habilitar un conteo de pulsos de eficiencia de alimentación mientras el dispositivo se coloca en modo de espera, útil para aplicaciones con batería utilizadas en medidas inteligentes
La aplicación principal consiste en transmitir el valor de contador a una nube de proveedor de red de Lorawan a través de una puerta de enlace. A los efectos de esta demostración, se han utilizado TTN y TTI con un elemento seguro previamente provisional.
Clon/descargue el repositorio actual para obtener el software.
Debe: comprar el kit de evaluación SAM R34 XPlained Pro

Compre el kit de evaluación WLR089U0 XPlained Pro

Debe: comprar una puerta de enlace Lora (R) (por ejemplo, de las industrias de las cosas) 
Opcional: Compre muestras del elemento ATECC608A-Tnglora Secure y el kit de socket de criptoautenticación UDFN
Descargue e instale Microchip Studio 7.0 IDE.
Abra Microchip Studio 7.0 IDE.
Desde herramientas -> Extensiones y actualizaciones , instale avanzado marco de software (ASFV3) v3.49.1 versión o versión superior.
Reiniciar Microchip Studio
Descargue e instale un programa de terminal en serie como TERA Term.
Para extraer el consumo de corriente SAM R34, la placa requiere ser configurada como se explica a continuación:

En caso de que esté utilizando servidores TTI y un elemento seguro ATECC608A-TNGLORA, consulte este repositorio para la configuración.
WLR089 XPlained Pro requiere modificación de hardware para usar el código de aplicación. Por defecto, el inductor L301 (10UH) y el condensador C316 (100NF) no están montados en el WLR089 XPlained Pro. Ambos deben montarse para usar la aplicación de demostración y seleccione el convertidor Buck como el regulador de voltaje principal en modo activo.
Consulte la documentación WLR089 XPlained Pro para obtener más detalles.



Los dispositivos SAMR34/R35 tienen osciladores externos e internos de baja potencia precisa. Los diferentes dominios del reloj se pueden configurar de forma independiente para ejecutarse a diferentes frecuencias, lo que permite el ahorro de energía ejecutando cada periférico a su frecuencia de reloj óptima, manteniendo así una alta frecuencia de CPU mientras reduce el consumo de energía.
Los dispositivos SAM R34/R35 tienen cuatro modos de sueño selectables de software: inactivo, espera, copia de seguridad y apagado.
En modo inactivo , la CPU se detiene mientras todas las demás funciones pueden mantenerse en funcionamiento.
En modo de espera , todos los relojes y funciones se detienen, excepto los seleccionados para continuar ejecutándose. En este modo se conservan todas las RAM y el contenido lógico. El dispositivo admite el sonambulismo, lo que permite que algunos periféricos se despierten del sueño según las condiciones predefinidas, lo que permite algunas operaciones internas como la transferencia de DMA y/o la CPU para despertarse solo cuando sea necesario; Por ejemplo, cuando se cruza un umbral, o un resultado está listo. El sistema de eventos admite eventos sincrónicos y asincrónicos, lo que permite que los periféricos reciban, reaccionen y envíen eventos incluso en modo de espera.
En el modo de copia de seguridad , la mayoría de las células lógicas y analógicas están apagadas. Solo hay pocas características disponibles (RTC, registros de copia de seguridad, activación de pines externos).
No se recomienda el modo de apagado , ya que la alta impedancia en el bus SPI interno da como resultado una metaestabilidad.
Los dispositivos SAM R34/R35 tienen dos niveles de rendimiento selectables de software (PL0 y PL2) que permiten al usuario escalar el nivel de voltaje central más bajo que admite la frecuencia operativa. Para minimizar aún más el consumo de corriente, específicamente la disipación de fugas, los dispositivos utilizan una técnica de activación de dominio de potencia con retención para apagar algunas áreas lógicas mientras mantienen su estado lógico. Esta técnica se maneja completamente en el hardware.
La pila Microchip Lorawan (MLS) proporciona un módulo de administración de energía (PMM) en la pila. Una aplicación que se ejecuta en la parte superior de MLS puede optar por usar PMM para guardar energía durante los tiempos inactivos. Además de ahorrar energía durante el inactividad, PMM intenta reducir el consumo de energía incluso durante una transacción. El ahorro de energía se realiza cambiando el MCU a uno de los modos de baja potencia disponibles. Actualmente, PMM solo se admite en SAM R34 MCU y se puede configurar en modo de suspensión o suspensión de respaldo.
Modo de espera:
Modo de respaldo:
PMM está habilitado a través del macro CONF_PMM_ENABLE . Esta macro controla la adición y eliminación de PMM en la aplicación y en la pila. Después de habilitar las funciones de PMM en el código de aplicación, todas las partes del código ubicadas entre la siguiente sección serán compiladas y ejecutadas:
#ifdef CONF_PMM_ENABLE
..
#endif
La aplicación actual (archivo lorawan_app.c ) ya implementa todo el código requerido para usar las funciones de PMM. Y se dan los siguientes detalles para obtener información.
Para usar PMM en una aplicación, se requiere incluir los siguientes archivos de encabezado:
#ifdef CONF_PMM_ENABLE
#include "pmm.h"
#include "conf_pmm.h"
#include "sleep_timer.h"
#include "sleep.h"
#endif
Por defecto, el tiempo de sueño de la aplicación se configura durante 30 segundos y se puede cambiar a los valores deseados. El tiempo de solicitud de sueño de la aplicación está configurado por la macro:
#define DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS 30000 // Sleep duration in ms
Pero la duración del sueño debe caer dentro del rango aceptable que se da en la siguiente tabla.

El módulo del temporizador de sueño debe inicializarse para habilitar el módulo RTC:
#ifdef CONF_PMM_ENABLE
SleepTimerInit() ;
#endif
El archivo rtc_count.h contiene las fuentes de reloj disponibles para el módulo 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
Para esta aplicación, el módulo RTC se registrará desde el reloj externo de 32 kHz. Usando el oscilador interno de potencia ultra de 32 kHz, ya que es posible la fuente del reloj RTC, pero requiere diferentes configuraciones de reloj. El uso de XOSC32 dará como resultado un mejor rendimiento, menos frecuencia de frecuencia y, en consecuencia, una mayor estabilidad.
En modo de espera, se detienen todas las fuentes de reloj, excepto aquellas en las que se establece el bit Runstdby (Ejecutar en espera) para el módulo o se establece el bit de OnDemand en cero. Por defecto, el regulador funciona en modo de baja potencia cuando se usa el modo de suspensión en espera. Antes de ingresar al modo de espera, debe asegurarse de que se desactiven una cantidad significativa de relojes y periféricos, de modo que el regulador de voltaje no esté sobrecargado. Para evitar la sobrecarga, los periféricos deben configurarse para que el consumo de energía total suministrado por el regulador interno en modo de baja potencia sea inferior a 50 μA. Si los periféricos necesarios para ejecutarse en modo de espera consumen más de 50UA, el regulador debe configurarse para operar en modo normal, y esto se puede hacer desde el software configurando el bit runstdby en sysctrl -> vreg.
La aplicación implementa la siguiente función de optimización de potencia que permite el beneficio de la arquitectura de potencia ultra baja del dispositivo 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 ;
}
Consulte la hoja de datos de productos familiares SAM L21 para obtener más detalles sobre la arquitectura de baja potencia del microcontrolador. https://www.microchip.com/wwwproducts/en/atsaml21j18b
En general, el sensor de flujo convierte la energía cinética de la rotación en señales digitales eléctricas en forma de pulsos.
En esta aplicación, el dispositivo SAM R34 cuenta el número de pulsos mientras permanece en modo de espera. Gracias a las características del Sistema de Eventos (EVSYS) disponibles dentro del dispositivo SAM R34 para habilitar las comunicaciones interperiféricas, por lo tanto, ayuda a reducir la carga de CPU y el consumo de energía del sistema. Permite el control autónomo de los periféricos sin ningún uso del ancho de banda de la CPU y puede permanecer en modo de espera durante períodos más largos.
Algunos periféricos pueden continuar funcionando en modo de espera, donde se ejecuta el reloj de origen, y este es el caso del contador de temporizador (TC) o el contador de temporizador para aplicaciones de control (TCC).
El sistema de eventos está compuesto por los siguientes dos recursos de eventos:
En la aplicación actual, el sistema de eventos se ha configurado como a continuación.

Esta aplicación tiene como objetivo contar los pulsos provenientes de una fuente de pulso y transmitir sobre el protocolo de RF Lorawan.

El módulo Extint8 (conectado físicamente al botón de usuario presente en la placa) está configurado para generar un evento cuando se presiona el botón SW0. SW0 está conectado a PA28, que puede generar interrupciones en 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) ;
}
Esto se enruta al temporizador/contador TC0 por el canal del sistema de eventos 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á configurado para incrementar un contador de 16 bits en el evento generado a partir del módulo Extint.
// 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) ;
}
Dado que TC tiene un bit de Ondemand, mejora un poco el consumo de energía en modo de espera contra el módulo TCC. En conf_pulse_counter.h , es posible seleccionar usar TC o TCC como contador. Ambos pueden contar durante el modo de espera.
#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
Abra el proyecto actual con Microchip Studio 7 IDE
Desde el menú superior, vaya a Project -> Propiedades
En caso de que un elemento seguro esté conectado a la placa SAM R34 XPlained Pro, asegúrese de definir la macro CRYPTO_DEV_ENABLED . Seleccione ToolChain> Compilador ARM/GNU C> Símbolos

Desde la configuración de la herramienta, seleccione su placa como depurador EDBG con la interfaz SWD


Desde el menú superior, abra Herramientas> Visualizador de datos

En el panel de control DGI, seleccione SAMR34 XPlained Pro y haga clic en Conectar

Cuando esté listo, seleccione la interfaz "encendido" y haga clic en Inicio para iniciar el análisis de alimentación en el tablero.

El visualizador de datos debe mostrar el consumo de energía del dispositivo SAM R34 y hacer la abstracción de la E/S y el consumo externo de chip a bordo.
Abra la consola de TERA Term UART configurada a 115200 bps, bits de 8 datos/sin paridad/1 parada
Presione el botón "Restablecer" en la placa SAM R34 XPlained Pro para ver la salida impresa en la consola
Si se define el macro CRYPTO_DEV_ENABLED y un elemento seguro está conectado a SAM R34 XPlained Pro sobre el conector Ext3:

Si no se define el macro CRYPTO_DEV_ENABLED , se utilizan las credenciales de OTAA en lorawan_app.c :

Cuando el dispositivo se unió con éxito a la red Lorawan, la aplicación despierta periódicamente cada 60 segundos y transmitirá un mensaje de enlace ascendente a través de la red Lorawan. El mensaje encapsula el valor del contador y la temperatura en ° C y en ° F.

En modo activo, en cada despertador, el dispositivo emitirá una transmisión seguida de dos ventanas de recepción.

Entre dos transmisión, el consumo de energía en modo de espera es de alrededor de 8UA

En modo de espera, el conteo de pulsos es posible sin despertar la CPU.

En comparación con la hoja de datos SAM R34, la corriente de UA adicional se debe al hecho de que el interruptor de RF siempre se enciende en el diseño actual de la placa XPlained Pro.
Con la placa WLR089U0 XPlained Pro, el interruptor de RF está controlado por la aplicación y con esa mejora el consumo de corriente medido es mucho más bajo.
El resultado también se puede observar en la consola del servidor de red Lorawan.

Para un dispositivo Clase A; que duerme la mayor parte del tiempo; Es importante tener en cuenta la cantidad de potencia cuando el dispositivo no realiza una transacción de radio. El uso de PMM con un parámetro de tiempo de sueño más largo es una buena práctica para reducir la cantidad de eventos de despertar y reducir el consumo general de energía. Otros factores a considerar cuando desea optimizar el consumo general de energía de su dispositivo son
Si se habilita el ciclo de trabajo (por ejemplo, si se usa la banda EU868), el temporizador de ciclo de servicio está interrumpiendo el sueño y dando atención inesperada.
