Obsługa kamery cyfrowej CCD za pomocą mikrokontrolera STM32F4

Obsługa kamery cyfrowej CCD za pomocą mikrokontrolera STM32F4

 

Przedstawiamy prostą aplikację na mikrokontroler STM32F4 obsługującą kamerę modCAM_2MP_2 i wyświetlacz modTFT32T, które podłączono do zestawu ZL41ARM. Dodatkowo dodano także obsługę komunikacji z komputerem PC przez port USB, dzięki czemu można łatwo konfigurować parametry kamery z poziomu aplikacji i obserwować efekty w czasie rzeczywistym bez konieczności programowania mikrokontrolera.

 

Schemat elektryczny

Schemat elektryczny przedstawiający sposób podłączenia modułu z kamerą oraz wyświetlacza LCD z panelem dotykowym do komputera jednopłytkowego z mikrokontrolerem STM32F417VG przedstawiono na rysunku 1 (pozostała część schematu znajduje się w dokumentacji zestawu ZL41ARM). Obecność dużej liczby połączeń powoduje, że w czasie pracy układu mogą występować w nich zakłócenia mające wpływ zarówno na odbierane dane z kamery jak i wysyłane do wyświetlacza. Jednym ze sposobów ich zmniejszenia jest przeplatanka przewodów połączeniowych jak widać na fotografii 1. Również ważnym jest aby chronić tylną część kamery przed światłem, gdyż w przeciwnym wypadku obraz może być w pewnych miejscach nieprawidłowy (inny kolor, dziwne piksele) lub prześwietlony.

 

Rys. 1. Schemat elektryczny podłączenia kamery i wyświetlacza 

Rys. 1. Schemat elektryczny podłączenia kamery i wyświetlacza

 

Do zasilania kamery potrzebne jest napięcie maksymalnie 3 V (na płytce komputera występuje napięcie 3,3 V), dlatego został wykorzystany zewnętrzny stabilizator LM2950. Dodatkowo linie D+ oraz D- z gniazdka USB typu mini A zostały na stałe połączone z odpowiednimi wyprowadzeniami mikrokontrolera poprzez przylutowanie cienkich przewodów, ponieważ fabrycznie takich połączeń nie ma (w tabeli 1 przedstawiono jak to zostało zrobione). Interfejs USB pracuje w trybie Full Speed i nie jest wymaganym umieszczanie zewnętrznego rezystora podciągającego na linii D+ (jest on wbudowany w mikrokontroler).

Tab. 1. Opis zewnętrznych wyprowadzeń gniazdka USB typu mini A

Numer Oznaczenie Opis
1 VCC Napięcie zasilania +5 V
2 D- Linia transmisji danych podłączona do nóżki PA11 mikrokontrolera
3 D+ Linia transmisji danych podłączona do nóżki PA12 mikrokontrolera
4 NC Nie podłączone
5 GND Masa

Moduł wyświetlacza modTFT32T posiada kolorowy wyświetlacz z rozdzielczością 240RGBx320 pikseli sterowany przez kontroler SSD1289 oraz panel dotykowy obsługiwany przez kontroler ADS7843. Do komunikacji z kontrolerem SSD1289 wykorzystuje się interfejs równoległy typu (Intel) 8080 w którym transmisja odbywa się asynchronicznie i który posiada następujące linie sterujące/danych:

  • linia wyboru chipu – CS,
  • linia wyboru rejestru/pamięci RAM – RS,
  • linia wyboru trybu zapisu – nWS,
  • linia wyboru trybu odczytu – nRD,
  • linia sygnału zerującego – nRESET,
  • 16-bitowa szyna danych – D0:D15.

Do poprawnej pracy wyświetlacza oprócz zasilania podawanego na wejścia +5 V <–> GND wymagane jest jeszcze włączenie podświetlenia LED: BLVDD(+5 V) <–> BLGND(GND). Brak podświetlenia uniemożliwia zobaczenie jakichkolwiek efektów zapisu do pamięci GDDRAM (Graphics Display Data RAM). Komunikacja z kontrolerem wyświetlacza odbywa się za pośrednictwem kontrolera FSMC (Flexible Static Memory Controller) przeznaczonym do zapisu/odczytu do/z zewnętrznych pamięci takich jak pamięć SRAM lub FLASH, a także do obsługi wyświetlaczy z interfejsem równoległym zgodnym ze standardem 6800 lub i8080.

 

 Rys. 2. Podłączenie wyświetlacza do FSMC

