synchroniczna generacja sygnału

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
Gevalia
Posty: 6
Rejestracja: 01 sie 2014 11:53
Wersja środowiska: LabVIEW 2012

synchroniczna generacja sygnału

Post autor: Gevalia »

Witam, mam następujący problem:
Potrzebuję programu generującego sygnał składający się z dwóch różnych sinusów (o różnych częstotliwościach i amplitudach) Udało mi się to zrobić za pomocą zapisu wartości próbek do tablicy oraz pętli for. Mój program wymaga jednak żeby odczyt z tablicy przez pętlę for odbywał się co 1 ms. W załączniku zamieszczam zrzut ekranu z programem i przykładowym przebiegiem.
Niestety okazało się że w takim układzie próbkowanie odbywa się co więcej niż ms, przez co przykładowe 1000 próbek jest generowanych w ok 1500 ms. Czy ktoś wie jak ten problem rozwiązać? Czy jest to kwestia zastosowania odpowiedniego timera, czy może ten algorytm tak nie zadziała?
Z góry dziękuję za wszelkie podpowiedzi.
Załączniki
Zrzut ekranu 2014-11-21 23.36.14.png
Awatar użytkownika
koofaya
Posty: 38
Rejestracja: 23 sty 2014 14:51
Wersja środowiska: LabVIEW 2014

Re: synchroniczna generacja sygnału

Post autor: koofaya »

Nie bardzo rozumiem po co ta cała pętla for.
Możesz generować dwa sygnały w pętli while - ja do tego zawsze stosowałem Sine Wave.vi. Synchronizację zapewnia Ci jednakowa liczba próbek.
Potem od razu podajesz je na waveform graph. Jak chcesz, aby to były dwa tony składowe jednego sygnału, to po prostu robisz sumę.

Chyba, że zamierzasz jeszcze coś robić w tej pętli, ale skoro nie wiadomo co, to nic więcej nie pomogę.
Gevalia
Posty: 6
Rejestracja: 01 sie 2014 11:53
Wersja środowiska: LabVIEW 2012

Re: synchroniczna generacja sygnału

Post autor: Gevalia »

Dziękuję za zainteresowanie. For służy mi jeszcze do zliczania cykli ale to w zasadzie mało istotne. Jeśli w takim razie zrobię to na Sina Wave to jak mogę regulować czasy trwania połówki sinusa? Bo wiem jak w pętli while (bez fora) generować na zmianę dwie połówki sinusów o różnych amplitudach ale o tych samych czasach trwania.
Paco_MS
Posty: 43
Rejestracja: 25 paź 2011 15:04
Wersja środowiska: LabVIEW 2014

Re: synchroniczna generacja sygnału

Post autor: Paco_MS »

Witam,
dorzucę parę groszy do tej pętli FOR.
Zaintrygowała mnie jedynka przy funkcji Timing-owej. Oznacza ona, że pętla ma się wykonywać w ciągu 1ms.
Prosty program w załączeniu (LV2010) pozwala sprawdzić czas trwania 1000 pętli wykonywanych w czasie 1ms - co daje czas trwania operacji 1s. Ale tak nie jest.Widać, że zwykle wychodzi więcej - do 2s. Ustawienie czasu trwania pętli na 10ms już daje w miarę poprawne wyniki na poziomie 9996 ms (czyli około 10s).
Wniosek: system (Windows?) jest tak zapchany procesami, że zadanie jest wykonywane rzadziej niż 1ms. Należało by odciążyć procesor i pamięć albo zastosować systemy czasu rzeczywistego. Ten sam problem się pojawia, gdy próbujemy mierzyć sygnał z karty funkcjami DQAmx metodą próbkowania One sample on demand. Wychodzi na to, że komputer jest zbyt "wolny".
Załączniki
test.vi
(7.3 KiB) Pobrany 364 razy
Ciastomir
Posty: 12
Rejestracja: 02 wrz 2014 15:52
Wersja środowiska: LabVIEW 2012

synchroniczna generacja sygnału

Post autor: Ciastomir »

Paco_MS, u mnie Twój test zawsze wykonuje się w 1000 lub 1001 ms.
Gevalia, możesz spróbować zmienić priorytet VI w VI Properties -> Execution, ale podobno trzeba z tym uważać.
Zmiany na front panelu zawsze są źródłem opóźnień. Proponuję wyświetlać wszystkie dane jednocześnie za pętlą lub jakoś partiami. A tak na marginesie, pierwsze wykonanie w programie Wait Until Next ms Multiple jest losowe. Z dokumentacji: "...it is possible that the first loop period might be short."
Paco_MS
Posty: 43
Rejestracja: 25 paź 2011 15:04
Wersja środowiska: LabVIEW 2014

Re: synchroniczna generacja sygnału

Post autor: Paco_MS »

Ciastomir,
to chyba potwierdza moje spostrzeżenia. zwykle mam poładowane sterowniki i aktywne procesy (czasem nie korzystam z ich możliwości, idą w tle #-o ). Dla mnie minimum to około 1.6ms. Ale jak już wrzucę 2ms to zaczyna działać OK.
Dzięki.
Gevalia
Posty: 6
Rejestracja: 01 sie 2014 11:53
Wersja środowiska: LabVIEW 2012

synchroniczna generacja sygnału

Post autor: Gevalia »

Dziękuję za odpowiedzi i przepraszam za tak długi przestój ale chwilowo nie miałam czasu by tu zajrzeć. Paco_MS bardzo trafne spostrzeżenie, okazało się, że na innym komputerze z inną wersją systemu chodzi ok, a ponieważ docelowo program jest wykonywany przez cRIO to wszystko śmiga jak powinno ;)
Mam przy okazji jeszcze jedno pytanie, które mnie męczy trochę z innej beczki. Mam licznik impulsów w pętli for, który zlicza np. co 1000 cykl dodając do zmiennej 1. Całość jest uruchamiana przez funkcję case jeśli True. W momencie ustawienia Case na False licznik ma się zerować i tak też się dzieje. Niestety po ponownym ustawieniu Case na True licznik zaczyna zliczać od poprzednio zapamiętanej ostatniej wartości, a nie od zera. Czy jest na to jakiś sposób?
Paco_MS
Posty: 43
Rejestracja: 25 paź 2011 15:04
Wersja środowiska: LabVIEW 2014

Re: synchroniczna generacja sygnału

Post autor: Paco_MS »

Przydałby się jakiś VI. Czy są stosowane rejestry przesuwne, jeżeli tak należy je zerować.
Proszę podpiąć jakiś VI lub podesłać - zerknie się...
Gevalia
Posty: 6
Rejestracja: 01 sie 2014 11:53
Wersja środowiska: LabVIEW 2012

Re: synchroniczna generacja sygnału

Post autor: Gevalia »

Przesyłam w takim razie przykładowy test.vi. Rejestrów przesuwnych nie ma, bo nie bardzo wiem jak ich użyć. W vi'u, który dołączam cykle się zliczają i zerują po zatrzymaniu, ale po ponownym włączeniu "Startu" zliczają się od poprzedniej wartości, a nie od 0.
---
Dołączam drugi plik, może komuś kiedyś się przyda (test2.vi). Problem rozwiązany, banalny, ale każdemu może się zdarzyć ;)
Dziękuję za zainteresowanie i pozdrawiam
Załączniki
test2.vi
(17.02 KiB) Pobrany 324 razy
test.vi
(17.07 KiB) Pobrany 338 razy
Paco_MS
Posty: 43
Rejestracja: 25 paź 2011 15:04
Wersja środowiska: LabVIEW 2014

Re: synchroniczna generacja sygnału

Post autor: Paco_MS »

Brawo! To się chwali, jeżeli szukasz samodzielnie rozwiązania. Twoje rozwiązanie to metoda nadpisywania w komórce pomocniczej: tutaj zmienna lokalna stanowi dodatkowy rejestr kontrolowania zawartości zmiennej "nr cyklu".
Metoda z rejestrem przesuwnym zasadniczo działa tak samo, ale dodatkowa komórka jest tworzona w strukturze pętli (while, loop - nie ma znaczenia). Aby utworzyć rejestr klikamy prawym klawiszem myszy na ramce pętli i wybieramy opcję Create Shift Register...
Załączam plik z rozwiązaniem z rejestrem przesuwnym: tutaj rejestr na pętli Loop pozwala zapamiętywać w kolejnych pętlach wartość zmiennej "nr cyklu", zaś rejestr na pętli głównej While służy do zerowania, gdy "start" jest równy FALSE.
Zaletą rejestrów przesuwnych jest to, że mogą one być wykorzystane do pamiętania wartości kilka kroków wstecz - przyklad.vi.
Trzeba pamiętać o zerowaniu rejestrów - inaczej będą pamiętać ostatnio wpisane wartości.

pozdrawiam
Załączniki
przyklad.vi
(5.88 KiB) Pobrany 366 razy
test z rejestrem przesuwnym.vi
(12.36 KiB) Pobrany 357 razy
ODPOWIEDZ