Mój ulubiony moduł radiowy SI4463 jest mistrzem w trybach Power Saving. Dlatego jest doskonałym wyborem dla aplikacji bateryjnych. W najniższym dostępnym trybie Shutdown uzyskamy pobór prądu na poziomie 30 nA !!!. Czyli można by rzec, że ilość śladowa. W artykule podejmę się krótkiej retrospektywy trybów Power Saving dostępnych w module. Ze szczególnym uwzględnieniem trybu STANDBY, który wydaje się być idealnym trybem z punktu widzenia poboru prądu i czasu pobudki.
Moduł radiowy SI4463 firmy Silicon Labs zachwycił mnie nie tylko aspektami Power Saving ale również parametrami toru radiowego i elastycznością w konfiguracji ramki radiowej. Moduł ten jest w/g mnie świetnym wyborem jeśli szukamy elastycznego w konfiguracji modułu z pewną transmisją radiową na relatywnie długie dystanse.
Na początek przyjrzyjmy się wszystkim dostępnym trybom Power Saving w naszym module radiowym :
W zasadzie w praktyce jeśli chodzi o usypianie modułu interesują nas tylko trzy pierwsze tryby czyli Shutdown, Standby, Sleep. I o nich pokrótce napiszę.
Shutdown :
Ten tryb jest najbardziej atrakcyjny z punktu poboru prądu ,mamy tutaj prąd rzędu 30 nA. Zauważmy jednak, że czas przejścia do trybu RX lub TX to aż 15 ms. Jeśli chcemy zbudować sieć z większej ilości usypialnych modułów i synchronizować wymianę danych w jednostce czasu to tryb Shutdown wydaje się być nieprzydatny. W trybie tym nie są zapamiętywane stany rejestrów , WUT nie działa i zegar wewnętrzny 32kHz jest wyłączony, SPI również. Aby wejść w ten tryb wystarczy tylko podać stan wysoki na pin SDN modułu. Usypia się bardzo szybko ale po zdjęciu stanu wysokiego z SDN, moduł się restartuje i trzeba przeprowadzić od początku całą procedurę inicjalizacji rejestrów.
Standby :
Ten tryb jest idealnym wyborem jeśli chodzi o pobór prądu na poziomie 50 nA i czas powrotu do trybu RX lub TX na poziomie 440 us. W tym trybie musimy sami wyłączyć zegar 32kHz RC i WUT, jeśli wcześniej w trybie inicjalizacji zostało to włączone. Wszystkie rejestry są zapamietane a SPI jest aktywne. Aby wejść w ten tryb trzeba przesłać do modułu właściwość (Property) o nazwie CHANGE_STATE z argumentem 0x01 :
Widzimy, że argument w postaci bajtu 0x01 dotyczy również trybu SLEEP. W tryb SLEEP wejdziemy jeśli generator RC 32kHz i WUT będą włączone a jeśli będą wyłączone to jesteśmy w trybie Standby.
Poniżej podaję wszystkie warunki jakie trzeba spełnić aby wejść poprawnie w tryb Standby :
- 32kHz OFF
- WUT OFF
- GPIO0...2 - jeśli używamy jako wejścia to po stronie MCU podciągnąć je jako Pull Up.
- IRQ - po stronie MCU podciągnąć je jako Pull Up.
Bardzo ważne jest aby przed samym wywołaniem trybu Standby , wywołać komendę GET_INT_STATUS, która oprócz tego, że odczytuje statusy eventów modułu radiowego to czyści flagi eventów i ustawia pin IRQ w stan wysoki. I właśnie to ustawienie pinu IRQ jest tutaj kluczowe dla trybu Standby. Gdyby pin IRQ został w stanie niskim przed wywołaniem trybu Standby to nie zobaczymy poboru prądu na poziomie 50 nA ale znacznie większym. Poniżej podaję jak powinno wyglądać wywołanie w programie trybu Standby :
/*STANDBY Mode 50 nA*/
SI4463_OFF_32kHz(); //OFF 32k Oscillator RC
SI4463_OFF_WUT(); //OFF WUT (Wake Up Time)
SI4463_Get_Interrupt(inter_buff); //get interrupt status and clear, interrupt, must be before SLEEP
SI4463_Change_State(SLEEP);
SI4463_OFF_32kHz(); //OFF 32k Oscillator RC
SI4463_OFF_WUT(); //OFF WUT (Wake Up Time)
SI4463_Get_Interrupt(inter_buff); //get interrupt status and clear, interrupt, must be before SLEEP
SI4463_Change_State(SLEEP);
Powyższe funkcje trzeba sobie zaimplementować w programie. Aby wyjść z tego trybu należy dokonać jakiejś transmisji po SPI. Może to być np komenda wysłania danych etc.
Dokonałem pomiaru prądu w trybie Standby miernikiem VA21 z najniższą dostępną skalą 4000 uA . Niestety nie mam na razie innego miernika. Miernik wyświetlił mi zerowy pobór prądu w tym trybie :). Czyli zmierzona wartość była poza percepcją skali pomiaru mojego miernika.
Sleep :
W tym trybie uzyskamy 900 nA i czas powrotu do RX lub TX na poziomie takim samym jak w trybie Standby. czyli 440 uA. W trybie tym zyskujemy możliwość zastosowania WUT, czyli skorzystania z mechanizmu wybudzania automatycznego za pomocą timera taktowanego zegarem RC 32kHz. Mamy tu zatem włączony zegar RC 32kHz i WUT. Wejście w ten tryb wygląda identycznie jak w trybie SLEEP musimy tylko pamietać o włączeniu zegara RC 32kHz i WUT.
/*SLEEP Mode 900 nA*/
SI4463_ON_32kHz(); //ON 32k Oscillator RC
SI4463_ON_WUT(); //ON WUT (Wake Up Time)
SI4463_Get_Interrupt(inter_buff); //get interrupt status and clear, interrupt, must be before SLEEP
SI4463_Change_State(SLEEP);
Nie badałem fizycznie tego trybu.
Pozostałe tryby to już tryby robocze, można nimi modelować pobór prądu ale już na wyższym pułapie. Dla ciekawości podczas nadawania w trybie TX z mocą +5dB prąd był na poziomie 3 mA, uważam , że to bardzo doby wynik. Tym bardziej , że ta moc pokrywała mi duży piętrowy budynek. Ale tutaj nie tylko moc jest kluczowym aspektem ale również konfiguracja toru radiowego.
Na koniec załączam program napisany w IDE SEGGERA dla mojej płytki developerskiej z ATSAML10E16A. Ale tak naprawdę program można z łatwością przekonwertować do dowolnego MCU. W programie mamy biblioteki do obsługi SI4463 i dla LCD ILI9341 .
Po uruchomieniu moduł wprowadzamy w tryb STANDBY , mamy ok 7 s na pomiar prądu w tym trybie, po upływie tego czasu moduł zacznie nadawać cyklicznie co 300 ms pakiety z danymi (ilość wysłanych pakietów w zmiennej licznik) a daną jest tekst "DATA".
Projekt z GitHub ściągamy lokalnie na dysk za pomocą komendy (Linux w konsoli):
git clone https://github.com/PICmajster/ATSAML10_SI4463_STANDBY.git
i dodajemy w środowisku SEGGER za pomocą opcji File --> Open Solution
Zerknąłem jak wygląda aspekt Power Saving w popularnych na naszym rynku modułach radiowych , weźmy przykłady :
- RFM69 - 100 nA
- CC1101 - 200 nA
- RFM95 - 200 nA
- RFM12B - 300 nA
- nRF24L01 - 900 nA
Zerknąłem jak wygląda aspekt Power Saving w popularnych na naszym rynku modułach radiowych , weźmy przykłady :
- RFM69 - 100 nA
- CC1101 - 200 nA
- RFM95 - 200 nA
- RFM12B - 300 nA
- nRF24L01 - 900 nA
-------------------------------------
Nasz SI4463 król parkietu - 30 nA
Linki :
SI4463 - datasheet
SI4463 - strona producenta
SI4463 Standby - Project on GitHubNasz SI4463 król parkietu - 30 nA
Pozdrawiam
picmajster.blog@gmail.com
picmajster.blog@gmail.com
Linki :
SI4463 - datasheet
SI4463 - strona producenta
Jaki jest max relatywnie długi zasięg?
OdpowiedzUsuńTu masz człeka , który robił jakieś testy zasięgu dla SI4463 : https://blog.zakkemble.net/si4463-radio-library-avr-arduino/
UsuńJak widzimy poziom 2 km jest bez problemu w zasięgu możliwości modułu a nawet więcej. Zasięg jednak zależy od wielu czynników w tym zysk anteny, szybkość transmisji, konfiguracja toru radiowego no i propagacja fal w terenie.
Bardzo ciekawie to zostało opisane.
OdpowiedzUsuńCieszę się , że to co piszę kogoś zaciekawia :)
OdpowiedzUsuń