
"무선은 쉽게 만들었습니다!" - 저전력 Lorawan 응용 프로그램에서 펄스 계산 활성화

이 소프트웨어는 "있는 그대로"제공되며 자체 지원 및 자체 유지 보수의 길을 제공합니다.
이 저장소에는 클라이언트 제품 개발을 가속화하는 데 도움이되는 지원되지 않은 예제 코드가 포함되어 있습니다. 생산에 대해서는 검증되지 않거나 보안 최고 실습에 대해 감사하지 않습니다.
이 저장소는 지원되지 않지만 마이크로 칩은 커뮤니티 기여를 환영하며 모든 풀 레퍼스트는 저장소에 포함시키기 위해 고려됩니다.
LORA 포럼의 커뮤니티의 동료들과 상호 작용하십시오.
ASFV3에서 생성 된 Lorawan 응용 프로그램을 기반 으로이 샘플 코드는 장치가 대기 모드에 배치되는 동안 전력 효율적인 펄스 계산을 활성화하는 방법을 보여줍니다.
주요 응용 프로그램은 게이트웨이를 통해 카운터 값을 로라완 네트워크 제공 업체 클라우드로 전송하는 것으로 구성됩니다. 이 데모의 목적을 위해 사전 프로비저닝 된 보안 요소가있는 TTN 및 TTI가 사용되었습니다.
소프트웨어를 얻으려면 현재 리포를 클론/다운로드하십시오.
필수 : Sam R34 Xplained Pro 평가 키트를 구입하십시오

WLR089U0 Xplained Pro 평가 키트를 구입하십시오

필수 : LORA (R) 게이트웨이 구매 (예 : Things Industries의 예를 들어) 
선택 사항 : ATECC608A-TNGLORA 보안 요소 및 CryptoAuthentication UDFN 소켓 키트의 샘플 구매
Microchip Studio 7.0 IDE를 다운로드하여 설치하십시오.
Microchip Studio 7.0 IDE를 개설하십시오.
도구 -> 확장 및 업데이트 에서 ASFV3 (Advanced Software Framework) v3.49.1 릴리스 또는 상단 릴리스를 설치하십시오.
마이크로 칩 스튜디오를 다시 시작하십시오
Tera 용어와 같은 직렬 터미널 프로그램을 다운로드하여 설치하십시오.
SAM R34 전류 소비를 추출하려면 이사회는 아래 설명대로 구성해야합니다.

TTI 서버와 ATECC608A-TNGlora Secure 요소를 사용하는 경우 설정에 대해서는이 Repo를 참조하십시오.
WLR089 XPLAINED PRO는 응용 프로그램 코드를 사용하려면 하드웨어 수정이 필요합니다. 기본적으로 인덕터 L301 (10UH) 및 커패시터 C316 (100NF)은 WLR089 Xplained Pro에 장착되지 않습니다. 데모 애플리케이션을 사용하려면 모두 장착하고 Buck Converter를 활성 모드에서 기본 전압 조정기로 선택해야합니다.
자세한 내용은 WLR089 Xplained Pro 문서를 확인하십시오.



