Miniscope v2c

Tani dwukanałowy oscyloskop PC/USB z mikrokontrolerem STM32 (STM32F103C8T6).

2012.07.28 Cena STM32F103C8T6 wynosi obecnie w kamami 25,79 zł - wzrosła o ponad 100% w stosunku do wcześniejszej, prawdopodobnie promocyjnej. AVT oferuje obecnie ten układ w korzystniejszej cenie 17 zł. W przypadku problemów z zaopatrzeniem firmware powinno być proste do przeniesienia na dowolny inny mikrokontroler STM32F1 z USB i minimum 20 kB RAM. Możliwe jest również (nie wykonywałem testów), że właściwości urządzenia (streaming w czasie rzeczywistym) udałoby się zachować również przy zmniejszeniu rozmiarów buforów ADC/USB które umożliwiłoby użycie mikrokontrolera z 10 kB RAM.

Przebiegi o niskiej amplitudzie (widoczna kwantyzacja) zarejestrowane w miniscope v4:

miniscope v4 + v2c

Całkowity koszt wykonania (jeżeli płytka zostanie wykonana własnoręcznie) powinien zamknąć się w kwocie 25 - 30 zł.

Schemat: miniscope_v2c_20120416.pdf

Płytka drukowana, Eagle, 66mm x 36mm
miniscope v2c PCB (Eagle)
miniscope v2c PCB photo
Złącze goldpin i przycisk BOOT używane są do ładowania programu.
miniscope v2c PCB photo
STM32F103C8T6 w obudowie LQFP48.
STM32F103C8T6

Pliki Eagle

IDE

Komunikacja USB bazuje - podobnie jak przy miniscope v2b - na przykładzie CDC. Przykłady STM32 dostarczane są z plikami projektów dla środowisk IAR, Keil, RIDE, HiTOP i TrueSTUDIO, ale żadne z tych środowisk nie wydało mi się optymalne. Ewaluacyjne wersje RIDE i HiTOP posiadają restrykcyjne licencje (odpowiednio: wymóg zakupu pakietu wsparcia po 7 dniach i brak możliwości użycia komercyjnego). IAR/Keil evaluation/lite nie posiadają takich obostrzeń, ale podobnie jak TrueSTUDIO ich wersje instalacyjne posiadają przesadnie duże jak na mały projekt wymagania dyskowe (do 3 GB) nie umożliwiając rezygnacji z instalacji zbytecznych komponentów (wsparcia dla dziesiątek innych rodzin mikrokontrolerów).

Z powyższych względów projekt korzysta ze środowiska CooCox - instalator 115 MB dla IDE + gcc, około ~800 MB przestrzeni dyskowej po instalacji, brak ograniczeń licencyjnych.

Ładowanie programu

Dla uproszczenia wzoru i zmniejszenia rozmiarów na płytce drukowanej nie zostały umieszczone wyprowadzenia JTAG/SWD. Jedyną (ale wystarczającą choć nieco uciążliwą na etapie tworzenia programu i debugowania) metodą ładowania programu jest użycie bootloadera UART (wyprowadzone na płytce RX, TX, masa). Przejście w tryb wbudowanego bootloadera następuje gdy przy wciśniętym przycisku BOOT wciśnięty zostanie na chwilę przycisk RESET. Loader PC (STM "Flash Loader Demo") pracuje bez problemów z konwerterami USB-UART. Piny RX/TX związane z bootloaderem tolerują napięcie 5V, można użyć przejściówki RS232-UART/USB-UART na napięcie 3,3V lub 5V.
Testowy projekt sterujący buzzerem: stm32scopeTest.7z.

Modyfikacja CDC dla uzyskania wyższych szybkości transmisji

Przykład CDC konfiguruje dla endpointy bulk. Projekt źródłowy wymaga kilku modyfikacji dla uzyskania zadowalających prędkości transferu.

  1. Obniżenie wartości VCOMPORT_IN_FRAME_INTERVAL, w firmware użyta jest wartość = 2. Skutek tej zmiany bez połączenia z innymi jest raczej niewielki.
  2. Zwiększenie USART_RX_DATA_SIZE (tu: 8192 B = 2 x 4 kB) dla uzyskania możliwości przesłania zbliżonej do maksymalnej dla transferu bulk ilości danych w każdej ramce.
  3. Modyfikacja funkcji Handle_USBAsynchXfer: ignorowanie danych zgromadzonych w buforze USART_Rx_Buffer o ile bufor nie jest zapełniony co najmniej w połowie oraz żądania transmisji "okrągłych" ilości danych (tu: 4 kB).

Biblioteka PC nie różni się pod względem organizacji od v2a/v2b. Kilka/kilkanaście buforów odbiorczych o rozmiarze 4 kB jest zakolejkowanych przy użyciu funkcji usb_submit_async/usb_reap_async, bufory z danymi są przekazywane do GUI poprzez FIFO.

Firmware i biblioteka dll dla miniscope v4

Pierwsza wersja, NIE ZALECANA:
stm32scope_20120416.7z
miniscope_v2c_dll_20120416.7z

Duża ilość poprawek w kodzie biblioteki i firmware:
stm32scope_20120421.7z
miniscope_v2c_dll_20120421.7z

