
"Facilizado sem fio!" - Ativar contagem de pulsos em um aplicativo Lorawan de baixa potência

O software é fornecido "como está" e dê um caminho para auto-apoio e auto-manutenção.
Este repositório contém código de exemplo não suportado destinado a ajudar a acelerar o desenvolvimento do produto do cliente. Não é validado para produção nem auditado para práticas de segurança.
Observe que, embora esse repositório não seja suportado, o Microchip recebe as contribuições da comunidade e todas as solicitações de tração serão consideradas para inclusão no repositório.
Interaja com os colegas da comunidade no Fórum Lora.
Com base no aplicativo Lorawan gerado a partir do ASFV3, esse código de amostra demonstra como permitir uma contagem de pulsos com eficiência de energia enquanto o dispositivo é colocado no modo de espera, útil para aplicativos movidos a bateria usados em medição inteligente
O aplicativo principal consiste em transmitir o valor do contador a uma nuvem de fornecedores de rede de Lorawan através de um gateway. Para os fins desta demonstração, TTN e TTI com um elemento seguro pré-provisionado foram usados.
Clone/Baixe o repo atual para obter o software.
Deve: comprar o kit de avaliação Sam R34 XPLINED

Compre o WLR089U0 XPLERIED PRO AVALIAÇÃO KIT

Deve: comprar um gateway Lora (R) (por exemplo, das Indústrias das Coisas) 
Opcional: compra de amostras do elemento seguro ATECC608A-TNGLORA e o kit de soquete da criptoauthenticação UDFN
Baixe e instale o Microchip Studio 7.0 IDE.
Open Microchip Studio 7.0 IDE.
A partir de ferramentas -> Extensões e atualizações , instale a estrutura avançada de software (ASFV3) v3.49.1 Lançamento ou liberação superior.
Reinicie o Microchip Studio
Faça o download e instale um programa de terminal serial como o TERA TERM.
Para extrair o consumo atual do SAM R34, o Conselho precisa ser configurado conforme explicado abaixo:

Caso você esteja usando servidores TTI e um elemento seguro ATECC608A-TNGLORA, consulte este repositório para a configuração.
O WLR089 XPLERED PRO requer modificação de hardware para usar o código do aplicativo. Por padrão, o Indutor L301 (10UH) e o capacitor C316 (100NF) não são montados no WLR089 XPLINED PRO. Ambos precisam ser montados para usar o aplicativo de demonstração e selecionar o conversor BUCK como o principal regulador de tensão no modo ativo.
Confira a documentação do WLR089 XPLOIND PRO para obter mais detalhes.



