[AD2][Pascal] Analog OUT | woltomierz True RMS z przetwarzaniem sygnału | WaveForms SDK | cz.6

Tutaj umieszczamy tematy związane z językami programowania niepasującymi do innych działów.
Regulamin forum
Temat prosimy poprzedzić nazwą języka umieszczonego w nawiasach kwadratowych np. [Pascal].
Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

[AD2][Pascal] Analog OUT | woltomierz True RMS z przetwarzaniem sygnału | WaveForms SDK | cz.6

Postautor: tasza » niedziela 20 sty 2019, 20:52

♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ Battle Beast ⚡ ☘ ⚡ z albumu `Bringer of Pain` - Straight To The Heart ♪ ♩ ♫
https://youtu.be/Q2Ly7TFiR2I


Obsługa analogowego wyjścia jest banalnie prosta, WaveForms SDK dostarcza jak zwykle komplet funkcji o spójnym i wygodnym w użyciu interfejsie. Generowanie przebiegów o różnym kształcie do pasjonujących nie należy, więc tym chwilowo zajmować się nie będziemy. Za to generowanie składowej stałej (DC), choć na pierwszy rzut oka nudne jak wczorajsza owsianka, można ubrać w większy temat, a przy okazji wykorzystać wcześniej opracowane kawałki kodu i układ na płytce stykowej.

MEA-1, 100uA

