
"Nirkabel menjadi mudah!" - Mengaktifkan penghitungan pulsa pada aplikasi Lorawan daya rendah

Perangkat lunak ini disediakan "sebagaimana adanya" dan memberikan jalur untuk swadaya dan pemeliharaan diri.
Repositori ini berisi kode contoh yang tidak didukung yang dimaksudkan untuk membantu mempercepat pengembangan produk klien. Ini tidak divalidasi untuk produksi atau diaudit untuk praktik terbaik keamanan.
Perhatikan bahwa sementara repositori ini tidak didukung, kontribusi komunitas sambutan microchip, dan semua permintaan pull akan dipertimbangkan untuk dimasukkan ke dalam repositori.
Berinteraksi dengan rekan -rekan di komunitas di Lora Forum.
Berdasarkan aplikasi Lorawan yang dihasilkan dari ASFV3, kode sampel ini menunjukkan cara mengaktifkan penghitungan pulsa hemat daya saat perangkat ditempatkan dalam mode siaga, berguna untuk aplikasi bertenaga baterai yang digunakan dalam pengukuran pintar
Aplikasi utama terdiri dari mentransmisikan nilai penghitung ke cloud penyedia jaringan Lorawan melalui gateway. Untuk tujuan demo ini, TTN dan TTI dengan elemen aman yang telah disediakan telah digunakan.
Klon/unduh repo saat ini untuk mendapatkan perangkat lunak.
Harus: Membeli Sam R34 Xplained Pro Evaluation Kit

Beli Kit Evaluasi Pro WLR089U0 XPLained Pro

Harus: Membeli Gateway Lora (R) (misalnya dari Industri Things) 
Opsional: Beli sampel elemen aman atecc608a-tnglora dan cryptoauthentication udfn socket kit
Unduh dan instal IDE Microchip Studio 7.0.
Open Microchip Studio 7.0 IDE.
Dari Alat -> Ekstensi dan Pembaruan , Instal Advanced Software Framework (ASFV3) v3.49.1 Rilis atau rilis atas.
Restart Microchip Studio
Unduh dan instal program terminal serial seperti istilah Tera.
Untuk mengekstrak konsumsi arus SAM R34, papan perlu dikonfigurasi seperti yang dijelaskan di bawah ini:

Jika Anda menggunakan server TTI dan elemen aman ATECC608A-TNGLORA, lihat repo ini untuk pengaturan.
WLR089 Xplained Pro membutuhkan modifikasi perangkat keras untuk menggunakan kode aplikasi. Secara default induktor L301 (10UH) dan kapasitor C316 (100NF) tidak dipasang pada WLR089 Xplained Pro. Keduanya perlu dipasang untuk menggunakan aplikasi demo dan memilih Buck Converter sebagai regulator tegangan utama dalam mode aktif.
Lihatlah dokumentasi WLR089 Xplained Pro untuk lebih jelasnya.