Os dispositivos SAMR34/R35 possuem osciladores externos e internos de baixa potência. Diferentes domínios de relógio podem ser configurados independentemente para executar em diferentes frequências, permitindo economizar energia executando cada periférico em sua frequência ideal de relógio, mantendo assim uma alta frequência de CPU e reduzindo o consumo de energia.
Os dispositivos SAM R34/R35 possuem quatro modos de sono selecionáveis por software: ocioso, em espera, backup e desativado.
No modo ocioso , a CPU é interrompida enquanto todas as outras funções podem ser mantidas em funcionamento.
No modo de espera , todos os relógios e funções são interrompidos, exceto os selecionados para continuar em execução. Neste modo, todos os rams e conteúdos lógicos são retidos. O dispositivo suporta o sono, o que permite que alguns periféricos acordem do sono com base em condições predefinidas, permitindo assim algumas operações internas, como transferência de DMA e/ou a CPU, apenas despertar quando necessário; Por exemplo, quando um limite é cruzado ou um resultado está pronto. O sistema de eventos suporta eventos síncronos e assíncronos, permitindo que os periféricos recebam, reagem e enviem eventos mesmo no modo de espera.
No modo de backup , a maioria das células lógicas e analógicas é desligada. Apenas poucos recursos estão disponíveis (RTC, registros de backup, despertar de pinos externos).
O modo off não é recomendado, pois a alta impedância no barramento SPI interno resulta em metaestabilidade.
Os dispositivos SAM R34/R35 possuem dois níveis de desempenho selecionáveis por software (PL0 e PL2), permitindo ao usuário escalar o nível de tensão do núcleo mais baixo que suporta a frequência operacional. Para minimizar ainda mais o consumo atual, especificamente a dissipação de vazamentos, os dispositivos utilizam uma técnica de bloqueio de domínio de energia com retenção para desativar algumas áreas lógicas, mantendo seu estado lógico. Esta técnica é totalmente tratada em hardware.
A pilha Microchip Lorawan (MLS) fornece um módulo de gerenciamento de energia (PMM) na pilha. Um aplicativo em execução no topo do MLS pode optar por usar o PMM para economizar energia durante os horários ociosos. Além de economizar energia durante o IDLE, o PMM tenta reduzir o consumo de energia, mesmo durante uma transação. A economia de energia é feita alternando o MCU para um dos modos de baixa potência disponíveis. Atualmente, o PMM é suportado apenas no SAM R34 MCU e pode ser configurado no modo de suspensão de espera ou de backup.
Modo de espera:
Modo de backup:
O PMM é ativado através da macro CONF_PMM_ENABLE . Essa macro controla a adição e a remoção do PMM no aplicativo e na pilha. Depois de ativar os recursos do PMM no código do aplicativo, todas as partes do código localizadas entre a seção a seguir serão compiladas e executadas:
#ifdef CONF_PMM_ENABLE
..
#endif
O aplicativo atual (arquivo lorawan_app.c ) já implementa todo o código necessário para o uso de recursos do PMM. E os seguintes detalhes são fornecidos para obter informações.
Para usar o PMM em um aplicativo, é necessário incluir os seguintes arquivos de cabeçalho:
#ifdef CONF_PMM_ENABLE
#include "pmm.h"
#include "conf_pmm.h"
#include "sleep_timer.h"
#include "sleep.h"
#endif
Por padrão, o tempo de sono do aplicativo é configurado por 30 segundos e pode ser alterado para os valores desejados. O tempo de solicitação de sono do aplicativo é configurado pela macro:
#define DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS 30000 // Sleep duration in ms
Mas a duração do sono deve se enquadrar no intervalo aceitável, que está dando na tabela a seguir.

O módulo do temporizador de sono deve ser inicializado para ativar o módulo RTC:
#ifdef CONF_PMM_ENABLE
SleepTimerInit() ;
#endif
O arquivo rtc_count.h contém as fontes de relógio disponíveis para o 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 este aplicativo, o módulo RTC será relatado do relógio externo de 32kHz. Usando o oscilador interno de 32kHz de baixa potência, pois a fonte do relógio RTC é possível, mas requer diferentes configurações de relógio. O uso do XOSC32 resultará em melhor desempenho, desvio de menos frequência e, consequentemente, maior estabilidade.
No modo de espera, todas as fontes de relógio são interrompidas, exceto aquelas em que o bit runstdby (executado em espera) para o módulo está definido ou tem o bit ondemand definido como zero. Por padrão, o regulador opera no modo de baixa energia ao usar o modo de suspensão em espera. Antes de inserir o modo de espera, deve -se garantir que a quantidade significativa de relógios e periféricos esteja desativada, para que o regulador de tensão não esteja sobrecarregado. Para evitar a sobrecarga, os periféricos devem ser configurados para que o consumo total de energia fornecido pelo regulador interno no modo de baixa potência seja menor que 50μA. Se os periféricos necessários para executar no modo de espera consumirem mais de 50ua, o regulador deverá ser configurado para operar no modo normal, e isso poderá ser feito a partir do software, definindo o bit runstdby em sysctrl -> vreg.
O aplicativo implementa a seguinte função de otimização de energia, permitindo o benefício da arquitetura de potência ultra-baixa do 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 a folha de dados do produto da família SAM L21 para obter mais detalhes sobre a arquitetura de baixa potência do microcontrolador. https://www.microchip.com/wwwproducts/en/atsaml21j18b
Em geral, o sensor de fluxo converte a energia cinética da rotação em sinais digitais elétricos na forma de pulsos.
Neste aplicativo, o dispositivo SAM R34 conta o número de pulsos enquanto permanece no modo de espera. Graças aos recursos do sistema de eventos (EVSYs) disponíveis no dispositivo SAM R34 para ativar as comunicações inter-periféricas, portanto, ajuda a diminuir a carga da CPU e o consumo de energia do sistema. Ele permite o controle autônomo dos periféricos sem uso da largura de banda da CPU e pode permanecer no modo de espera por períodos mais longos.
Alguns periféricos podem continuar operando no modo de espera, onde o relógio de origem está em execução, e esse é o caso do contador do timer (TC) ou do contador do timer para aplicações de controle (TCC).
O sistema de eventos é composto pelos dois recursos de eventos a seguir:
No aplicativo atual, o sistema de eventos foi configurado como abaixo.