Rys. 2. Podłączenie wyświetlacza do FSMC

 

Komunikacja z komputerem przez USB

Gotowy projekt obsługi komunikacji z wykorzystaniem portu USB został skopiowany z pliku archiwalnego o nazwie STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library (wersja 2.1.0), który jest dostępny na stronie producenta danego mikrokontrolera w zakładce Design support -> Firmware. Jest to projekt urządzenia realizującego funkcję wirtualnego portu COM (znajduje się w katalogu Project -> USB_Device_Examples -> VCP). Część projektu została zmodyfikowana na potrzeby komunikacji z prostą aplikacją PC i zostały dołączone pliki obsługi wyświetlacza LCD minimalnie zmodyfikowane do pracy z kontrolerem SSD1289 (również dostępne w powyższym pliku archiwalnym).

Komunikacja między aplikacją PC, a układem ZL41ARM sprowadza się do zapisu/odczytu rejestrów/zmiennych sterownika kamery, a funkcje które to umożliwiają po stronie mikrokontrolera znajdują się w pliku usbd_cdc_vcp.c:

Funkcja VCP_DataRx() jest wywoływana automatycznie za każdym razem jak tylko zostały odebrane nowe dane z portu USB komputera i wykonywane jest w niej przetworzenie rodzaju komendy (zapis/odczyt, rejestr/zmienna) oraz jej argumentów (adres, dane). Natomiast funkcja VCP_DataTx() jest wywoływana jawnie w celu przekopiowania danych do endpointa IN urządzenia, w wyniku czego zostaną one wysłane do komputera.

 

Wyświetlacz LCD

Konfiguracja linii GPIO związanych z układem FSMC i do których jest podłączony wyświetlacz wygląda następująco (plik PeripheralsConfig.c):

Konfiguracja parametrów komunikacji z zewnętrzną pamięcią typu SRAM (plik LCD.c):

Natomiast inicjalizacja wyświetlacza polega na zapisaniu szeregu wartości do odpowiednich rejestrów i można ją znaleźć w tym samym pliku w funkcji LCD_Init()(szczegóły w dokumentacji kontrolera SSD1289).

W projekcie dodano również obsługę dotknięcia panelu dotykowego jako prostej metody interakcji z użytkownikiem. Informację o tym zdarzeniu dostarcza sygnał na linii TP_IRQ – jeżeli jej stan odpowiada logicznemu zeru to panel dotykowy jest dotknięty (dowolne miejsce), a jeżeli logicznej jedynce to panel nie jest dotknięty. Konfiguracja linii mikrokontrolera do której ten sygnał jest dostarczany wygląda następująco:

Konfiguracja przerwania zewnętrznego generowanego na zboczu narastającym i opadającym:

Obsługa zewnętrznego przerwania w funkcji EXTI15_10_IRQHandler():

oraz związane z tym funkcje w pliku main.c:


Krótka charakterystyka kamery MT9D111

W projekcie wykorzystano moduł z 2-megapikselową kamerą posiadającą czujnik obrazu kolorowego MT9D111 z matrycą typu CMOS (fotografia 5). System jaki jest zintegrowany w tym czujniku (SOC, system-on-a-chip) umożliwia łatwe konfigurowanie bogatej listy parametrów oraz oferuje wiele funkcji, jakie są dostępne w fotograficznych aparatach cyfrowych, takie jak ożywianie, korekcja kolorów, korekcja gammy, automatyczny balans bieli, automatyczna ekspozycja oraz wiele innych pozwalających uzyskać zdjęcia możliwie wysokiej jakości.

 

 Fot. 3. Moduł z kamerą MT9D111

Fot. 3. Moduł z kamerą MT9D111

 

Strukturę blokową systemu SOC przedstawiono na rysunku 4, można w niej wyróżnić cztery najważniejsze elementy: jądro czujnika (Sensor Core), zaawansowany procesor obrazów przepływu (IFP, Image Flow Processor), koder JPEG czasu rzeczywistego oraz mikrokontroler (MCU). Zarejestrowany obraz z matrycy CMOS należącej do jądra czujnika przepływa (gruba biała strzałka) przez poszczególne bloki systemu SOC, w których jest poddawany kolejnym etapom obróbki, a jedną z cech charakterystycznych systemu jest możliwość wybrania bloku z którego dane obrazu będą wysyłane na wyjście modułu. Natomiast sterowanie pracą poszczególnych elementów systemu odbywa się za pomocą wewnętrznej szyny (Internal Register Bus).

 