Perangkat SAMR34/R35 memiliki osilator eksternal dan internal daya rendah yang akurat. Domain jam yang berbeda dapat dikonfigurasi secara independen untuk berjalan pada frekuensi yang berbeda, memungkinkan penghematan daya dengan menjalankan setiap periferal pada frekuensi clock optimalnya, sehingga mempertahankan frekuensi CPU yang tinggi sambil mengurangi konsumsi daya.
Perangkat SAM R34/R35 memiliki empat mode tidur yang dapat dipilih perangkat lunak: Idle, siaga, cadangan dan off.
Dalam mode idle , CPU dihentikan sementara semua fungsi lainnya mungkin terus berjalan.
Dalam mode siaga , semua jam dan fungsi dihentikan kecuali yang dipilih untuk terus berjalan. Dalam mode ini semua RAM dan konten logika dipertahankan. Perangkat ini mendukung Sleepwalking, yang memungkinkan beberapa periferal untuk bangun dari tidur berdasarkan kondisi yang telah ditentukan, sehingga memungkinkan beberapa operasi internal seperti transfer DMA dan/atau CPU untuk bangun hanya saat diperlukan; Misalnya, ketika ambang batas dilintasi, atau hasilnya sudah siap. Sistem acara mendukung peristiwa sinkron dan asinkron, memungkinkan periferal untuk menerima, bereaksi dan mengirim acara bahkan dalam mode siaga.
Dalam mode cadangan , sebagian besar sel logika dan analog dimatikan. Hanya beberapa fitur yang tersedia (RTC, register cadangan, bangun dari pin eksternal).
Mode off tidak disarankan, karena impedansi tinggi pada bus SPI internal menghasilkan metastabilitas.
Perangkat SAM R34/R35 memiliki dua tingkat kinerja yang dapat dipilih perangkat lunak (PL0 dan PL2) yang memungkinkan pengguna untuk mengukur tingkat tegangan inti terendah yang mendukung frekuensi operasi. Untuk lebih meminimalkan konsumsi saat ini, khususnya disipasi bocor, perangkat menggunakan teknik gating domain daya dengan retensi untuk mematikan beberapa area logika sambil menjaga keadaan logika mereka. Teknik ini sepenuhnya ditangani dalam perangkat keras.
Microchip Lorawan Stack (MLS) menyediakan modul manajemen daya (PMM) di tumpukan. Aplikasi yang berjalan di atas MLS dapat memilih untuk menggunakan PMM untuk menghemat daya selama waktu idle. Selain menghemat daya selama idle, PMM mencoba mengurangi konsumsi daya bahkan selama transaksi. Penghemat daya dilakukan dengan mengganti MCU ke salah satu mode berdaya rendah yang tersedia. Saat ini, PMM hanya didukung pada SAM R34 MCU dan dapat dikonfigurasi baik dalam mode tidur siaga atau cadangan.
Mode siaga:
Mode Cadangan:
PMM diaktifkan melalui makro CONF_PMM_ENABLE . Makro ini mengontrol penambahan dan penghapusan PMM dalam aplikasi dan di tumpukan. Setelah mengaktifkan fitur PMM dalam kode aplikasi, semua bagian kode yang terletak di antara bagian berikut akan dikompilasi dan dieksekusi:
#ifdef CONF_PMM_ENABLE
..
#endif
Aplikasi saat ini (file lorawan_app.c ) sudah mengimplementasikan semua kode yang diperlukan untuk menggunakan fitur PMM. Dan detail berikut diberikan untuk informasi.
Untuk menggunakan PMM dalam suatu aplikasi, diperlukan untuk memasukkan file header berikut:
#ifdef CONF_PMM_ENABLE
#include "pmm.h"
#include "conf_pmm.h"
#include "sleep_timer.h"
#include "sleep.h"
#endif
Secara default, waktu tidur aplikasi dikonfigurasi selama 30 detik dan dapat diubah ke nilai yang diinginkan. Waktu Permintaan Tidur Aplikasi dikonfigurasi oleh makro:
#define DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS 30000 // Sleep duration in ms
Tetapi durasi tidur harus berada dalam kisaran yang dapat diterima yang merupakan givin dalam tabel berikut.

Modul Timer Tidur harus diinisialisasi untuk mengaktifkan modul RTC:
#ifdef CONF_PMM_ENABLE
SleepTimerInit() ;
#endif
File rtc_count.h berisi sumber jam yang tersedia untuk modul 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
Untuk aplikasi ini, modul RTC akan dicatat dari jam 32kHz eksternal. Menggunakan osilator daya ultra rendah 32kHz internal sebagai sumber jam RTC dimungkinkan tetapi membutuhkan pengaturan clock yang berbeda. Menggunakan XOSC32 akan menghasilkan kinerja yang lebih baik, penyimpangan frekuensi yang lebih sedikit dan akibatnya stabilitas yang lebih tinggi.
Dalam mode siaga, semua sumber jam dihentikan, kecuali yang di mana bit runstdby (run in standby) untuk modul diatur atau bit ondemand diatur ke nol. Secara default regulator beroperasi dalam mode daya rendah saat menggunakan mode tidur siaga. Sebelum memasuki mode siaga, harus memastikan bahwa jumlah jam dan periferal yang signifikan dinonaktifkan, sehingga regulator tegangan tidak kelebihan beban. Untuk menghindari kelebihan beban, periferal harus dikonfigurasi sehingga total konsumsi daya yang dipasok oleh regulator internal dalam mode daya rendah harus kurang dari 50μA. Jika periferal yang diperlukan untuk berjalan dalam mode siaga mengkonsumsi lebih dari 50UA, regulator harus dikonfigurasi untuk beroperasi dalam mode normal, dan ini dapat dilakukan dari perangkat lunak dengan mengatur bit runstdby di sysctrl -> vreg.
Aplikasi menerapkan fungsi optimasi daya berikut yang memungkinkan manfaat dari arsitektur daya ultra-rendah dari perangkat 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 ;
}
Rujuk ke lembar data produk Sam L21 Family untuk detail lebih lanjut tentang arsitektur daya rendah mikrokontroler. https://www.microchip.com/wwwproducts/en/atsaml21j18b
Secara umum, sensor aliran mengubah energi kinetik dari rotasi menjadi sinyal digital listrik dalam bentuk pulsa.
Dalam aplikasi ini, perangkat SAM R34 menghitung jumlah pulsa saat tetap dalam mode siaga. Berkat fitur Sistem Acara (EVSYS) yang tersedia di dalam perangkat SAM R34 untuk memungkinkan komunikasi antar-pinggir sehingga membantu menurunkan beban CPU dan konsumsi daya sistem. Ini memungkinkan kontrol otonom periferal tanpa menggunakan bandwidth CPU dan dapat tetap dalam mode siaga untuk periode yang lebih lama.
Beberapa periferal dapat terus beroperasi dalam mode siaga, di mana jam sumber berjalan, dan ini adalah kasus penghitung timer (TC) atau penghitung timer untuk aplikasi kontrol (TCC).
Sistem acara terdiri dari dua sumber daya acara berikut:
Dalam aplikasi saat ini, sistem acara telah dikonfigurasi seperti di bawah ini.

