Opisywane urządzenie jest układem pomiarowym pracującym w dwóch trybach. Pierwszy tryb to pomiar rezystancji wewnętrznej źródeł napięcia stałego lub zmiennego. Przykładowo można badać rezystancję wewnętrzną baterii lub akumulatorków, co pomoże oszacować stopień rozładowania i będzie ciekawym ćwiczeniem. Innym, bardzo ważnym zastosowaniem jest pomiar wyjściowej i wejściowej rezystancji wewnętrznej filtrów, tłumików, wzmacniaczy i generatorów. Jest to bardzo ważny aspekt związany z tak zwanym dopasowaniem impedancyjnym.
W przypadku rezystancji wyjściowej generatorów sytuacja jest o tyle ciekawa, że możemy wykonywać pomiary dla różnych częstotliwości i włączać w obwód mierzony inne elementy, np. cewki, kondensatory lub bardziej złożone układy jak filtry czy tłumiki. Drugi tryb to pomiar rezystancji obciążenia (wejściowej), jaką ma każdy stopień wejściowy, czy to wzmacniacza, czy filtru, czy jeszcze innego urządzenia.
Aby wykonać taki pomiar, miernik musi być wpięty pomiędzy źródło sygnału a układ mierzony. Dodatkowo miernik wyświetla napięcie panujące na wejściu w sposób ciągły. Zakres mierzonego napięcia to 0–9V. Układ zbudowany jest z tanich i łatwo dostępnych elementów.
Opis układu - miernik rezystancji wewnętrznej
Najlepszym sposobem na zrozumienie działania układu jest analiza uproszczonego modelu przedstawionego na rysunku 1. Źródło sygnału G, czy to napięcia stałego, czy zmiennego, zawiera „wbudowaną” rezystancję wewnętrzną, którą oznaczmy Z. Rezystancja ta może wynikać z niedoskonałości samego źródła lub jest celowo wprowadzana. I właśnie tę rezystancję Z chcemy zmierzyć. Najczęściej w rzeczywistości nie ma rezystora Z.
Pomiar jest prosty. W szereg włączamy rezystor o znanej wartości R i włącznik W. Potem wykonujemy dwa pomiary napięcia w punkcie A. Pierwszy pomiar następuje przy rozwartym W, czyli bez obciążenia. Mierzymy wtedy napięcie „własne” (lub amplitudę w przypadku sygnałów zmiennych), które oznaczmy Ug. Rezystancja Z nie odgrywa znaczącej roli przy tym pomiarze, ponieważ prąd płynący jest pomijalnie mały (bardzo duża rezystancja woltomierza w stosunku do wartości Z).
Następnie zwieramy W i znowu mierzymy napięcie w punkcie A – spadek napięcia na R, co oznaczmy Ur. Wzór na rezystancję wewnętrzną: Z = R * (Ug – Ur) / Ur. Opisywany miernik rezystancji przeprowadzi te kroki automatycznie, zwalniając nas z ręcznych pomiarów i obliczeń.
Rysunek 2 pomoże zrozumieć drugi tryb pracy. Aby wykonać pomiar rezystancji wejściowej Z danego urządzenia, musimy dysponować generatorem lub innym źródłem napięcia G, który dostarczy sygnał o interesujących nas parametrach. Parametry dobieramy sami, pamiętając, że wyniki mogą się różnić w zależności od np. częstotliwości. Pomiędzy generator a układ badany włączony jest rezystor o znanej wartości R.
Pomiar polega na zmierzeniu dwóch napięć w punktach A i B. Niech to będą odpowiednio Ua i Ub. To wystarczy, aby obliczyć wartość Z ze wzoru Z = R * Ub / (Ua – Ub). Warto zauważyć, że rezystancja wewnętrzna użytego źródła napięcia G nie ma znaczenia dla pomiaru.
Analizując schemat ideowy, pokazany na rysunku 3, można wyróżnić trzy bloki. Pierwszy składa się z dwóch rezystorów R1 i R2 będących bocznikami pomiarowymi wraz z towarzyszącymi przekaźnikami K1 i K2. Przekaźniki służą do ustawiania potrzebnej konfiguracji i automatycznego doboru bocznika pomiarowego. Przekaźniki bardzo dobrze się spisują jako elementy przełączające tor analogowy, ponieważ działają niemal z każdym typem sygnałów i nie wprowadzają zniekształceń lub przekłamań.
Boczniki pomiarowe to nic innego jak rezystor R z wcześniejszej analizy. Kolejnym blokiem jest tor pomiarowy, a w zasadzie dwa identyczne tory pomiarowe, które pełnią funkcję woltomierzy. W pierwszej kolejności sygnał mierzony jest podawany na prostownik jednopołówkowy D1 (D8) a następnie zostaje naładowany kondensator C3 (C6). Wartość napięcia, jaka się ustali na kondensatorze, będzie odpowiadać wartości szczytowej sygnału mierzonego (pomijając niewielki spadek napięcia na D1).
Warto zwrócić uwagę na tranzystor Q2 (Q4), który służy do rozładowania kondensatora przed pomiarem. Procesem tym steruje mikrokontroler.
Zgromadzony ładunek na kondensatorze można by teoretycznie podać na wejście mikrokontrolera celem pomiaru wartości napięcia, ale spowodowałoby to nadmierne obciążenie wejścia, co skutkowałoby większym błędem pomiaru. Rozwiązaniem tego problemu jest wtórnik oparty na wzmacniaczu operacyjnym U2A (U2B).
Wejście wtórnika praktycznie nie obciąża źródła sygnału i na wyjściu otrzymujemy takie samo napięcie (z dokładnością do napięcia niezrównoważenia wzmacniacza operacyjnego) bez względu na obciążenie wyjścia. Sygnał jest podawany na dzielnik napięcia, który jest załączany przez tranzystor Q5 (Q6) w razie potrzeby. Dzielnik taki jest potrzebny, jeśli chcemy mierzyć napięcia wyższe niż 3,3V, co jest naturalnym ograniczeniem zastosowanego mikrokontrolera STM32F103.
Można zapytać, czemu nie zastosować dzielnika na stałe, bez tranzystorów sterujących. Otóż takie rozwiązanie ma jedną wadę, a mianowicie im większy zakres pomiarowy, tym większy byłby błąd pomiaru. Wynika to z zasady działania przetwornika analogowo-cyfrowego, 12-bitowego w tym przypadku. Im większy zakres pomiarowy, tym większa odległość pomiędzy sąsiednimi stanami („schodkami”), a tym samym mniejsza dokładność.
Jeśli możemy, to mierzymy na podstawowym zakresie 0–3,3V (dokładniejszy pomiar), a tylko przy wyższych napięciach korzystamy z dodatkowego dzielnika napięcia. Wartości rezystorów są tak dobrane, aby zakres pomiarowy sygnału wejściowego wynosił od 0V do 9V.
Trzeci i zarazem ostatni blok steruje całym miernikiem. Jest to serce układu – mikrokontroler STM32F103. Tutaj odbywa się zamiana sygnału analogowego na cyfrowy, niezbędne obliczenia, korekta błędów i wyświetlenie wyniku na wyświetlaczu. Wykorzystany jest tu moduł Blue Pill, który dobrze jest znany w świecie Arduino.
Moduł ten zawiera wszystkie elementy potrzebne do prawidłowego funkcjonowania mikrokontrolera, jak na przykład zewnętrzny kwarc, zworki przydatne przy programowaniu układu, stabilizator 3,3V no i sam mikrokontroler. Przy tym jest szalenie tani, a oferuje ogromne możliwości. Sam program nie został napisany w środowisku Arduino, tylko w czystym C i jest dostępny na github (https://github.com/rrowniak/impedance_meter). Można również tam znaleźć pliki dokumentacji płytki drukowanej (Gerber + projekt KiCad v4). Do wygenerowania szablonu projektu i skonfigurowania peryferii został użyty nieoceniony STM32CubeMX.
Jest to układ pomiarowy, więc warto wspomnieć o zakresie mierzonych rezystancji, błędzie pomiaru i zakresie częstotliwości. Bardzo dobre wyniki osiągamy, mierząc wartości rezystancji do ok. 10kΩ, szacunkowy błąd pomiaru nie przekracza wtedy 5%. Jednak aby osiągnąć dobre rezultaty, należy wykonać procedurę kalibracji opisaną dalej.
Dokładne oszacowanie błędu pomiaru jest bardzo trudne, ponieważ w grę wchodzi wiele czynników, jak na przykład błąd wprowadzany przez przetwornik analogowo-cyfrowy, obciążenie sygnału mierzonego przez miernik, błędy wprowadzane przez poszczególne stopnie układu pomiarowego. W przypadku pomiaru sygnałów zmiennych sytuacja komplikuje się jeszcze bardziej. Bardzo duży błąd pomiarowy uzyskamy, mierząc sygnały o małej częstotliwości.
Wynika to stąd, że czas pomiędzy sąsiednimi pomiarami został ustalony na 10ms. Więc okres sygnału mierzonego nie może być większy niż 10ms, co daje minimalną częstotliwość na poziomie 100Hz. Można ten czas zmienić i tym samym zmniejszyć minimalną częstotliwość sygnału mierzonego. Powyżej częstotliwości minimalnej osiągamy bardzo dobre rezultaty. Jednak wraz ze wzrostem częstotliwości rośnie błąd pomiarowy. Podczas mierzenia sygnałów o częstotliwości 3MHz błąd pomiarowy był na poziomie ok. 10%. Dla 9MHz błąd wyniósł już ponad 60%.
Montaż i uruchomienie miernika rezystancji wewnętrznej
Układ można zmontować na płytce drukowanej, która pokazana jest na rysunku 4 oraz na fotografiach. Montaż urządzenia nie jest skomplikowany. Jedynie należy pamiętać o poprawnym wlutowaniu modułu Blue Pill z mikrokontrolerem STM32F103, aby nie pomylić stron. Warto również zastosować rezystory 1% w torze pomiarowym. Widoczne diody D4, D5, D6 i D7 miały za zadanie zabezpieczać wejście mikrokontrolera przed podaniem zbyt wysokiego napięcia.
Jednak takie rozwiązanie wprowadza błąd pomiaru w torze, ponieważ dioda Zenera zaczyna przewodzić już nieco poniżej progu przebicia – zrezygnowałem z tego zabezpieczenia. Dodatkowo należy ustawić kontrast wyświetlacza potencjometrem RV1.
Aby zaprogramować układ, należy zaopatrzyć się konwerter USB - UART (np. CP2102) i zainstalować darmowy program stm32flash. Potem należy zworkę BOOT 0 ustawić na 1 i połączyć konwerter z modułem według schematu GND-G, VCC-5V, TXD-A10, RXD-A9 lub skorzystać z dedykowanego złącza P4. Kolejny krok to wgranie samego wsadu, na systemie Linux (Ubuntu i pochodne) można to zrobić następującą komendą:
sudo stm32flash -w build/impedance_meter.hex -v -g 0x0 /dev/ttyUSB0
gdzie ostatni argument wskazuje na urządzenie konwertera widziane w systemie. Gdy cała procedura zakończy się sukcesem, należy ustawić zworkę BOOT 0 na pozycję 0 i zrobić restart urządzenia. Następny etap to kalibracja. Jest to proces wymagający wprowadzenia pewnych wartości w kodzie źródłowym. Pierwszym krokiem będzie podanie dokładnych wartości rezystorów R1, R2, R6, R8, R9 i R10. Pomiaru najlepiej dokonać dobrej jakości multimetrem.
Można również zaktualizować wartość napięcia odniesienia, jeśli jest inne niż 3,3V. Zmian dokonujemy w pliku firmware/Inc/measure.h. Kolejnym krokiem będzie modyfikacja mapy kompensacji błędów. Jest to krok opcjonalny i możemy zrezygnować z tej metody, ustawiając definicję MEASURE_ERROR_COMPENSATION na zero, zrobimy to w pliku firmware/Inc/error_compensation.h.
Jeśli jednak chcemy skorzystać z tej metody opartej na interpolacji liniowej musimy zajrzeć do pliku firmware/Src/error_compensation.c. Jest tam tablica (observed) wartości napięć wyświetlanych przez nieskalibrowany przyrząd i odpowiadających im wartości zmierzonych precyzyjnym woltomierzem. Skok może być dowolny. Im więcej wartości w tablicy, tym większa dokładność. Ten sposób kompensacji przynosi bardzo dobre efekty, więc warto go wykonać. Sam kod można skompilować w darmowym kompilatorze gcc dla architektury ARM (gcc GNU Tools for ARM Embedded Processors), używając programu make.
Istnieją możliwości rozszerzenia oprogramowania bez konieczności zmian samej elektroniki. Myślałem nad dodaniem pomiarów w decybelach, co pozwoliłoby mierzyć np. poziom tłumienia. Również byłaby to pewna alternatywa dla paradoksalnie absurdalnych wyników, jak „ujemne omy”, które możemy zaobserwować podczas eksperymentów z sygnałami wysokiej częstotliwości, gdzie włączenie bocznika ~50 powoduje dobre dopasowanie impedancyjne przewodów sygnałowych, dając tym samym wyższą amplitudę, niż ma to miejsce, kiedy obwód jest otwarty.