Rys. 4. Schemat blokowy systemu SOC 

Rys. 4. Schemat blokowy systemu SOC

 

Wybrany moduł z kamerą jest wyposażony w szeregowy interfejs sterujący oraz równoległy interfejs danych wideo z sygnałami synchronizującymi. Na rysunku 5 pokazano rozmieszczenie sygnałów na płytce modułu, a tabela 2 zawiera szczegółowy ich opis. Do zasilania kamery zaleca się podanie 3 V, gdyż napięcia wyższe (nawet 3,3 V), jeśli nawet nie są tragiczne w skutkach, to mogą powodować grzanie się elementów kamery.

 

Rys. 5. Wyprowadzenia modułu z kamerą (widok od strony obiektywu kamery) 

Rys. 5. Wyprowadzenia modułu z kamerą (widok od strony obiektywu kamery)

 

Tab. 2. Opis wyprowadzeń modułu kamery

Nazwa wyprowadzenia Rodzaj wyprowadzenia Opis
VCC Power Napięcie zasilania kamery, max. 3,1 V
GND Ground Masa
SCL Input Linia zegarowa magistrali I2C
SDA Input/Output Linia danych magistrali I2C
VSYNC Output Sygnał synchronizujący (FrameValid); stan wysoki – aktywny
HREF Output Sygnał synch. (LineValid, DataValid, HSYNC); stan wysoki – aktywny
PCLK Output Wyjściowy sygnał zegarowy taktujący kolejne piksele obrazu
XCLK Input Wejściowy sygnał zegarowy
D7-D0 Output 8-bitowa szyna danych wyjściowych
STANDBY Input Linia sterująca trybem standby
DRIVER_IN Output Sygnał PWM pochodzący z czujnika kamery
DRIVER_EN Input VCM (Voice Coil Motor) driving Voltage from Driver

Sposób w jaki ramki wideo są wysyłane przez synchroniczny interfejs równoległy jest łatwy w zrozumieniu. Każdy obraz generowany przez kamerę posiada określoną szerokość oraz wysokość i niech będzie to wymiar 320 x 240 pikseli (matryca pikseli o wymiarach 320 kolumn na 240 wierszy). Do opisu pojedynczego piksela obrazu potrzebnych jest zazwyczaj dwa bajty (np. w formacie RGB565), a szyna danych jest 8-bitowa, a więc aby przesłać jedną całkowitą ramkę obrazu wideo z kamery potrzebnych jest 76 800 x 2 = 153 600 taktów sygnału zegarowego PIXCLK. Oprócz sygnału zegarowego i 8-bitowej szyny danych występują jeszcze dwa sygnały synchronizujące, VSYNC (lub Frame_Valid) oraz HSYNC (lub Line_Valid). Pierwszy sygnał będąc w stanie aktywnym (wysoki poziom napięcia) informuje odbiornik, że w danej chwili jest wysyłana ramka obrazu, ale dopiero drugi sygnał ostatecznie określa czy kolejne bajty na szynie danych powinny być odczytywane przy narastającym zboczu sygnału PIXCLK (lub opadającym w zależności od konfiguracji, rysunek 6 ).

 

 Rys. 6. Przebiegi czasowe sygnałów interfejsu danych wideo

Rys. 6. Przebiegi czasowe sygnałów interfejsu danych wideo

 

Czas trwania stanu aktywnego linii Line_Valid jest określony przez okres sygnału PIXCLK oraz liczbę kolumn wyjściowej matrycy pikseli razy dwa. W konkretnym przypadku, jeżeli częstotliwość wyjściowego sygnału zegarowego wynosi 25 MHz (okres = 40 ns), to przesłanie 320 pikseli (640 bajtów) jednego wiersza zajmie 25,6 us, a ponieważ wierszy w matrycy jest 240 to przesłanie całej ramki zajmie 6,144 ms. W rzeczywistości jednak pomiędzy stanem aktywnym zarówno sygnału Line_Valid jak i Frame_Valid występują przedziały czasowe zwane Horizontal Blanking oraz Vertical Blanking odpowiednio. Służą one nie tylko po to by zmniejszyć częstotliwość wychodzących z kamery ramek obrazu, ale również dają pewien okres czasu na przetworzenie przez czujnik danych z matrycy CMOS. Stąd też proces odczytu ramki wideo obrazowo można przedstawić jako czytanie właściwych danych oraz odczekiwanie przez okres w którym trwa Horizontal lub Vertical Blanking (rysunek 7).

 

