środa, 18 września 2019

SI4463 - transciver RF firmy Silicon Labs - STANDBY mode (50nA)

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);

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
-------------------------------------
Nasz SI4463 król parkietu - 30 nA


Pozdrawiam
picmajster.blog@gmail.com

Linki :

SI4463 - datasheet 
SI4463 - strona producenta
SI4463 Standby - Project on GitHub

4 komentarze:

  1. Jaki jest max relatywnie długi zasięg?

    OdpowiedzUsuń
    Odpowiedzi
    1. Tu masz człeka , który robił jakieś testy zasięgu dla SI4463 : https://blog.zakkemble.net/si4463-radio-library-avr-arduino/
      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.

      Usuń
  2. Bardzo ciekawie to zostało opisane.

    OdpowiedzUsuń
  3. Cieszę się , że to co piszę kogoś zaciekawia :)

    OdpowiedzUsuń