Interfejs DCMI w STM32: jak dołączyć kamerę CCD do mikrokontrolerów STM32F2 i STM32F4

Konfiguracja kamery

Do komunikacji z kamerą po magistrali I 2 C wykorzystywane są cztery funkcje:

Konfigurację parametrów obrazów wyjściowych i sposobu w jaki są one wykonywane można dokonać na wiele sposobów wykorzystując sterowniki obecne w SOC (co jest łatwiejsze, ale nie pozwala poznać głębiej funkcjonowania kamery) lub też operując bezpośrednio na rejestrach. Tutaj zostały przedstawione podstawowe wiadomości na ten temat niezbędne do uzyskania żądanego obrazu drugą metodą. Aby była możliwa swobodna zmiana wartości rejestrów należy w pierwszej kolejności wyłączyć mikrokontroler przez wprowadzenie go w stan resetu (w nim są zaimplementowane sterowniki różnych funkcji jak np. autoekspozycja):

Matryca elementów światłoczułych (pixel array) znajdująca się w bloku jądra czujnika (sensor core) jest zbudowana z 1688 kolumn i 1256 wierszy (rysunek 8). Pierwsze 52 i ostatnie 4 kolumny oraz pierwsze i ostatnie 20 wierszy matrycy pikseli nie reagują na padające na nie światło (zawsze są optycznie interpretowane jako czarne) – wykorzystuje się je do automatycznej regulacji poziomu czerni.

Rys. 8. Matryca pikseli CCD

Rys. 8. Matryca pikseli CCD

 

W konfiguracji domyślnej generowany obraz ma rozdzielczość 1600 x 1200 pikseli (UXGA – Ultra Extended Graphics Array) i jest pobierany z matrycy począwszy od 28 wiersza i 60 kolumny. Zmianę pozycji i wymiarów ramki obrazu można dokonać za pomocą zapisu odpowiednich wartości do następujących rejestrów znajdujących się w banku 0 czujnika (Page 0 – Sensor Core):

Przy wypełnianiu tych rejestrów należy pamiętać, aby nie wchodzić w obszar czarnych pikseli oraz to, że minimalna wysokość obrazu wynosi 2 wiersze, a szerokość 9 (przy wykorzystaniu jednego ADC) oraz 17 (w trybie z dwoma ADC) kolumn.

Na matrycę czujnika jest nałożona siatka filtrów Bayera w wyniku obecności której każdy piksel jest czuły tylko na pewne spektrum światła i na wyjściu otrzymuje się intensywność jednego z trzech podstawowych kolorów (rysunek 9). Wiersze parzyste matrycy zawierają zielone i czerwone piksele, a nieparzyste – zielone i niebieskie. Podobnie jest dla kolumn, parzyste – zielone i niebieskie piksele, nieparzyste – zielone i czerwone piksele. Dlatego przy podawaniu numerów pierwszego wiersza i/lub kolumny obrazu należy się kierować zasadą „co drugi element”, czyli podawanie parzystych (lub nieparzystych w zależności od konfiguracji) numerów wierszy/kolumn. Istnieje również inny sposób polegający na przełączeniu bitów kolejności kolorowych pikseli:

Rys. 9. Układ pikseli RGB w matrycy CCD

Rys. 9. Układ pikseli RGB w matrycy CCD

 

Wyjściowe dane z bloku Color Pipeline mogą mieć format YUV lub RGB, a za wybór odpowiada 5 bit rejestru R0x08:1 (ustawiony – RGB, wyzerowany – YUV). Oprócz tego istnieje możliwość ustawienia czasu przetwarzania pikseli lub przesłony elektronicznej (Shutter Width). Im jej wartość jest większa, tym obraz będzie jaśniejszy, ale generowany z mniejszą częstotliwością:

Ponieważ wyświetlacz LCD może przedstawić obraz o maksymalnych wymiarach 320×240 pikseli, więc wyjściowy obraz z kamery również powinien mieć taką rozdzielczość. Można to zrobić modyfikują wyżej opisane rejestry, jednak wtedy pole widzenia będzie niewielkie. Alternatywny sposób polega na wykorzystaniu decymatora, czyli funkcji skalującej obraz do żądanych rozmiarów. Za jej włączenie odpowiada 8 bit rejestru R0x08:1, a parametry decymacji zapisuje się zgodnie z poniższym:

Waga decymacji jest wyznaczana ze wzoru:

Dodatkowo czujnik kamery udostępnia funkcje binningu oraz pomijania wierszy i kolumn. Pierwszy sposób zmniejszenia rozdzielczości polega na wyznaczeniu średniej wartości dla 4 pikseli o tym samym kolorze pobranych z kwadratowego obszaru i powinno się stosować raczej tą metodę, gdyż pomijanie wprowadza efekt aliasingu. Jednocześnie można wybrać tryb pracy z dwoma przetwornikami ADC w celu nie tylko skrócenia czasów przetwarzania obrazu z matrycy, ale również zwiększenia częstotliwości wysyłanych ramek o 2 razy:

Standardowo po włączeniu zasilania sygnał PIXCLK posiada częstotliwość dwa razy mniejszą niż wejściowy sygnał XCLK (pracuje tylko jeden przetwornik ADC). W przypadku gdy koniecznym jest zwiększenie lub zmniejszenie tej częstotliwości można wykorzystać podblok PLL wbudowany w blok jądra czujnika. Należy jednak pamiętać by zachowane były pewne warunki (tablica 4).

Tab. 4. Warunki stawiane sygnałom taktującym w systemie kamery

Tab. 4. Warunki stawiane sygnałom taktującym w systemie kamery

Również moduł DCMI mikrokontrolera wprowadza ograniczenie maksymalnej częstotliwości taktowania pikseli do 54 MHz. Uwzględniając powyższe informacje konfiguracja bloku PLL wygląda następująco:

Ostatecznie wszystkie powyższe ustawienia zostały zapisane w tablicy struktur wykorzystywanej w funkcji inicjalizującej MT9D111_Init():

 

Do pobrania

O autorze