Rys. 7. Odczyt obrazu z kamery 

Rys. 7. Odczyt obrazu z kamery

 

Interfejs sterujący kamery jest podobny do interfejsu I2C i umożliwia dostęp do wszystkich rejestrów związanych z poszczególnymi blokami SOC. Adresy układu podrzędnego kamery jakie należy podawać przy transmisji po szynie I2C zestawiono w tabeli 3 i w danym konkretnym przypadku modułu będą to adresy 0xBA (zapis) oraz 0xBB (odczyt). Za adresem jest przesyłany numer  rejestru (jeden bajt), który ma być zapisany/odczytany po czym mogą iść dane (dwa bajty).

Tab. 3 Adresy układu podrzędnego kamery

Tab. 3 Adresy układu podrzędnego kamery

W systemie SOC do konfiguracji i sterowania pracą kamery udostępniane są:

  • rejestry,
  • zmienne sterowników,
  • rejestry specjalnego przeznaczenia,
  • pamięć SRAM mikrokontrolera.

Rejestry są podzielone na 3 banki (pierwszy jest związany z blokiem jądra czujnika, drugi z blokiem Color Pipeline, a trzeci z JPEG i FIFO), a przełączanie się między nimi odbywa się poprzez zapis do rejestru 0xF0 (występuje we wszystkich bankach) numeru docelowego banku.

Zmienne również są podzielone według realizowanych funkcji i przypisane do odpowiednich sterowników. Aby uzyskać do nich dostęp wykorzystuje się rejestr R198 (rejestr adresu) oraz R200 (rejestr danych) w banku 1. W rejestrze adresu podawany jest ID sterownika, względne położenie zmiennej w strukturze oraz jej rozmiar. Przykładowo, aby zapisać (odczytać) do zmiennej ae.Target wartość 50 należy do rejestru adresu wpisać wartość 0xA206, a do rejestru danych wartość 50 (lub odczytać ten rejestr), ponieważ:

  • zmienna znajduje się w sterowniku, ID którego wynosi 2 –> R198:1[12:8] = 2,
  • zmienna jest przesunięta w strukturze o 6 bajtów –> R198:1[7:0] = 6,
  • wykonywany jest logiczny dostęp do zmiennej –> R198:1[14:13] = 01,
  • rozmiar zmiennej wynosi 8 bitów –> R198:1[15] = 1.

 

Konfiguracja interfejsu DCMI

Pierwszą czynnością jaką należy wykonać jest włączenie sygnałów taktujących porty GPIO, moduł DCMI oraz kontroler DMA:

Dalej może być umieszczona konfiguracja przerwań od wybranych zdarzeń generowanych przez moduł DCMI:

Następnie należy skonfigurować odpowiednie linie portów GPIO oraz przypisać im funkcję alternatywną związaną z modułem DCMI:

W tym miejscu należy również skonfigurować linię PA8 za pomocą której zostanie wyprowadzony na zewnątrz mikrokontrolera sygnał taktujący potrzebny do poprawnego działania czujnika kamery (podawany na wejście XCLK). Sygnał ten może pochodzić z zewnętrznego generatora szybkich przebiegów HSE (8MHz), albo też można wykorzystać systemowy zegar z pętli PLL po zmniejszeniu jego częstotliwości:

Częstotliwość 56 MHz wynika z tego, że systemowy sygnał zegarowy posiada częstotliwość 168 MHz i jest on przepuszczony przez preskaler o wartości 3.

Właściwa konfiguracja modułu DCMI oraz kontrolera DMA wygląda następująco:

Pierwsze pole DCMI_CaptureMode struktury inicjującej wybiera tryb pracy układu DCMI i może przyjmować wartości:

  • DCMI_CaptureMode_Continuous – ciągły odbiór ramek obrazu (np. tryb podglądu),
  • DCMI_CaptureMode_ SnapShot – odbiór tylko jednej ramki obrazu (np. tryb wykonania zdjęcia).

