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]
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]
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
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