Generacja sygnału
Generacja sygnału
Witam!
Na początku chciałabym zaznaczyć, że jestem początkującym użytkownikiem LabView, dlatego też proszę o dość "ulogowe" potraktowanie ;)
Używam LabView 2009. Korzystam z NI CRIO-9073 z przetwornikami NI 9205 i NI 9263.
Korzystając z FPGA chciałam wygenerować np. sinusoidę. Na podstawie tutoriali i jakiegoś przykładu stworzyłam projekt (poniżej przedstawiam screeny). Po podłączeniu oscyloskopu na ekranie pojawiła się "sinusoida". Problemem jest to, że pojawia się ona na ekranie oscyloskopu przez ułamek sekundy.
Czy ktoś mógłby mi wyjaśnić dlaczego tak się dzieje oraz powiedzieć, w jaki sposób mogę rozwiązać ten problem? Szczerze się przyznaje, że sama nie rozumiem wszystkiego, co tam jest...
Z góry dziękuję za pomoc!
Na początku chciałabym zaznaczyć, że jestem początkującym użytkownikiem LabView, dlatego też proszę o dość "ulogowe" potraktowanie ;)
Używam LabView 2009. Korzystam z NI CRIO-9073 z przetwornikami NI 9205 i NI 9263.
Korzystając z FPGA chciałam wygenerować np. sinusoidę. Na podstawie tutoriali i jakiegoś przykładu stworzyłam projekt (poniżej przedstawiam screeny). Po podłączeniu oscyloskopu na ekranie pojawiła się "sinusoida". Problemem jest to, że pojawia się ona na ekranie oscyloskopu przez ułamek sekundy.
Czy ktoś mógłby mi wyjaśnić dlaczego tak się dzieje oraz powiedzieć, w jaki sposób mogę rozwiązać ten problem? Szczerze się przyznaje, że sama nie rozumiem wszystkiego, co tam jest...
Z góry dziękuję za pomoc!
Generacja sygnału
Witam,
A ten program na FPGA nie powinien być w pętli while zamiast for?
A ten program na FPGA nie powinien być w pętli while zamiast for?
Re: Generacja sygnału
Witam,
Patka ma racje - program w FPGA powinien być w pętli WHILE, wówczas należy odpowiednio przerobić program na RT.
Skoro jestes początkująca to jakości kodu się nie czepiam, wierze, że nad tym popracujesz ;)
Napiszę co bym zmienił:
1. program w FPGA
- wejścia / wyjścia - w oknie projektu masz moduły wymienione dwókrotnie - jedne możesz przeciągać do diagramu w drugich możesz ustawiać właściwości - tam też możesz ustalić czy wyjście jest skalibrowane (format FXP) lub nieskalibrowane - liczba całkowita - polecam skalibrowane FXP i w oknie pomocy kontekstowej (Ctrl + H) sprawdzisz jaki jest typ danych,
- nazwy kolejek to np. Transmit i Receive lub Generate i Acquire czy jakoś tak ... dodatkowo w kolejkach możesz odpowiednio dobrać typ danych tak, żeby pasowały do wyjść / wejść czyli FXP i odpowiednia ilość bitów liczby i ilość bitów przed przecinkiem - jak zrobisz to dobrze to nie musisz nic konwertować,
- osobiście użyłbym WHILE zamiast FOR i dołozyłbym niezbędne liczniki - ale to zależy od tego, co chcesz osiągnąć ... a tego nie napisałaś,
- generacja i akwizycja nie są skorelowane - być może nie muszą być, ale podejrzewam, że kolejność ma znaczenie.
2. program RTOS (cRIO)
- Nie robiłbym na początek podprogramu do obsługi FPGA, tyko uruchomiłbym program i w odpowiednim momencie karmił kolejkę danymi i drugą odczytywałbym z odpowiednią szybkością,
Na koniec odpowiedź na pytanie dlaczego widzisz sygnał tylko przez ułamek sekundy : nie wiem - i szczerze powiem trochę mnie to dziwi, bo powinno działać, (kiepsko) ale działać.
Mój strzał jest taki, że:
1. W programie w RT funkcja która otwiera referencję do programu FPGA (w środku ma ikonę domyślną i podpis pod spodem cRIO-9073) uruchamia program - sprawdź to w menu kontekstowym w opcji wywołania programu odznacz check box RUN. Jeżeli jest zaznaczony, to włączasz program od razu, a nie powinnaś - nie powinno to mieć wpływu na dalsze działanie, gdyż w FPGA czekasz na dane do skutku, ALE - jeżeli ponowne uruchomienie programu metodą RUN rzeczywiście ponownie uruchomi program, kolejka nie doczeka się na dane ... znowu ALE - widziałabyś to w programie na RTOS, stąd pomysł nr 2
2. źle ustawiłas akcję przycisku Start w Host.vi (ustaw bistabilne zachowanie tak, żeby mógł być stale wciśnięty). Jeżeli to jest dobrze ustawione to chętnie się dowiem co było nie tak jak już rozwiążesz problem.
Napisz co chcesz osiągnąć - czy generację ciągłą, czy generację skończonej ilości próbek i jak ma się do tego akwizycja? I jak ma to wyglądać w sterowniku. Pamiętaj, że im lepiej przygotujesz pytanie tym lepszą dostaniesz odpowiedź, więc poświęć pół dnia, narysuj jakiś diagram to podrzucę jakieś przykładowe rozwiązanie - tym lepsze im lepiej zapytasz
Powodzenia w kodowaniu, pozdrawiam
Patka ma racje - program w FPGA powinien być w pętli WHILE, wówczas należy odpowiednio przerobić program na RT.
Skoro jestes początkująca to jakości kodu się nie czepiam, wierze, że nad tym popracujesz ;)
Napiszę co bym zmienił:
1. program w FPGA
- wejścia / wyjścia - w oknie projektu masz moduły wymienione dwókrotnie - jedne możesz przeciągać do diagramu w drugich możesz ustawiać właściwości - tam też możesz ustalić czy wyjście jest skalibrowane (format FXP) lub nieskalibrowane - liczba całkowita - polecam skalibrowane FXP i w oknie pomocy kontekstowej (Ctrl + H) sprawdzisz jaki jest typ danych,
- nazwy kolejek to np. Transmit i Receive lub Generate i Acquire czy jakoś tak ... dodatkowo w kolejkach możesz odpowiednio dobrać typ danych tak, żeby pasowały do wyjść / wejść czyli FXP i odpowiednia ilość bitów liczby i ilość bitów przed przecinkiem - jak zrobisz to dobrze to nie musisz nic konwertować,
- osobiście użyłbym WHILE zamiast FOR i dołozyłbym niezbędne liczniki - ale to zależy od tego, co chcesz osiągnąć ... a tego nie napisałaś,
- generacja i akwizycja nie są skorelowane - być może nie muszą być, ale podejrzewam, że kolejność ma znaczenie.
2. program RTOS (cRIO)
- Nie robiłbym na początek podprogramu do obsługi FPGA, tyko uruchomiłbym program i w odpowiednim momencie karmił kolejkę danymi i drugą odczytywałbym z odpowiednią szybkością,
Na koniec odpowiedź na pytanie dlaczego widzisz sygnał tylko przez ułamek sekundy : nie wiem - i szczerze powiem trochę mnie to dziwi, bo powinno działać, (kiepsko) ale działać.
Mój strzał jest taki, że:
1. W programie w RT funkcja która otwiera referencję do programu FPGA (w środku ma ikonę domyślną i podpis pod spodem cRIO-9073) uruchamia program - sprawdź to w menu kontekstowym w opcji wywołania programu odznacz check box RUN. Jeżeli jest zaznaczony, to włączasz program od razu, a nie powinnaś - nie powinno to mieć wpływu na dalsze działanie, gdyż w FPGA czekasz na dane do skutku, ALE - jeżeli ponowne uruchomienie programu metodą RUN rzeczywiście ponownie uruchomi program, kolejka nie doczeka się na dane ... znowu ALE - widziałabyś to w programie na RTOS, stąd pomysł nr 2
2. źle ustawiłas akcję przycisku Start w Host.vi (ustaw bistabilne zachowanie tak, żeby mógł być stale wciśnięty). Jeżeli to jest dobrze ustawione to chętnie się dowiem co było nie tak jak już rozwiążesz problem.
Napisz co chcesz osiągnąć - czy generację ciągłą, czy generację skończonej ilości próbek i jak ma się do tego akwizycja? I jak ma to wyglądać w sterowniku. Pamiętaj, że im lepiej przygotujesz pytanie tym lepszą dostaniesz odpowiedź, więc poświęć pół dnia, narysuj jakiś diagram to podrzucę jakieś przykładowe rozwiązanie - tym lepsze im lepiej zapytasz
Powodzenia w kodowaniu, pozdrawiam
Re: Generacja sygnału
Dziękuję za wskazówki Zajmę się tym w poniedziałek, niestety wszystko znajduje się na uczelni. Wtedy też napiszę coś więcej na temat tego, co chce zrobić. W skrócie: chcę sygnał wygenerowany w LabView (w sumie to będą 4 różne sygnały: sygnał modulujący, sygnał zmodulowany, nośna i zegar) przesłać na układ demodulatora, a następnie odebrać sygnał zdemodulowany w celu policzenia stopy błędów. Z racji tego, że jestem początkująca chciałam zacząć od zwykłego przesłania np. przebiegu sinusoidalnego...
Re: Generacja sygnału
Generacja sygnału działa poprawnie. Dziękuję jeszcze raz za wskazówki
Niestety pojawił się kolejny problem Chciałam przesłać na układ rzeczywisty 4 sygnały i odebrać jeden, wyskakuje jednak pewien błąd. Czy ktoś mógłby mi wytłumaczyć, co źle robię/co jest nie tak? Proszę o pomoc...
Screeny poniżej:
Niestety pojawił się kolejny problem Chciałam przesłać na układ rzeczywisty 4 sygnały i odebrać jeden, wyskakuje jednak pewien błąd. Czy ktoś mógłby mi wytłumaczyć, co źle robię/co jest nie tak? Proszę o pomoc...
Screeny poniżej:
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Generacja sygnału
Dokładnie tak jak jest napisane - na sprzęcie, którego używasz, są tylko 3 kanały DMA, a Ty masz zrobione 5 kolejek. Trzeba ich zrobić mniej, nie ma innego sposobu (no, albo kupić sprzęt z większą liczbą kanałów).
Re: Generacja sygnału
Oczywiście kupno nowego sprzętu nie wchodzi w gre... A muszę przesłać wszystkie te sygnały. Nie ma innego wyjścia z tej sytuacji?
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Generacja sygnału
Możesz na przykład użyć jednej kolejki i po kolei wpisywać do niej próbki swoich sygnałów. Czyli w kolejce będą (dla trzech sygnałów):
1 element - 1 próbka 1 sygnału
2 element - 1 próbka 2 sygnału
3 element - 1 próbka 3 sygnału
4 element - 2 próbka 1 sygnału
5 element - 2 próbka 2 sygnału
6 element - 2 próbka 3 sygnału
7 element - 3 próbka 1 sygnału
...itd.
Wtedy na FPGA robisz odczyt kolejki tak samo, jak pokazałaś, ale zamiast 4 różnych kolejek czytasz 4 razy z jednej.
1 element - 1 próbka 1 sygnału
2 element - 1 próbka 2 sygnału
3 element - 1 próbka 3 sygnału
4 element - 2 próbka 1 sygnału
5 element - 2 próbka 2 sygnału
6 element - 2 próbka 3 sygnału
7 element - 3 próbka 1 sygnału
...itd.
Wtedy na FPGA robisz odczyt kolejki tak samo, jak pokazałaś, ale zamiast 4 różnych kolejek czytasz 4 razy z jednej.
Re: Generacja sygnału
Próbowałam coś takiego zrobić na podstawie http://zone.ni.com/reference/en-XX/help ... nterleave/
Niestety nie dało rady połączyć każdej już z trzech oddzielnych tablic do odpowiednich kanałów...
Niestety nie dało rady połączyć każdej już z trzech oddzielnych tablic do odpowiednich kanałów...
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Generacja sygnału
Nie bardzo rozumiem, czego do czego nie dało się podłączyć. Możesz pokazać jakiś kod?
Na FPGA wygląda to dokładnie tak samo, jak pokazałaś na obrazku wcześniej - tylko zamiast czterech różnych kolejek czytasz z jeden cztery razy.
Na FPGA wygląda to dokładnie tak samo, jak pokazałaś na obrazku wcześniej - tylko zamiast czterech różnych kolejek czytasz z jeden cztery razy.
- Załączniki
-
- fpga.png (13.24 KiB) Przejrzano 20799 razy
Re: Generacja sygnału
W FPGA zrobiłam tak, jak pokazałeś. Natomiast w hoście wygląda to u mnie tak, jak to jest widoczne na screenie w załączniku. Po podłączeniu do oscyloskopu widoczny jest jednak tylko sygnał tylko z AO0, z AO1 niestety nic nie wychodzi...
- Załączniki
-
- Gosia.JPG (9.42 KiB) Przejrzano 20771 razy
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Generacja sygnału
A możesz pokazać trochę więcej tego kodu? W tym skrawku wszystko wygląda w porządku. Sprawdź też, czy twoje FIFO ma odpowiednio duży bufor na wszystkie próbki (w ustawieniach FIFO w projekcie).
Re: Generacja sygnału
Nie mam w tym momencie przy sobie kodu. Tam po prostu podpięte są dwa sygnały. I skłamałam, nie wyświetla się tylko pierwszy sygnał z AO0 - wyświetlają się oba sygnały, z tym, że obydwa idą z AO0...
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Generacja sygnału
Sprawdź, czy na 100% po Interleave Arrays masz tak poskładane dane, jak powinny być. Zwróć uwagę na to, że obie tablice przed złożeniem powinny mieć ten sam rozmiar. Skonwertuj tą tablicę do FXP ręcznie (zlikwiduj czerwoną kropę na FIFO.Write) i sprawdź, czy dane nadal są ok. Spróbuj zrobić kolejkę "zwrotną" z FPGA - po odczytaniu FIFO na FPGA wyślij sobie dane z powrotem przez inną kolejkę na RT i zobacz, czy są prawidłowe.
...Ufff, to tyle co można z tych skrawków kodu wymyślić.
...Ufff, to tyle co można z tych skrawków kodu wymyślić.