SAMR34/R35 장치에는 정확한 저전력 외부 및 내부 발진기가 있습니다. 다른 클록 도메인은 다른 주파수에서 실행되도록 독립적으로 구성 될 수있어 최적의 클록 주파수에서 각 주변 장치를 실행하여 전력 절약을 가능하게하여 전력 소비를 줄이면 CPU 주파수가 높을 수 있습니다.
SAM R34/R35 장치에는 유휴, 대기, 백업 및 오프의 4 가지 소프트웨어가 선택 가능한 수면 모드가 있습니다.
유휴 모드 에서는 CPU가 중지되고 다른 모든 기능은 계속 실행될 수 있습니다.
대기 모드 에서는 계속 실행되도록 선택된 시계를 제외한 모든 클럭 및 기능이 중지됩니다. 이 모드에서는 모든 램과 논리 내용이 유지됩니다. 이 장치는 몽유병을 지원하여 일부 주변 장치가 사전 정의 된 조건에 따라 수면에서 깨어날 수 있으므로 DMA 전송 및/또는 CPU와 같은 일부 내부 작업이 필요할 때만 깨어날 수 있습니다. 예를 들어, 임계 값이 교차되거나 결과가 준비된 경우. 이벤트 시스템은 동기 및 비동기 이벤트를 지원하여 주변 장치가 대기 모드에서도 이벤트를 수신, 반응 및 보낼 수 있습니다.
백업 모드 에서는 대부분의 논리 및 아날로그 셀이 전원이 꺼집니다. 사용할 수있는 기능은 거의 없습니다 (RTC, 백업 레지스터, 외부 핀의 깨우기).
내부 SPI 버스의 높은 임피던스가 전이성을 초래하므로 OFF 모드는 권장되지 않습니다.
SAM R34/R35 장치에는 2 개의 소프트웨어 선택 가능한 성능 수준 (PL0 및 PL2)이있어 사용자가 작동 주파수를 지원하는 가장 낮은 코어 전압 레벨을 확장 할 수 있습니다. 전류 소비, 특히 누출 소산을 더욱 최소화하기 위해 장치는 논리 상태를 유지하면서 일부 논리 영역을 끄기 위해 보유와 함께 전력 도메인 게이팅 기술을 사용합니다. 이 기술은 하드웨어로 완전히 처리됩니다.
MLS (Microchip Lorawan Stack)는 스택에 전원 관리 모듈 (PMM)을 제공합니다. MLS 위에서 실행되는 응용 프로그램은 PMM을 사용하여 유휴 시간 동안 전력을 절약하도록 선택할 수 있습니다. PMM은 유휴 상태에서 전력을 절약하는 것 외에도 거래 중에도 전력 소비를 줄이려고합니다. 전력 절약은 MCU를 사용 가능한 저전력 모드 중 하나로 전환하여 수행됩니다. 현재 PMM은 SAM R34 MCU에서만 지원되며 대기 또는 백업 수면 모드에서 구성 할 수 있습니다.
대기 모드 :
백업 모드 :
PMM은 매크로 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 클럭에서 클럭됩니다. 내부 32kHz Ultra 저전력 발진기를 RTC 클럭 소스가 가능하지만 다른 시계 설정이 필요합니다. XOSC32를 사용하면 성능이 향상되고 주파수 드리프트가 적고 안정성이 높아집니다.
대기 모드에서는 모듈의 runstdby (실행) 비트가 설정되거나 OnDemand 비트가 0으로 설정된 경우를 제외한 모든 클록 소스가 중지됩니다. 기본적으로 레귤레이터는 대기 수면 모드를 사용할 때 저전력 모드에서 작동합니다. 대기 모드에 들어가기 전에 전압 조정기에 과부하가되지 않도록 상당한 양의 클럭 및 주변 장치가 비활성화되어 있는지 확인해야합니다. 과부하를 피하려면 저전력 모드에서 내부 레귤레이터가 제공하는 총 전력 소비가 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 Family Product 데이터 시트를 참조하십시오. https://www.microchip.com/wwwproducts/en/atsaml21j18b
일반적으로 유량 센서는 운동 에너지를 회전에서 전기 디지털 신호로 변환합니다.
이 애플리케이션에서 SAM R34 장치는 대기 모드를 유지하면서 펄스 수를 계산합니다. 이벤트 시스템 (EVSYS) 기능 덕분에 SAM R34 장치 내에서 제공되는 기능 덕분에 기간간 통신을 가능하게하여 시스템의 CPU로드 및 전력 소비를 낮추는 데 도움이됩니다. CPU 대역폭을 사용하지 않고 주변 장치의 자율 제어를 허용하며 장기간 대기 모드로 유지할 수 있습니다.
일부 주변 장치는 소스 클록이 실행중인 대기 모드에서 계속 작동 할 수 있으며, 이는 TC (Timer Coun
이벤트 시스템은 다음 두 가지 이벤트 리소스로 구성됩니다.
현재 응용 프로그램에서 이벤트 시스템은 다음과 같이 구성되었습니다.

이 응용 프로그램은 펄스 소스에서 나오는 펄스를 계산하고 Lorawan 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는 OnDemand 비트를 가지고 있으므로 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로 현재 프로젝트를 열십시오
상단 메뉴에서 프로젝트 -> 속성으로 이동하십시오
보안 요소가 Sam R34 Xplained Pro 보드에 연결된 경우 매크로 CRYPTO_DEV_ENABLED 정의되어 있는지 확인하십시오. 도구 체인> ARM/GNU C 컴파일러> 기호를 선택하십시오

도구 설정에서 SWD 인터페이스를 사용하여 EDBG 디버거로 보드를 선택하십시오.


상단 메뉴에서 도구를 열어야합니다

DGI 제어판 아래에서 Samr34 Xplained Pro를 선택하고 Connect를 클릭하십시오.

준비가되면 "Power"인터페이스를 선택하고 시작을 클릭하여 보드에서 전원 분석을 시작하십시오.

데이터 영상화는 SAM R34 장치의 전력 소비를 표시하고 I/O 및 외부 온보드 칩 소비를 추상화해야합니다.
115200 bps, 8-Data 비트/No Parity/1- 스톱 비트로 구성된 Tera Tera 용어 UART 콘솔 오픈
SAM R34 Xplained Pro Board에서 "재설정"버튼을 누르려면 콘솔에 출력이 인쇄됩니다.
매크로 CRYPTO_DEV_ENABLED 가 정의되고 보안 요소가 Sam R34 Xplained Pro에 연결된 경우 :

매크로 CRYPTO_DEV_ENABLED 정의되지 않은 경우 lorawan_app.c 에서 하드 코딩 된 OTAA 자격 증명이 사용됩니다.

장치가 Lorawan 네트워크에 성공적으로 결합되면 응용 프로그램은 60 초마다 주기적으로 깨어나서 Lorawan 네트워크를 통해 업 링크 메시지를 전송합니다. 이 메시지는 카운터 값과 온도를 ° C 및 ° F로 캡슐화합니다.

활성 모드에서는 매번마다 장치는 변속기와 두 개의 리셉션 창을 발행합니다.

두 전송 사이에서 대기 모드의 전력 소비는 약 8UA입니다.

대기 모드에서는 CPU를 깨우지 않고 펄스 카운팅이 가능합니다.

SAM R34 데이터 시트와 비교하여 추가 UA 전류는 RF 스위치가 항상 현재 Xplained Pro Board 설계에서 전원을 켜야한다는 사실에 기인합니다.
WLR089U0 Xplained Pro Board를 사용하면 RF 스위치는 응용 프로그램에 의해 제어되며이를 개선하면 측정 된 현재 소비가 훨씬 낮습니다.
결과는 Lorawan Network Server 콘솔에서도 볼 수 있습니다.

클래스 A 장치의 경우; 대부분의 시간을 자고 있습니다. 장치가 무선 거래를 수행하지 않을 때 전원의 양을 고려하는 것이 중요합니다. 수면 시간 매개 변수가 긴 PMM을 사용하는 것은 모닝 업 이벤트 수를 줄이고 전반적인 전력 소비를 줄이는 것이 좋습니다. 장치의 전반적인 전력 소비를 최적화 할 때 고려해야 할 다른 요소는 다음과 같습니다.
듀티 사이클이 활성화 된 경우 (예 : EU868 대역이 사용되는 경우) 듀티주기 타이머는 수면을 방해하고 예상치 못한 모닝을 제공합니다.