Este aplicativo tem como objetivo contar os pulsos provenientes de uma fonte de pulso e transmitir sobre o protocolo de RF de Lorawan.

O módulo extint8 (fisicamente conectado ao botão do usuário presente na placa) está configurado para gerar um evento quando o botão SW0 for pressionado. O SW0 está conectado ao PA28, que pode gerar interrupções no 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) ;
}
Isso é roteado para o timer/contador TC0 pelo canal 8 do sistema de eventos.
// 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) ;
}
O TC0 é configurado para incrementar um contador de 16 bits no evento gerado a partir do 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) ;
}
Como o TC tem o bit ONDemand, ele melhora um pouco o consumo de energia no modo de espera no módulo TCC. Em conf_pulse_counter.h , é possível selecionar usar TC ou TCC como contador. Ambos são capazes de contar durante o 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 o projeto atual com o Microchip Studio 7 IDE
No menu superior, vá para o Projeto -> Propriedades
Caso um elemento seguro esteja conectado à placa Pro Sam R34 Xplined, verifique se a macro CRYPTO_DEV_ENABLED está definida. Selecione Toolchain> ARM/GNU C Compilador> Símbolos

Nas configurações de ferramentas, selecione sua placa como depurador EDBG com interface SWD


No menu superior, Abrir ferramentas> Visualizador de dados

No painel de controle do DGI, selecione SAMR34 XPLINED PRO e clique em Conectar

Quando estiver pronto, selecione a interface "Power" e clique em Iniciar para iniciar a análise de energia na placa.

O visualizador de dados deve exibir o consumo de energia do dispositivo SAM R34 e fazer abstração da E/S e do consumo externo de chips.
Open tera termo uart console configurado a 115200 bps, bits de 8 dados/sem paridade/1 stop bit
Pressione o botão "Redefinir" no Sam R34 Xplined Pro Board para ver a saída impressa no console
Se a macro CRYPTO_DEV_ENABLED for definida e um elemento seguro estiver conectado ao SAM R34 XPLINED PRO Over EXT3 Connector:

Se a macro CRYPTO_DEV_ENABLED não estiver definida, as credenciais da OTAA codificadas em lorawan_app.c serão usadas:

Quando o dispositivo ingressou com sucesso na rede Lorawan, o aplicativo acorda periodicamente a cada 60 segundos e transmite uma mensagem de uplink pela rede Lorawan. A mensagem encapsula o valor do contador e a temperatura em ° C e em ° F.

No modo ativo, em todos os acordados, o dispositivo emitirá uma transmissão seguida por duas janelas de recepção.

Entre duas transmissão, o consumo de energia no modo de espera é de cerca de 8ua

No modo de espera, a contagem de pulsos é possível sem acordar a CPU.

Comparando com a folha de dados Sam R34, a corrente UA adicional se deve ao fato de o interruptor de RF estar sempre ligado no design do placa Pro atual.
Com o WLR089U0 XPLINED PRO PLACA, a chave de RF é controlada pelo aplicativo e, com essa melhoria, o consumo atual medido é muito menor.
O resultado também pode ser observado no console do Lorawan Network Server.

Para um dispositivo de classe A; que está dormindo na maioria das vezes; É importante levar em consideração a quantidade de energia quando o dispositivo não está executando uma transação de rádio. O uso do PMM com um parâmetro de tempo de sono mais longo é uma boa prática para reduzir o número de eventos de despertar e reduzir o consumo geral de energia. Outros fatores a serem considerados quando você deseja otimizar o consumo geral de energia do seu dispositivo são
Se o ciclo de trabalho estiver ativado (por exemplo, se a banda EU868 for usada), o cronômetro do ciclo de trabalho estará interrompendo o sono e dando avisos inesperados.