2012.04.28 FIXED: jeżeli trigger był w trybie continuous ale oscyloskop był zatrzymany (Run/Stop) pojedynczy trigger ręczny powodował działanie jak gdyby wciśnięty został Run:
miniscope_v2c_dll_20120428.7z

2012.04.29 Lepsze wykorzystanie dostępnych zasobów (dwa przetworniki ADC pracujące równocześnie, czas S/H zwiększony do 13,5 cykli pomimo zwiększenia szybkości próbkowania z 2x300 do 2x461 kSps):
stm32scope_20120429.7z
miniscope_v2c_dll_20120429.7z

2012.06.07 FIXED: brak dźwięku buzzera przy starcie (usuwane pętle opóźniające przy optymalizacji o3).
stm32scope_20120607.7z

2012.10.06 Dzięki Openmoko miniscope v2c uzyskał własną, unikalną parę identyfikatorów USB VID = 0x1d50, PID = 0x604f.
stm32scope_20121006.7z
miniscope_v2c_dll_20121006.7z

2012.12.16 Dodana biblioteka urządzenia skompilowana przy użyciu Code::Blocks/MinGW, stm32scope_cb.7z jako projekt referencyjny. Testowana tylko przez chwilę, poprzednia wersja biblioteki (projekt Turbo C++) powinna być preferowana.
2020.07.15 Zaktualizowany projekt Code::Blocks/MinGW: stm32scope_cb_20200714.7z. Najnowszy Code::Blocks 20 dystrybuowany jest z 64-bitową wersją MinGW i bez 32-bitowych bibliotek Windows - projekt wymaga Code::Blocks 16.

2013.09.16 Zaktualizowana biblioteka, miniscope_v2c_dll_20130916.7z:

2017.01.21 Zaktualizowana biblioteka, miniscope_v2c_dll_20170121.zip, - częściowa konfigurowalność bez konieczności kompilacji, zakresy wzmocnienia definiowane są w pliku JSON (miniscope_v2c_capabilities.cfg). Domyślna zawartość pliku, definiuje pojedynczy zakres (25.78 mV/bit czyli 6.6V/256 na bit):

{
   "Capabilities" : {
      "Coupling" : [ 1 ],
      "Sensitivity" : [ 0.02577999979257584 ]
   },
   "Other" : {
      "bitsPerSample" : 9,
      "signalInverted" : false,
      "signalOffset" : 0
   }
}    
    
Poniższy plik definiuje dwa dodatkowe zakresy (50 mV/bit i 100 mV/bit - przy braku odpowiadającego firmware opierać się to może tylko na ręcznym przełączniku), jest dostosowany do wzmacniacza odwracającego z zerem pośrodku skali (pomiar napięć dodatnich i ujemnych), używając formuły value = 127 - value dla próbek odebranych z urządzenia.
{
   "Capabilities" : {
      "Coupling" : [ 1, 2 ],
      "Sensitivity" : [ 0.02577999979257584, 0.05000000074505806, 0.1000000014901161 ]
   },
   "Other" : {
      "bitsPerSample" : 8,
      "signalInverted" : true,
      "signalOffset" : 127
   }
}    
    
Wskazane jest użycie edytora JSON.
W wersji tej uproszczone zostało również wyzwalanie zboczem (usunięte agresywne filtrowanie które powodowało brak wyzwalania przy niektórych sygnałach).

2019.08.10 Firmware jako projekt EmBitz: stm32scope_embitz_20190810.zip

2019.08.11 Zestaw firmware + dll z bazową częstotliwością próbkowania obniżoną do 292kSps (co wydaje się usuwać problemy z przepełnianiem FIFO przy transmisji USB skutkujące nieciągłością rejestracji): stm32scope_embitz_20190811.zip, miniscope_v2c_dll_20190811.zip.

Pliki sterownika (libusb-win32) są zawarte w archiwum dll ale użycie aplikacji Zadig jest prostsze, zwłaszcza w przypadku 64-bitowych systemów Win8/Win10:
Zadig on Windows 7
Uwaga: wybór sterownika do zainstalowania jest istotny - Zadig może zaproponować domyślnie WinUSB zamiast libusb-win32.
Aktualizacja 2024.07.04: przy instalacji na Win7 x64 użycie Zadiga 2.9 (aktualnej wersji) nie powiodło się - menedżer urządzeń wskazywał, że sterownik był niepodpisany. Problem został rozwiązany przez cofnięcie się do wersji Zadig 2.5 (jak na ilustracji powyżej).

Inne realizacje

Wersja PCB z LM1117 3,3V i kilkoma zmianami layoutu przygotowana przy użyciu oprogramowania Pulsonix, http://mritx.blogspot.com/2014/07/low-speed-dual-channel-pcusb.html. Autor: Quang Duy.

Tańsza alternatywa

Ze względu na bardzo niskie ceny gotowych mini-modułów z STM32F103C8T6 w chińskich serwisach zakup takiej płytki ($3-$3,50) może być tańszy niż wykonanie samodzielne (chyba że sam mikrokontroler również zostałby sprowadzony z Chin).

STM32F103C8T6 board