Prośba o pomoc z wprowadzeniem opóźnienia rzeczywistego

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Michaś
Posty: 10
Rejestracja: 06 mar 2007 00:00

Prośba o pomoc z wprowadzeniem opóźnienia rzeczywistego

Post autor: Michaś »

Witam

Zwracam się z prośbą do kolegów :)

Mam za zadanie zrobić aplikację do sterowanie prędkością obrotową silnika (prądu stałego), sprzężonego na wale z tachoprądnicą synchroniczną mierzącą prędkość (pomiar napięcia). Mam to robić przez kart pomiarową NI 6036. Tak na marginesie to karta ma sterować końcówkę mocy - nie bezpośrednio silnikiem, ale to już mniej istotne.
Metoda sterowania jest typu PWM (mam mieć możliwość zmiany długości impulsu - od 20 do 100 [ms] i współczynnika wypełnienia od 0 do 1).
Wymyśliłem jak to zrobić wykorzystując czas pobierany z systemu - niestety skutek był taki, że impulsy zaczęły "pływać". Wynika to z faktu, że Windows jest systemem "czasu nierzeczywistego" :? . Silnik zamiast sie zatrzymać przy współczynniku 0.5 - dostaje drgań :(
Prowadzący stwierdził, że problem można wyeliminować stosując, jako wzorzec czasu generator umieszczony na płycie karty NI. Aby się do niego dobrać należy użyć bloku DAQmx Create Virtual Channel, skonfigurowanego jako CO Pulse Time. Można to podobno zrobić przez dodanie kolejnego wątku, który miał by działać jak licznik - w momencie jak odliczy określony przedział czasu zezwala programowi na wystawienie kolejnej wartości na wyjściu generacyjnym (wartość +10 albo -10).


Z góry dziękuje za wszelkie rady i pomoc :D .

Pozdrawiam.
Michaś.
Ostatnio zmieniony 17 cze 2007 16:04 przez Michaś, łącznie zmieniany 2 razy.
Awatar użytkownika
rumcajs
Posty: 209
Rejestracja: 17 paź 2004 00:00
Lokalizacja: Aktualnie TRW

Re: Prośba o pomoc z wprowadzeniem opóźnienia rzeczywiste

Post autor: rumcajs »

Błędem jest wykorzystywanie do generacji PWM wyjścia analogowego, tym bardziej, że nie regulujesz amplitudy.
Użyj do tego jednego z dwóch counterów na Twojej karcie DAQ.
W załączniku screen konfiguracji taska w MAXie i przykładowa aplikacja w LV. Program przed zmianą parametrów okresu załączenia i wyłączenia, zatrzymuje task ponieważ jeżeli to uczynimy w trakcie wykonywania tasku otrzymamy błąd, chociaż w helpie jest napisane, iż te dwa parametry akurat mogą być zmieniene przy uruchomionym tasku.
Może ktoś jest w stanie to wyjaśnić ?
Rumcajs.
Michaś
Posty: 10
Rejestracja: 06 mar 2007 00:00

Re: Prośba o pomoc z wprowadzeniem opóźnienia rzeczywiste

Post autor: Michaś »

Cześć

Dzięki za podpowiedz :) ale ja i tak muszę na końcówkę mocy podawać sygnał sterujący o wartości +10 albo -10 [V]. Z counterów nie wyciągnę takiego sygnału, więc muszę używać wyjścia generacyjnego, w tym właśnie był problem, że to nie jest typowe sterowanie PWM - amplituda sygnału wyjściowego z karty jest ściśle określona i musi miec +-10.

Zastanawiam sie czy opóźnienia nie można wprowadzać właśnie z countera na karcie, np jeżeli wiem ze wsp. wypełnienia mam 0.2 i impuls ma trwać 20[ms] to sygnał +10[V] mam mieć na wyjściu przez 4[ms]. Powiedzmy, że ten czas odlicza counter, jak go odliczy wystawia jakąś wartość np. logiczną, że odliczył - coś na zasadzie wystawiania flagi w procesorze w momencie np. przeniesienia. Jak flaga jest ustawiona pętla główna robi jeden obrót (wystawia -10[V]), aż kolejny counter odliczy pozostały czas 16 [ms] - i na przykład skasuje tą flagę.

Ja chce sie tylko dobrać do tego countera i tak go skonfigurować, żebym z poziomu programu mógł mu przekazać dwa czasy, do których ma odliczać, a on żeby mi zmieniał jakąś wartość np. logiczną jak odliczy i żebym tą wartość mógł widzieć w pętli głównej.

Może to nie jest najmądrzejszy sposób, ale innego nie wymyśliłem :(

Pozdrawiam
Michaś
Awatar użytkownika
rumcajs
Posty: 209
Rejestracja: 17 paź 2004 00:00
Lokalizacja: Aktualnie TRW

Re: Prośba o pomoc z wprowadzeniem opóźnienia rzeczywiste

Post autor: rumcajs »

Michaś nie rób mi tego :)
Tak się nie robi, to nie problem wrzucić na wyjście countera tranzystor, podłączyć i zasilić go +/-10V chociażby z wyjścia analogowego.
Masz stabilny przebieg PWM generowany hardware'owo.
Ale jak już się uparłeś, to można zastosować TimingLoop, żeby trochę "urzeczywistnić" Windowsa, chciaż dla czasów poniżej 10ms i tak jest to za bardzo nierealne, cóż możesz spróbować czy nie będzie pływało.
Załączam przykład.
Do generowania przebiegu PWM możesz wykorzystać counter na karcie lub wirtualny (jak w przykładzie).
Rumcajs.
Michaś
Posty: 10
Rejestracja: 06 mar 2007 00:00

Re: Prośba o pomoc z wprowadzeniem opóźnienia rzeczywistego

Post autor: Michaś »

Hej.

Dzięki za pomoc, problem okazał sie jednak być niechudy. Robić coś w "czasie rzeczywistym" można (prawie) tylko hardwareowo tak jak mówiłeś - mam na myśli porównanie Windowsa z np. QNX-em. Jeżeli Windows miał by wykrywać jakieś zewnętrzne zdarzenie i potem inicjował jakieś działanie to bierze to w łeb :( . Przynajmniej się czegoś nauczyłem.

Dzięki za pomoc :)

Michaś.
ODPOWIEDZ