[PROJEKT] Rejestrator sygnałów analogowych na STM32 – jednokanałowy oscyloskop USB
Jako platformę sprzętową do realizacji prezentowanej aplikacji wybrałem zestaw ZL31ARM, który jest oparty na mikrokontrolerze STM32F103RB posiadającym 12-bitowy przetwornik A/D, kontroler DMA, 16-bitowy timer oraz port USB. Niestety ta ostatnia funkcja nie została uwzględniona w zestawie, co powoduje, że należy podłączyć kilka dodatkowych elementów na płytce stykowej.
Realizacja takiego rejestratora wiąże się z pewnymi utrudnieniami o których warto napisać. Po pierwsze aplikacja PC powinna pobierać komplet próbek i wyświetlać przebieg z częstotliwością, która jest odbierana jako płynna przez oko ludzkie, a z drugiej strony powinna ona być taka, aby urządzenie-rejestrator zdążyło wykonać pełny cykl pomiarów. Stąd też wybrano częstotliwość 20 Hz, co z punktu widzenia funkcjonalności daje okno 50 ms w którym powinien się zmieścić proces pomiarowy. Dla pewności w działaniu urządzenia warto przyjąć 25 ms jako maksymalny czas wykonania pomiarów.
Druga sprawa dotyczy czasu przetwarzania pojedynczej próbki, a w przypadku przetwornika A/D wybranego mikrokontrolera wynosi on co najmniej 1 us. Mniejszy czas próbkowania wiąże się z pogorszeniem pomiarów i mniejszą ich zgodnością z wartościami rzeczywistymi. Dlatego, gdy próbki będą pobierane w większej skali czasowej czas próbkowania przetwornika A/D będzie ustawiony na najwyższy, jaki spełnia wymagania okna pomiarowego, a gdy skala czasowa będzie mała to czas próbkowania będzie minimalny, czyli 1–2 us.
Również zakres próbkowanych napięć jest ograniczony do 3,3 V, ale gdy ważnym jest tylko podejrzenie jak mniej więcej przebiega sygnał o napięciu wyższym, np. 10 V to można zbudować najprostszy rezystorowy dzielnik napięcia, który na wyjściu pozwoli otrzymać zalecane napięcie do 3,3 V, ale co prawda taki przebieg sygnału zniekształcony.
Pierwszym etapem w realizacji projektu było dodanie obsługi portu USB, aby umożliwić budowanemu układowi komunikację z aplikacją na komputerze. W tym celu zostało wykorzystane gotowe rozwiązanie w postaci biblioteki USB oraz gotowych projektów realizacji różnych klas urządzeń USB takich jak CDC i HID, które można znaleźć w archiwum STM32F10x and STM32L1xx USB full-speeddevicelibrary v3.4.0 [1]. Z pośród kilku takich projektów został wybrany projekt wirtualnego portu COM urządzenia klasy CDC ze względu na dwie charakterystyczne cechy. Po pierwsze urządzenie tej klasy umożliwia transmisję danych z większą prędkością i większym rozmiarem pakietów danych w porównaniu do klasy HID, a po drugie jest łatwiejsze w realizacji i dość popularne. Jednak występuje tutaj niewielkie utrudnienie, gdyż aby takie urządzenie działało poprawnie po podłączeniu do portu USB komputera niezbędnym jest napisanie właściwego sterownika i umieszczenie go w systemie operacyjnym – dotyczy to systemów Windows, natomiast w przypadku Linuksa problem ten nie występuje i urządzenie po podłączeniu jest gotowe do pracy.
Aplikacja PC była stworzona w środowisku QtCreator w języku C++ i ważnym było dokonanie wyboru API umożliwiającego komunikację przez port USB komputera. Z myślą o zaprojektowaniu uniwersalnej aplikacji, która po skompilowaniu będzie działała zarówno w systemie Windows jak i w Linux wybrano rozwiązanie w postaci biblioteki libusb. W czasie tworzenia projektu dostępne były wersje biblioteki: 0.1 dla Windows oraz Linux i 1.0 tylko dla Linux [2]. Projekt oparto na bibliotece libusb-win32 w systemie Windows [3], ale w razie potrzeby przeportowanie aplikacji na Linux i ewentualnie na nowszą i lepiej dopracowaną wersję biblioteki 1.0 nie powinno sprawić wielu problemów.
Rys. 1. Schemat podłączenia mikrokontrolera STM32 oraz diod (zestaw ZL31ARM)
Schemat elektryczny połączeń linii komunikacyjnych portu USB mikrokontrolera STM32 przedstawiono na poniższych rysunkach.
Rys. 2. Schemat podłączenia USB (połączenia zewnętrzne)
Gotowy projekt wirtualnego portu COM jest przeznaczony do wykorzystania jako interfejs między komputerem z portem USB, a urządzeniem posiadającym port USART, jednak na potrzeby tworzonego urządzenia-rejestratora zostanie on zmodyfikowany. Po otwarciu pliku projektuVirtualCOMPort.uvproj z katalogu Project\Virtual_COM_Port\MDK-ARM pobranej biblioteki USB została wybrana platforma STM3210B-EVAL posiadająca mikrokontroler STM32F103VB, który jest praktycznie podobny do tego jaki znajduje się w zestawie ZL31ARM. Stąd też w okienku Options for Target ‘STM3210B-EVAL’ wystarczy zmienićdocelowy mikrokontroler na STM32F103RB.
Rys. 3. Przykładowe ścieżki dostępu w IncludePaths
Praktycznie taki sam procesor sprawia, że zaprogramowanie nawet gotowego projektu wirtualnego portu COM z niewielką niezbędną pozwoli uzyskać gotowe do pracy urządzenie po podłączeniu do portu USB komputera. Dalej w zakładce Debug należy wybraćUse ST-Link (Deprecated Version) i to samo w zakładce Utilities, gdzie występuje pole Use Target Driver for Flash Programming. Przykładowe ścieżki do plików źródłowych pokazano na rysunku 3.
Rys. 4. Struktura projektu