Głównym bohaterem wieczorynki będzie stary (rocznik '65), ale ciągle w pełni sprawny mikroamperomierz typu MEA-1 o nominalnym prądzie 100uA i rezystancji ceweczki 2kΩ, widzimy go na fotografii poniżej.

00_100uA.jpg


To typowy ustrój magnetoelektryczny klasy 1.5 wyposażony w dużą lusterkową skalę, mimo drobnych rysek i zżółknięć - działający doskonale. Ot, bazarowa zdobycz w ramach podtrzymywania farta w polowaniu.

Ustrój w formie woltomierza podłączyłam do wyjścia W1 (generator AD2, kanał 1) przez odpowiednio dobrany rezystor - posobnik. Drobne wyliczenia dla maksymalnego napięcia wyjściowego generatora równego 5V takie:

Uw=(Rm+Rp)Im
Uw=RmIm+RpIm
Rp=(Uw-RmIm)/Im = ( 5 - 100E-6 * 2E3 )/100E-6 = 48E3 = 48kΩ

W praktyce wyliczanka powyższa oznacza konieczność wstawienia stałego rezystora 40kΩ i niebieskiego potka 10kΩ do precyzyjnego wycyrklowania maksymalnego wychylenia wskazówki. Faktem, że skala ma podziałkę do 100, a my operujemy napięciem maksymalnym 5V nie należy się przejmować. Instalację testową przedstawia zdjęcie:

02_sch.png



Działanie programu testowego, sterującego generatorem tak aby ustawiać wartości 0..10 widzimy na filmiku:

https://youtu.be/lcqKx8W3HBM

Oczywiście pascalowa implementacja zabawki: :arrow: https://github.com/bienata/AnalogDiscov ... eter_1.lpr i niejako z obowiązku kilka słów o API bloku Analog OUT naszego Analog Discovery 2. Na pracę wybranego kanału wyjściowego zezwalamy funkcją FDwfAnalogOutNodeEnableSet, tryb pracy (funkcję) generatora ustalamy wywołując FDwfAnalogOutNodeFunctionSet, z parametrów podstawowych tego co pojawi się na wyjściu interesuje na w tym przypadku amplituda, zatem do kompletu mam funkcję FDwfAnalogOutNodeAmplitudeSet. Całe wywołanie ustawiające inicjalne 0V na wyjściu pracującego bloku może wyglądać mniej więcej tak:

analogout_meter_1.lpr pisze:

Kod: Zaznacz cały

FDwfAnalogOutNodeEnableSet( hAd2, 0, AnalogOutNodeCarrier, true );
FDwfAnalogOutNodeFunctionSet( hAd2, 0, AnalogOutNodeCarrier, funcDC );
FDwfAnalogOutNodeAmplitudeSet( hAd2, 0, AnalogOutNodeCarrier, 0 (* napiecie wyjsciowe *) );


Uruchomiony blok generatora na nowe wartości amplitudy (jak i fazy, częstotliwości, etc) reaguje natychmiast, podając je kolejno w pętli możemy nacieszyć się kicającą po skali wskazówką.

A tak przy okazji - mimo dokładnego ustawienia wychylenia na 100 działek przy 5.0V tak gdzieś w 3/4 skali daje się zauważyć nieliniowość wskazań ustroju. Z czego wynikają? No cóż, przyrząd ma słuszne lata i trudno też oczekiwać, że nie ma za sobą żadnych przygód, choćby udarów mechanicznych wpływających na jednorodność pola magnetycznego w obrębie cewki, taki life i już. Oczywiście jest możliwość skorygowania takiego zachowania choćby programowo - przecież mamy pełną kontrolę nad tym co jest podawane na ustrój, ale to kiedy indziej.

True RMS

No i właśnie - skoro mamy w miarę opanowane sterowanie ustrojem i możemy prezentować na nim różne wartości w klasycznej, analogowej formie to czemu by nie zbudować ... woltomierza wartości skutecznej AC?

Koncepcyjnie zabawka sprowadza się do schematu jak poniżej:

01_100uA_uklad.jpg


Wykorzystałam to, co zostało przygotowane na okazję termometru z wyświetlaczem HDSP-2111 i odczytem wartości analogowej w trybie akwizycji danych do buforka. Jak pokazać wartość skuteczną? Można na upartego podzielić pozyskaną amplitudę przez pierwiastek z dwóch, ale wtedy nie byłoby zabawy. Zatem najpierw do poczytania:

:arrow: https://pl.wikipedia.org/wiki/Warto%C5% ... _skuteczna
:arrow: http://www.eletrica.ufpr.br/edu/artigos ... gerson.pdf

Do wyliczenia RMS potrzebujemy zatem tabeli z próbkami, możliwie jak największej - tu przyjęłam sporo, bo całe 8k, samplowane z dość dużą częstotliwością:

analogout_meter_2.lpr pisze:

Kod: Zaznacz cały

const MAX_SAMPLES = 8192;
var samplesBuff : array [0..MAX_SAMPLES-1] of double;
//inicjalizacja IN
FDwfAnalogInFrequencySet( hAd2, 4E+6 ); // fs=4MHz
FDwfAnalogInBufferSizeSet( hAd2, MAX_SAMPLES ); // buforek 8k sampli


No i oczywiście cykliczne wyliczanie wartości skutecznej z tak zachomikowanych danych:

analogout_meter_2.lpr pisze:

Kod: Zaznacz cały

// RMS
U := 0.0;
for i := 0 to MAX_SAMPLES-1 do U := U + samplesBuff[ i ] * samplesBuff[ i ] ;
U := sqrt( U/MAX_SAMPLES );
// poslij na miernik
FDwfAnalogOutNodeOffsetSet( hAd2, 0, AnalogOutNodeCarrier, U/2 );


Prezentacja odbywa się jednocześnie na plastikowym wyświetlaczu i staroświeckim ustroju pomiarowym. Kontrola jakości przy pomocy oscyloskopu i niezastąpionego V640, zerknijmy na garść zdjęć dla różnych wartości sygnału wejściowego:

10_0V.jpg

11_1V.jpg

12_2V.jpg

13_3V.jpg

14_4V.jpg


Kolejny filmik (przepraszam za mizerną jakość, ale coś mi zabolieła PIXORD-owa kamerka) przedstawia całą instalację bardziej na żywo podczas zmian poziomu wyjściowego z generatora KZ1404

https://youtu.be/rdAxVj6axQI

Kompletny kod programiku do RMS znajdziemy w lokalizacji :arrow: https://github.com/bienata/AnalogDiscov ... eter_2.lpr i w zasadzie tak mogłaby się ta pisanka zakończyć, ale...

gratisik - składowa stała

Jak nietrudno zauważyć powyższe wyliczanki i pomiary przeprowadzane były dla sygnału przemiennego, ale przy zerowej (w miarę możliwości) składowej stałej. Dodanie owej do przebiegu spowodowało, że całe moje pomiarowe towarzystwo przestało mieć wspólne zdanie odnośnie wyników - każdy pokazywał po swojemu. Zacznijmy zatem od spreparowania nowego programiku, który do obliczeń RMS weźmie tylko i wyłącznie składową AC, cześć stała zostanie wyłuskana i posłuży do prezentacji, ale z wyniku jej się pozbędziemy. Oto fragment zmodyfikowanej części obliczeniowej:

analogout_meter_3.lpr pisze:

Kod: Zaznacz cały

// DC
Udc := 0;
for i := 0 to MAX_SAMPLES-1 do Udc := Udc + samplesBuff[ i ];
Udc := Udc/MAX_SAMPLES;
// RMS AC
Urms := 0.0;
for i := 0 to MAX_SAMPLES-1 do Urms := Urms + (samplesBuff[ i ] - Udc)*(samplesBuff[ i ] - Udc);
Urms := sqrt( Urms/MAX_SAMPLES );
// poslij na miernik
FDwfAnalogOutNodeOffsetSet( hAd2, 0, AnalogOutNodeCarrier, Urms/2 );


I teraz garstka pomiarów, gdzie Meratronik V640 mierzy wartość RMS odfiltrowując składową stałą (przycisk LF) a dżenderuśny Rigol ma wejście ustawione w trybie DC (łapie i składową stałą i zmienną)

50_A.jpg


52_C.jpg


Jak widać programik podrasowany nieco poradził sobie z odcedzeniem składowej DC, cała aplikacja tu: :arrow: https://github.com/bienata/AnalogDiscov ... eter_3.lpr

A przy okazji - zerknijmy jak dla takiego sygnału testowego zachowa się neonowy V543:

60_E.jpg


Wciśnięcie DC - pokaże na lampkach nam tylko i wyłącznie składową DC sygnału, wciśnięcie AC - składową zmienną. A jak kto ma chęć, to proszę zerknąć jak do tego podchodzi WaveForms w oknie oscyloskopu, gdy poprosimy aby pokazać predefiniowane pomiary dla wybranego kanału (view/measurements) - tam jest do wyboru AC RMS i DC RMS. W sumie to logiczne - skoro te wartości powstają na skutek obróbki numerycznej, to można sobie wybierać co potrzeba.

No i na koniec zagadka drobna, może jednak komuś będzie się chciało zerknąć w listingi i zastanowić odrobinę. A mianowicie: po zapisaniu jako nowy projekt programiku w Pascal z poprzedniego odcinka, tego od temperatury z LM35, dołożyłam sterowanie wyjściem napięciowym AD2, podałam 4V z generatora i ... wyskoczyło na konsolę jak na zdjęciu, po lewo.

99_zagadka.jpg


Wynik wprawdzie był, ale jednak daleki od tego co mi się wyśniło. Po chwili namóżdżania się nad kodem dał się zauważyć drobiazg, który był przyczynkiem tych durnych wyników. Po poprawieniu jednej wartości, wyliczana wartość zaczęła być całkiem sensowna, widzimy ją po prawej stronie zdjęcia. Powstaje pytanie - na czym polegała niedoróbka?


#slowanawiatr
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Wróć do „Inne języki programowania”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości