Port WaveForms SDK na Pascal
SPI - Digital I/O i obsługa protokołów

część 6 (gratisik)

podstawowe informacje o urządzeniu i sterowanie zasilaczem
cykliczna akwizycja danych i histereza triggera
UART - Digital I/O i obsługa protokołów
I2C - Digital I/O i obsługa protokołów
SPI - Digital I/O i obsługa protokołów (mostek Wheatstone'a)
SPI - Digital I/O i obsługa protokołów (pomiar Iadj w LM317)
Digital I/O - ROM Mode, przerzutnik RS i dekoder do rosyjskiej VFD
Digital I/O - bezpośredni dostęp, wyświetlacz HDSP-2111 i termometr MCP9700
Analog OUT - woltomierz True RMS z przetwarzaniem sygnału

☘☘☘☘☘☘
nieco o pomiarze Iadj w LM317

A to w mocnym nawiązaniu do ostatniego odcinka (3-C) wieczornej pisanki o SPI i Analog Discovery 2 - oczywiście, można sobie wyobrazić zastosowanie kostki potencjometru MCP41HV51103 w układzie kontroli napięcia na bazie jakiegoś popularnego regulatora, zaraz zobaczymy.

Na pierwszy ogień wzięłam ogólnie znany regulator LM317 niepomna informacji z datasheet, że rezystory w dzielniku konfigurującym napięcie wyjściowe jakby rzędem wielkości odbiegają od tych 10kΩ mojego cyfrowego potencjometru i wszelkie kombinowanie i tak w efekcie da tak zwaną popelinę, a co mi tam! Ale faktycznie, układ był totalnie nieregulowalny, za to napotkałam ciekawostkę związaną z samą aplikacją LM317 i tytułowym prądem Iadj, no a skoro udało mi się to matematycznie ogarnąć - pokazuję co i jak.

Testowe poletko doświadczalne to fotografia poniżej:



I na niej właśnie widzimy pokazywany przez Meratronik V640 (IDC@0.15mA) prąd Iadj w kwocie 50uA, zgodnej z grubsza z dokumentacją kostki. Tylko przy okazji wyszło kwadratowe jajo w postaci takiej, że po włączeniu w nóżkę ADJ mikroamperomierza - zwiększyło mi się napięcie wyjściowe! Nieznacznie i nie jest to w sumie zaskakujące - w końcu rzeczywisty przyrząd pomiarowy w jakiś tam sposób wpływa na prace układu. No ale żeby tak mój cudny V640 zepsuł wyliczony regulator? To do wyjaśnienia zatem.

Schemat układu testowego jak na rysunku:



Rezystory zmierzone omomierzem w V543, wartości pewnie niosą błąd samego miernika, ale do obliczeń zawierzam im bezkrytycznie, a wynoszą odpowiednio: R1=284Ω i R2=1986Ω. Pomiary ze zwartym i aktywnym amperomierzem widzimy na zdjęciu (dwa od lewej):



No i oczywiście pada pytanie - dlaczego akurat tyle i co to ma wspólnego z parametrami miernika?

Moja teoria spiskowa brzmi następująco - napięcie Uref LM317 zsumowało się ze spadkiem napięcia na rezystancji amperomierza, takie `nowe` napięcie referencyjne, z pasożytniczą wkładką spowodowało zmianę napięcia wyjściowego. Dla załapania kontekstu wnętrze kostki LM317: ➮ http://www.ti.com/ds_dgm/images/fbd_slvs044x.gif , a obliczeniowo to będzie tak:

Uout=Uref(1+R2/R1)

Wyliczmy sobie z tego 'hipotetyczne' Uref z jakim pracuje nasz regulator. Tak, w katalogu podają średnią wartość 1.25V, ale ona i tak ma pewien rozrzut, zatem kalkulator w dłoń:

Uref=Uout/(1+R2/R1)

najpierw podstawiamy napięcie wyjściowe przy zwartym mikroamperomierzu i mamy (chwilowo po aptekarsku, zaokrąglać będziemy kiedyś, jak ocenimy skalę wielkości ):

Uref=10.171/(1+1986/284)=1.272V

A teraz wyliczmy Uref` czyli wartość która się zrobiła na skutek włączenia V640 w układ:

Uref`=10.295/(1+1986/284)=1.288V

Oooo, no proszę - rozjechało się jakby, zgodnie z oczekiwaniami, wyliczmy o ile:

ΔUref=Uref`-Uref=0.016V

Ojtam ojtam, raptem jakieś 16 mV i tyle krzyku. No ale zerknijmy teraz na dokumentację V640, co piszą o deklarowanym spadku napięcia na zaciskach miernika w trybie amperomierza i na interesującym nas zakresie. Strona 9, akapit "Pomiar prądów stałych i zmiennych" - dla 150uA jest to 50 mV. To dla maksymalnego wskazania dla zakresu oczywiście, zatem dla interesującego nas prądu 50uA będzie to 1/3 wartości czyli 50mV/3 czyli ... ~16mV. Tadam!
Taki właśnie spadek napięcia Ua wprowadził nam kolega wskazówkowy i on się jak widać uwikłał w równania. Na zdjęciu wyżej (pierwsze po prawo) mamy wskazywaną przez V543 wartość 15.5mV. To maleńkie wartości, plątanina kabelków też nie pomaga - ale widzimy, że rozumowanie ma chyba jakiś sens.

Aha, możemy przyjąć, że pomiar spadku napięcia na mikroamperomierzu nie wprowadził szkodliwego rozpływy prądów - rezystancja wewnętrzna neonowego V543 skutecznie przed tym broni. No i gdyby tak było, z chwilą pomiaru ruszyła by się wskazówka na V640, a nic takiego nie miało miejsca.

Weryfikacja tego spostrzeżenia już zupełnie dla ciekawości - a weźmy i zmierzmy ten prąd Iadj innym przyrządem. No to wyciągamy UM112 jako amperomierz na zakresie 0.1mA.



Jak widać odczyt już nie jest taki okrągły - 48uA, ale to i tak teraz detal - napięcie wyjściowego rozjechane jeszcze bardziej. Liczymy zatem, jak poprzednio:

Uref=10.170/(1+1986/284)=1.272V

a dla zepsutego Uout, z aktywnym miernikiem UM112:

Uref`=10.405/(1+1986/284)=1.302V

Ponownie delta:

ΔUref=Uref`-Uref=0.030V jako nasze hipotetyczne Ua.

I chwila prawdy: ➮ http://multimetry.tzok.eu/galeria/UM-112_1.jpg dla zakresu DC 0.1mA mamy podane 0.06V, a ponieważ operujemy wartością prądu w połowie zakresu to należy nam się wyliczone powyżej 30mV. Ot i całą filozofia, wszystko się spina idealnie. A na koniec fotka z pomiarów - pierwsza po prawo to spadek napięcia na zaciskach UM112.



Może ktoś zapyta, po jasną choinkę tak się podniecać takimi drobiazgami? W sumie można wzruszyć ramionami i lecieć dalej przez siebie, ale chyba warto wiedzieć jakie skutki uboczne niesie zapięcie przyrządu, szczególnie gdy pracujemy z tak małymi sygnałami. A jak widać konsekwencje podłączenia zupełnie biernego amperomierza typu UM112 są całkiem widoczne, skok napięcia wyjściowego o prawie 200mV w skali 10V daje tu do myślenia, a dziwadła trzeba zawsze sprawdzać. I wracamy do tematu głównego...

model zasilacza z ukladem UL7523

Głównego bohatera opowiastki - kostkę UL7523 naszej rodzimej produkcji CEMI widzimy na fotografii poniżej:



Układzik z wycyrklowanym na 10V napięciem wyjściowym widzimy na schemacie:



Kostka pracuje ze zredukowanym przez dzielnik R1/R2 napięciem referencyjnym, ustawiło się na jakieś 3V z grosikami, i to jest minimalne napięcie jakie będzie miał nasz regulator. Napięcie maksymalne aplikacji wynika ze wzorku:

Uout=Uref*(R6+R4+R5)/R6

gdzie R5 to nasz cyfrowy nibypotencjometr zaszyty w układzie U1.

Łatwo sobie zweryfikować, jakie wartości przyjmie napięcie wyjściowe, zależenie od położenia cyfrowego suwaka, dzielącego nasze 10kΩ na 255 wartości - dla trzech skrajnych zrobimy to przy pomocy aplikacji WaveForms:







Mając instalację pod ręką można przy okazji zbadać sobie, o ile mV zmieni się napięcie wyjściowe przy zmianie jednego bitu słowa sterującego, zrobimy to także w trzech miejscach, aby nie było dyskusji na temat ewentualnej nieliniowości - tabelka:

 pomiary
dane  Uout      V/bit
FF    10.506    0.027
FE    10.479    
...
81    6.961     0.028
80    6.933     
...
01    3.396     0.030
00    3.366     


Jak widać, możemy spokojnie przyjąć środkową wartość - 28mV/bit, małe sprawdzenie:



167*0.028=4.67, to tego dodajemy minimalną wartość regulacji (dla 0h) czyli 3.36 i mamy widoczne powyżej 8V z drobnym okruszkiem. Tu daje się we znaki obecność pasożytniczej rezystancji cyfrowego suwaka, która w sumie wypadałoby uwzględniać w obliczeniach, ale najwięcej złego robi niska rozdzielczość potencjometru - granulacja na poziomie 255 nie pozwoli nam na mega dokładne ustalenie wartości.

wielowątkowość - wszystko na raz

I dlatego demko aplikacji w Pascal będzie zrobione tak, że Analog Discovery 2 będzie nie tylko zadawało cyfrową wartość do potencjometru, ale także będzie mierzyło aktualne napięcie wyjściowe i korygowało nastawę, tak aby uzyskać oczekiwaną wartość.

Cała aplikacja dostępna jest tu: ➮ https://github.com/bienata/AnalogDiscovery2/tree/master/spi_var_LM723_mtd_1

Chce tu przy okazji zwrócić uwagę na pewną nowość - a mianowicie - jest to programik wielowątkowy, no a dokładnie - dwuwątkowy. Po prostu - proces regulacji napięcia wyjściowego to nieustanne odczyty bieżącej wartości i korekcja ustawień potencjometru, tego nie da się w sensowny sposób wpleść w pętlę główną okienkowej aplikacji. Albo inaczej - obliczenia i komunikacja z Analog Discovery 2 wykonywane w pętli głównej (czyli głównym wątku) spowodują, że program będzie się ciął jak emo po śmierci chomika i okienko zupełnie straci responsywność. Wystarczy jednak całe przetwarzanie zapakować w nadpisaną metodę Execute własnej klasy dziedziczonej z TTHread i sterowanie zasilaczem będziemy mieli jakby w tle. Oczywiście o wątek poboczny trzeba zadbać - w FormCreate okna głównego tworzymy jego egzemplarz, w FormClose - nakazujemy zakończyć pracę i zwalniamy zasoby. Do komunikacji pomiędzy wątkami służy specjalnie oddelegowana metoda UpdateVoltageSettings, która pobiera nastawę suwaka z okna oraz odświeża odczyt napięcia na podstawie tego, co zmierzyło AD2.

Sam algorytm regulacji to pewna wariacja na temat regulacji nadążnej - wartość docelowa jest osiągana na podstawie znaku wartości błędu (różnica zadajnik-pomiar), szybkość regulacji określa kwant, z jakim modyfikujemy wartość potencjometru. Można chwilę poeksperymentować z różnymi ustawieniami podawanymi w Inc/Dec wartości roboczej dla potencjometru - zobaczymy jak osiąga się kompromis pomiędzy dokładnością regulacji i szybkością stabilizacji wyniku, ot - zabawka na zimowy wieczór. Zapraszam na filmik:



gorąca atmosfera

Spróbujmy teraz pochylić się nad aspektami temperaturowymi tych ciekawych układów, choć mam wrażenie, że w amatorskiej konstrukcji te potki termicznie "odpłyną" jako ostatnie. Póki nie rozmontowałam układziku zasilacza wykonamy sobie kilka testów temperaturowych. Kontrolowane podgrzewanie całości chyba nie ma sensu, nałożą się współczynniki temperaturowe starego LM7523, rezystorów z Biedry no i w końcu tego potka, lepiej znacznie zrobić teścik w wyizolowanym obwodzie. Na zdjęciu poniżej poletko doświadczalne, jeżeli komu górne zdjęcia skojarzą się z ołtarzykiem, na którym poganie składali bożkom swym ofiary - to będzie to jak najbardziej słuszne.



A na serio - nie chciałam ryzykować przegrzania płytki stykowej, stąd odsunięcie MCP41HV na podstawce, obok siedzi LM35 do zgrubnej kontroli temperatury. Bo tu powstaje trudne zagadnienie - jak określić temperaturę samej kostki potencjometru? Przyjęłam za dopuszczalne zupełnie zgrubne szacowanie zakładające, że oba układy będą w tym samym strumieniu gorącego powietrza z lokówki, pomijam różnice w termoprzewodnictwie obudów, wpływ ich kształtu, etc/itd. Bo chcąc to zrobić porządnie - pozostaje tylko bezstykowy termometr albo kamerka termowizyjna, tego pod ręką nie mam.

Skrajne wartości rezystancji układu Rab przy zasilaniu +20V i dwóch skrajnych temperaturach:



Jak widać rozjazd wartości nie jest aż tak tragiczny, biorąc za odniesienie wartość w temperaturze pokojowej, przy 90°C potek popłynął w dal o raptem 0.6% pierwszej wartości, to jest IMHO całkiem dobry wynik.

Sporo informacji o tym i wykresów jest w osobnym względem d-s dokumencie:
MCP41HVX1 Typical Performance Curves ➮ http://ww1.microchip.com/downloads/en/DeviceDoc/20005209A.pdf
A teraz policzmy trochę:

ΔR=R24C-R90C=10159Ω-10097Ω=62Ω

procentowo R%=62/10159=~0.6% - nieźle.

W datasheet w AC/DC CHARACTERISTICS napisali, że Nominal Resistance Temperature Coefficient wyrażony jako ΔRab/ΔT jest 50 ppm/°C w zakresie -40°C...+85°C, u nas zgrubnie szacowane ΔT to 90-24=66°C, zatem szacowana zmiana R powinna być: ΔR=50/1E6*10E3*66=33Ω No i prawie, prawie z zachowaniem rzędu wielkości - szacowanie pasuje. Pamiętajmy, że mamy inne niż w d-s warunki zasilania i temperaturę określamy "na oko". A na oko, to chłop w szpitalu...

Filmik na koniec, lokówka w tle a WaveForms w roli loggera temperatury:



Z tradycyjnych wniosków to może takie: nawet z drobiazgu w postaci wpięcia mikroamperomierza można zrobić temat na poemat. Cyfrowy potencjometr nadaje się do pracy w aplikacji LM723, ale aby go opanować numerycznie trzeba się nieco nagimnastykować, to nie jest rasowy przetwornik C/A tylko bez urazy - garść rezystorów. No i po trzecie - WaveForms SDK jak się okazało nie sprawia problemów w aplikacjach wielowątkowych i obsługę AD2 możemy scedować na wątki pracujące w tle.

#slowanawiatr, grudzień 2018

Natasza Biecek 2004-2019/~, e-mail