LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
IoT

Półprzewodnikowy detektor piorunów AS3935 i Kinetis L (na płytce FRDM-KL25Z)

Tab. 2. Opis pól rejestrów układu AS3935

Skrócona nazwa pola w wybranym rejestrze układu AS3935 Pełna nazwa pola w wybranym rejestrze układu AS3935 Możliwe do ustawienia wartości
AFE_GB Wzmocnienie sygnału przez blok AFE Dwie wartości: dla pracy czujnika w pomieszczeniu ( indoor ) oraz w otwartej przestrzeni ( outdoor )
PWD Tryb power-down Dwie wartości: włączony i wyłączony
NF_LEV Wartość progowa szumu sygnału Dziewięć wartości: od 28 do 146 ?Vrms dla trybu indoor oraz od 390 do 2000 dla trybu outdoor
WDTH Watchdog Szesnaście wartości (im wartość wyższa, tym układ jest mniej podatny na wykrywanie zakłóceń, ale jednocześnie mniej czuły na wykrywanie piorunów)
CL_STAT Wyzerowanie danych statystycznych Jedna wartość wymuszająca wyzerowanie danych statystycznych
MIN_NUM_LIGH Liczba wykrytych piorunów, która spowoduje zgłoszenie przerwania Cztery wartości: jedne piorun, pięć, dziewięć i szesnaście
SREJ Odporność na impulsy zakłóceń Szesnaście wartości (im wartość wyższa, tym układ jest mniej podatny na wykrywanie zakłóceń, ale jednocześnie mniej czuły na wykrywanie piorunów)
LCO_FDIV Dzielnik częstotliwości rezonansowej anteny Cztery wartości: 16, 32, 64, 128
MASK_DIST Konfiguracja zgłaszania przerwań będących efektem zakłóceń Dwie wartości: włącz i wyłącz
INT Źródło przerwania Trzy wartości: piorun, szum, zakłócenie
S_LIG_L Energia pioruna Wartość energii pioruna (jednostka: brak)
S_LIG_M Energia pioruna Wartość energii pioruna (jednostka: brak)
S_LIG_MM Energia pioruna Wartość energii pioruna (jednostka: brak)
DISTANCE Odległość do pioruna Wartość odległości pioruna do czujnika (jednostka: kilometry)
DISP_LCO Generowanie sygnału LCO Wygenerowanie na wyprowadzeniu IRQ sygnału o częstotliwości  sygnału zegarowego LCO
DISP_SRCO Generowanie sygnału SRCO Wygenerowanie na wyprowadzeniu IRQ sygnału o częstotliwości  sygnału zegarowego SRCO
DISP_TRCO Generowanie sygnału TRCO Wygenerowanie na wyprowadzeniu IRQ sygnału o częstotliwości  sygnału zegarowego TRCO
TUN_CAP Modyfikacja wartości pojemności obwodu antenowego Piętnaście wartości odpowiadających dodaniu pojemności do kondensatora zewnętrznego: od 0 do 120 pF (krok: 8 pF)

 

Oprócz zapisu i odczytu rejestrów, w układzie AS393 zaimplementowano obsługę dwóch tak zwanych komend bezpośrednich. Pierwszą komendą pozwala ustawić wartości domyślne wszystkich rejestrów. Komendę tą wywołuje się zapisać wartość 0x96 pod adres 0x3C pamięci układu AS3935. Druga komenda umożliwia wykonanie kalibracji zintegrowanych w AS3935 oscylatorów. Aby wywołać tą komendę, należy zapisać wartość 0x96 pod adres 0x3D pamięci układu AS3935.

 

Układ AS3935 – komunikacja I2C

W systemie demonstracyjnym do połączenia ze sobą układu AS3935 i mikrokontrolera Kinetis L wykorzystano interfejs I2C. Protokół komunikacyjny zaimplementowany w czujniku firmy Austria Microsystems pozwala na odczyt i zapis danych do rejestru(-ów). Chcąc zrealizować proces zapisu danych do czujnika mikrokontroler wysyła kolejno: bit startu (S), adres układu z najmniej znaczącym bitem o wartości 0 symbolizującej zapis do rejestru (DW), adres rejestru (WA), bajt danych przeznaczony dla tego rejestru (reg_data 1), opcjonalnie kolejne bajty (każdy zapisywany do rejestru o adresie większym o 1) i bit stopu (P). Układ AS3935 na większość z tych informacji odpowiada bitem potwierdzenia (A). Schemat zapisu danych pokazano na rysunku 5.

 

Rys. 5. Schemat zapisu danych do czujnika AS3935 przez interfejs I2C [1] 

Rys. 5. Schemat zapisu danych do czujnika AS3935 przez interfejs I2C [1]

 

Chcąc zrealizować proces odczytu danych z czujnika mikrokontroler wysyła kolejno: bit startu (S), adres układu z najmniej znaczącym bitem o wartości 0 symbolizującej zapis do rejestru (DW), adres rejestru (WA), drugi raz bit startu (Sr) oraz adres układu z najmniej znaczącym bitem o wartości 1 symbolizującej odczyt z rejestru (DR). W takt kolejnych informacji układ AS3935 odsyła potwierdzenia (A). Następnie to czujnik firmy Austria Microsystems rozpoczyna transmisję danych wysyłając zawartość rejestru o wskazanym adresie i kontynuując wysyłanie danych spod kolejnych adresów, dopóki mikrokontroler nie zaprzestanie wysyłania potwierdzeń (A). Proces odczytu danych kończy bit stopu (P), który wysyłany jest przez mikrokontroler. Schemat odczytu danych pokazano na rysunku 6.

 

Rys. 6. Schemat odczytu danych z czujnika AS3935 przez interfejs I2C [1] 

Rys. 6. Schemat odczytu danych z czujnika AS3935 przez interfejs I2C [1]

 

Opis wykonanej aplikacji

Schemat blokowy aplikacji przedstawiono na rysunku 7. Mikrokontroler Kinetis L swoje działanie rozpoczyna od skonfigurowania wewnętrznych zasobów sprzętowych, których użycie wymagane jest przez aplikację. Pierwszym zasobem jest interfejs komunikacyjny I2C, który służył będzie do komunikacji z czujnikiem AS3935. Mikrokontroler Kinetis L z płytki FRDM-KL25Z dysponuje dwoma takimi interfejsami. W tym przypadku użyty został interfejs o indeksie 0 (I2C0). Wyprowadzeniami wybranymi do realizacji transmisji danych przez ten interfejs są PTC8 (linia sygnału zegarowego) oraz PTC9 (linia danych). Drugi niezbędny do wykorzystania zasób sprzętowy to porty wejścia/wyjścia. Użyto ich w sumie cztery. Pierwszy z nich to PTB3. Jest on podłączony do linii przerwania czujnika AS3935. Trzy kolejne porty, mianowicie PTD1, PTB18 i PTB19 podłączone są do diod LED, odpowiednio o kolorze niebieskim, czerwonym i zielonym. Sterowanie diodami LED pełni funkcję sygnalizacyjną. Po zakończeniu konfiguracji interfejsu I2C i portów wejścia/wyjścia mikrokontroler przystępuje do skonfigurowania układu AS3935, a następnie rozpoczyna wykonywanie operacji w nieskończonej pętli. Monitorowany jest stan linii przerwania czujnika AS3935. Jeśli odczytany zostanie poziom wysoki, oznacza to zgłoszenie przerwania przez układ firmy Austria Microsystems. W tej sytuacji mikrokontroler realizuje odczyt rejestru spod adresu 0x03. Sprawdzane jest jego pole INT. W zależności od tej wartości jedna z diod LED zostanie na chwilę włączona. Jeśli pole INT będzie mieć wartość oznaczającą, że poziom szumu jest za wysoki, mikrokontroler zasygnalizuje to zamiganiem diodą o kolorze czerwonym. Jeśli pole INT przyjmie wartość odpowiednią dla zakłócenia, efektem będzie zamiganie przez mikrokontroler diodą zieloną. Z kolei gdy INT będzie mieć wartość przyporządkowaną do wykrycia pioruna, mikrokontroler zamiga diodą niebieską.

 

Rys. 7. Schemat blokowy programu 

Rys. 7. Schemat blokowy programu

 

Oprogramowanie implementujące powyższy schemat blokowy stworzone zostało przy użyciu środowiska programistycznego CodeWarrior firmy Freescale. Interfejs programistyczny do peryferiów (interfejsu I2C i portów wejścia/wyjścia) został wygenerowany przez zintegrowane w środowisku CodeWarrior narzędzie Processor Expert. Bazując na tym interfejsie napisane zostały dwie funkcje dedykowane czujnikowi AS3935: do odczytu rejestrów oraz zapisu rejestrów. Ich kod źródłowy pokazano na listingu 1.

 

List. 1. Kod źródłowy funkcji do odczytu i zapisu rejestrów układu AS3935

static bool Read_Sensor_Regs(LDD_TDeviceData *I2CPtr, TDataState *DataState, uint8_t Address, uint8_t RegCount, uint8_t *Buffer)
{
  LDD_I2C_TBusState BusState;
  DataState->Sent = FALSE;
  I2C_MasterSendBlock(I2CPtr, &Address, sizeof(Address), LDD_I2C_NO_SEND_STOP);
  while (!DataState->Sent) {}
  if (!DataState->Sent) {
    return FALSE;
  }
  DataState->Received = FALSE;
  I2C_MasterReceiveBlock(I2CPtr, Buffer, RegCount, LDD_I2C_SEND_STOP);
  while (!DataState->Received) {}
  do {I2C_CheckBus(I2CPtr, &BusState);}
  while (BusState != LDD_I2C_IDLE);
  if (!DataState->Received) {
    return FALSE;
  }
  return TRUE;
}

static bool Write_Sensor_Regs(LDD_TDeviceData *I2CPtr, TDataState *DataState, uint8_t Address, uint8_t Data)
{
  LDD_I2C_TBusState BusState;
  uint8_t SendBuffer[2];
    
  SendBuffer[0] = Address;
  SendBuffer[1] = Data;
    
  DataState->Sent = FALSE;
  I2C_MasterSendBlock(I2CPtr, &SendBuffer, 2U, LDD_I2C_SEND_STOP);
  while (!DataState->Sent) {}
  do {I2C_CheckBus(I2CPtr, &BusState);}
  while(BusState != LDD_I2C_IDLE); 
  if (!DataState->Sent) {
    return FALSE;
  }
  return TRUE;
}

 

Kod źródłowy funkcji main() pokazano na listingu 2. W pierwszej kolejności wywoływana jest funkcja PE_low_level_init(), w której włączane i konfigurowane są peryferia (zawartość tej funkcji wypełnia narzędzie Processor Expert zgodnie z ustawieniami wybranymi wcześniej przez użytkownika). Następnie realizowana jest konfiguracja układu AS3935. Obejmuje ona ustawienie wartości domyślnych we wszystkich rejestrach, dostrojenie obwodu antenowego poprzez dodanie pojemności o odpowiedniej wartości oraz kalibrację oscylatorów. Dane do czujnika są zapisywane przy użyciu dedykowanej funkcji Write_Sensor_Regs().  W nieskończonej pętli for() odczyt stanu linii przerwania czujnika wykonywany jest za pomocą funkcji Bit1_GetVal(), gdzie Bit1 to zadeklarowana w Processor Expert nazwa dla portu PTB3. Odczyt rejestru z polem INT realizowany jest przed dedykowaną funkcję Read_Sensor_Regs(). Włączanie i wyłączanie diod LED wykonywane jest poprzez funkcje Bit2_PutVal, Bit3_PutVal i Bit4_PutVal, gdzie Bit2, Bit3 i Bit4 to zadeklarowane w Processor Expert nazwy odpowiednio dla portów PTB18, PTB19 i PTD1.

 

List. 2. Kod źródłowy funkcji main() programu

int main(void)
{
  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  PE_low_level_init();
  /*** End of Processor Expert internal initialization.                    ***/

  I2C_DeviceData = I2C_Init(&DataState); 
  
  Bit2_PutVal(NULL,1);
  Bit3_PutVal(NULL,1);
  Bit4_PutVal(NULL,1);

  Write_Sensor_Regs(I2C_DeviceData, &DataState,0x3C, 0x96);  //set registers to default values  
  my_delay(100000);
  Write_Sensor_Regs(I2C_DeviceData, &DataState,0x08, 0x05);  //set capacitors
  my_delay(300000);
  Write_Sensor_Regs(I2C_DeviceData, &DataState,0x3D, 0x96);  //RC oscillators autocalibration
  my_delay(100000);

  for(;;)
  {
    AS3935_interrupt_line = Bit1_GetVal(NULL);
    if(AS3935_interrupt_line == 1)
    {
      my_delay(100000);
      Read_Sensor_Regs(I2C_DeviceData, &DataState, 0x03, 1U, &RegisterValue); 

      if((RegisterValue & 0x0F) == 1)
      {
          //noise detected        
        Bit2_PutVal(NULL,0);
        my_delay(10000);
        Bit2_PutVal (NULL,1);
        my_delay(10000);
      }

      if((RegisterValue & 0x0F) == 4)
      {
          //disturber detected       
        Bit3_PutVal(NULL,0);
        my_delay(10000);
        Bit3_PutVal(NULL,1);
        my_delay(10000);  
      }

      if((RegisterValue & 0x0F) == 8)
      {
          //lightning detected
        Bit4_PutVal(NULL,0);
        my_delay(10000);
        Bit4_PutVal(NULL,1);
        my_delay(10000);  
      }      
    }                 
  }
  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  #ifdef PEX_RTOS_START
    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of RTOS startup code.  ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;){}
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

 

Perspektywy rozwinięcia projektu

Celem autora było omówienie aspektów dotyczących implementacji programowej czujnika AS3935 w systemie. Z tego powodu zaprezentowany system składa się tylko z podstawowych elementów, zarówno w warstwie sprzętowej (moduł z czujnikiem oraz płytka z mikrokontrolerem), jak też programowej (tylko wykrywanie piorunów). Warto jednak zauważyć, że platforma ta w prosty sposób może zostać rozbudowana. Przykładowo system można doposażyć w wyświetlacz, na którym prezentowana może być odległość do czoła burzy i energia wykrytych piorunów. Inną wartą wykonania rzeczą jest zaimplementowanie prostego mechanizmu, który w trakcie działania układu optymalizowałby jego czułość. Mechanizm ten polegać mógłby na zliczaniu liczby przerwań dotyczących przekroczenia dopuszczalnego progowego poziomu szumu. Uzyskany wynik może służyć jako podstawa do zwiększenia lub zmniejszania tego poziomu jako parametru pracy układu.

Pojedyncze sztuki czujnika AS3935 można nabyć korzystając ze strony internetowej firmy Austria Microsystems. Tu również można zakupić zestaw AS3935 Demo Kit (link). Za globalną dystrybucję tych produktów odpowiada firma Future Electronics.

Literatura

[1] www.austriamicrosystems.com AS393 Franklin Lightning Sensor: Datasheet revision 1.2

SZYMON PANECKI urodził się 17 lutego 1985 roku w Milanówku. Tytuł inżyniera Elektroniki i Telekomunikacji, a następnie magistra inżyniera na Wydziale Elektroniki Politechniki Wrocławskiej uzyskał kolejno w roku 2008 i 2010. Ponadto tytuł inżyniera Informatyki na Wydziale Elektroniki Politechniki Wrocławskiej uzyskał w roku 2011. Szymon Panecki jest doświadczonym elektronikiem-konstruktorem, który w trakcie swojej zawodowej kariery koncentruje się na definiowaniu i projektowaniu (zarówno w warstwie sprzętowej jak i programowej) systemów wbudowanych opartych na mikrokontrolerach z rdzeniem ARM od różnych producentów, w tym przede wszystkim Infineon Technologies (rodzina XMC1000 i XMC4000), STMicroelectronics (STM32 i STR7), Freescale Semiconductor (Kinetis L) oraz Silicon Labs (EFM32 i Precision32). Obszarem jego szczególnego zainteresowania są systemy wykorzystujące czujniki środowiskowe (wilgotności, ciśnienia, temperatury) oraz przemysłowe i motoryzacyjne interfejsy komunikacyjne, głównie CAN. Szymon Panecki od wielu lat współpracuje z czasopismem "Elektronika Praktyczna" oraz portalem Mikrokontroler.pl, na łamach których publikuje liczne artykuły dotyczące swoich projektów, jak również nowości produktowych firm z branży półprzewodnikowej.