Aplikasi ini bertujuan untuk menghitung pulsa yang berasal dari sumber pulsa dan untuk mentransmisikan protokol RF Lorawan.

Modul ExtInt8 (secara fisik terhubung ke tombol pengguna yang ada di papan) dikonfigurasi untuk menghasilkan acara ketika tombol SW0 ditekan. SW0 terhubung ke PA28, yang dapat menghasilkan interupsi pada 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) ;
}
Ini dialihkan ke timer/counter TC0 oleh Sistem Sistem Acara 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 dikonfigurasi untuk menambah penghitung 16-bit pada acara yang dihasilkan dari modul 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) ;
}
Karena TC memiliki bit OnDemand, itu meningkatkan sedikit konsumsi daya dalam mode siaga melawan modul TCC. Dalam conf_pulse_counter.h , dimungkinkan untuk memilih untuk menggunakan TC atau TCC sebagai penghitung. Keduanya dapat menghitung selama mode siaga.
#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
Buka proyek saat ini dengan Microchip Studio 7 IDE
Dari menu teratas, buka Project -> Properties
Jika elemen aman terhubung ke Sam R34 Xplained Pro Board, pastikan makro CRYPTO_DEV_ENABLED didefinisikan. Pilih Toolchain> Compiler ARM/GNU C> Simbol

Dari pengaturan alat, pilih papan Anda sebagai EDBG Debugger dengan antarmuka SWD


Dari menu atas, buka alat> visualisator data

Di bawah DGI Control Panel, pilih Samr34 Xplained Pro dan klik Connect

Saat siap, pilih antarmuka "Power" dan klik Mulai untuk memulai Power Analyze di papan tulis.

Data visualizer harus menampilkan konsumsi daya perangkat SAM R34 dan membuat abstraksi dari I/O dan konsumsi chip onboard eksternal.
Buka Tera Term Uart Console yang dikonfigurasi pada 115200 bps, bit 8-data/no parity/1-stop bit
Tekan tombol "Reset" pada papan Sam R34 Xplained Pro untuk melihat output yang dicetak ke konsol
Jika makro CRYPTO_DEV_ENABLED didefinisikan dan elemen yang aman terhubung ke sam r34 xplained pro konektor ext3:

Jika makro CRYPTO_DEV_ENABLED tidak didefinisikan, kredensial OTAA yang dikodekan keras di lorawan_app.c digunakan:

Ketika perangkat berhasil bergabung dengan jaringan Lorawan, aplikasi ini secara berkala akan terbangun setiap 60 detik dan mengirimkan pesan uplink melalui jaringan Lorawan. Pesan merangkum nilai penghitung dan suhu dalam ° C dan dalam ° F.

Dalam mode aktif, pada setiap bangun, perangkat akan mengeluarkan transmisi diikuti oleh dua jendela penerimaan.

Di antara dua transmisi, konsumsi daya dalam mode siaga adalah sekitar 8ua

Dalam mode siaga, penghitungan pulsa dimungkinkan tanpa membangunkan CPU.

Dibandingkan dengan lembar data SAM R34, arus UA tambahan adalah karena fakta sakelar RF selalu didukung dalam desain papan Pro Xplained saat ini.
Dengan WLR089U0 Xplained Pro Board, sakelar RF dikendalikan oleh aplikasi dan dengan peningkatan itu konsumsi saat ini diukur jauh lebih rendah.
Hasilnya dapat diamati di konsol server jaringan Lorawan juga.

Untuk perangkat Kelas A; yang paling sering tidur; Penting untuk mempertimbangkan jumlah daya ketika perangkat tidak melakukan transaksi radio. Menggunakan PMM dengan parameter waktu tidur yang lebih lama adalah praktik yang baik untuk mengurangi jumlah acara bangun dan mengurangi konsumsi daya secara keseluruhan. Faktor lain yang perlu dipertimbangkan saat Anda ingin mengoptimalkan konsumsi daya keseluruhan perangkat Anda
Jika siklus tugas diaktifkan (misalnya jika pita EU868 digunakan), timer siklus tugas mengganggu tidur dan memberikan bangun yang tidak terduga.