Wartość pola DCMI_SynchroMode informuje układ o tym jaka metoda synchronizacji będzie wykorzystywana przy określaniu początku/końca ramki/linii obrazu:

  • DCMI_SynchroMode_Embedded – kody synchronizujące są przesyłane liniami danych,
  • DCMI_SynchroMode_Hardware – wykorzystanie oddzielnych linii synchronizujących HSYNC oraz VSYNC.

Następne pole DCMI_PCKPolarity wybiera aktywne zbocze sygnału taktującego kolejne bajty danych PIXCLK:

  • DCMI_PCKPolarity_Falling – pobieranie danych na zboczu opadającym,
  • DCMI_PCKPolarity_Rising – pobieranie danych na zboczu narastającym.

Kolejne dwa parametry DCMI_VSPolarity i DCMI_HSPolarity informują układ DCMI o stanach linii synchronizujących VSYNC oraz HSYNC, które powinny być rozumiane jako nieaktywne i w czasie trwania których dane na szynie DATA są nieprawidłowe.

Przedostatnie pole DCMI_CaptureRate przyjmuje jedną z następujących wartości:

  • DCMI_CaptureRate_All_Frame – wszystkie ramki będą przyjmowane,
  • DCMI_CaptureRate_1of2_Frame – każda druga ramka będzie przyjmowana,
  • DCMI_CaptureRate_1of4_Frame – każda czwarta ramka będzie przyjmowana.

Ostatnie pole wybiera rozdzielczość szyny danych interfejsu, która może być 8-, 10-, 12- i 14-bitowa. W danym przypadku moduł kamery udostępnia 8 linii danych, dlatego jest wybierany tryb 8-bitowy.

Kontroler DMA został skonfigurowany do pracy w roli transportera danych z 32-bitowego rejestru danych DCMI_DR do wewnętrznej pamięci wyświetlacza, która jest interpretowana przez układ jako zewnętrzna pamięć typu SRAM (dzięki interfejsowi FSMC). Transfer danych odbywa się kanałem 1 kontrolera DMA2, a ponieważ rejestr źródła i rejestr przeznaczenia nie mają takich samych rozmiarów, więc najpierw z rejestru DCMI_DR są przesyłane najmłodsze 16 bitów, a dopiero potem najstarsze 16 bitów. Natomiast sam rejestr danych jest zapełniany od najmniej do najbardziej znaczącego bajtu (od prawej do lewej),

Obsługa przerwań od układu DCMI znajduje się w pliku stm32f4xx_it.c i została w niej na wszelki wypadek umieszczona instrukcja ustawienia kursora w pozycji początkowej po odebraniu pełnej ramki obrazu co pozwoli uniknąć ewentualnego przesuwającego się obrazu na wyświetlaczu:

Aby rozpocząć przyjmowanie ramek obrazu należy włączyć układ DCMI oraz wydać stosowną komendę:

 

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:

wzor

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():

 

Główna pętla programu

W funkcji main(), po skonfigurowaniu wszystkich peryferii oraz wyświetlacza i kamery, wykonywana jest pętla while(), w której okresowo sprawdzane jest czy został dotknięty panel dotykowy i jeżeli tak to następuje przełączenie aktualnego ekran (wyświetlanej zawartości). Dostępnych jest 3 ekrany: informacyjny (wszelkie wiadomości tekstowe), podglądu obrazu z kamery oraz wykonanie zdjęcia (które może być zapisane na kartę SD – wymaganym jest dodanie odpowiedniego kodu obsługi).

 

Aplikacja PC

Podczas realizacji projektu była tworzona prosta aplikacja (rysunek 10) w środowisku QtCreator, umożliwiająca łatwą i szybką konfigurację parametrów kamery. Pozwoliła ona na łatwiejsze zrozumienie zależności działania kamery od wartości zapisywanych do rejestrów i zmiennych sterowników funkcji.

 

 Rys. 10. Prosta aplikacja konfigurująca kamerę

Rys. 10. Prosta aplikacja konfigurująca kamerę

 

System operacyjny może nie rozpoznać właściwie podłączonego układu do portu USB komputera i wtedy należy ze strony pobrać plik o nazwie libusb-win32-bin-1.2.6.0 i z katalogu bin uruchomić program inf-wizard pozwalający dodać potrzebny sterownik (na liście powinien być element o nazwie STMicroelectronics Virtual COM Port).

Jan Szemiet

Do pobrania

Autor: