C# Port LPT - Biblioteka WinIO

0

Witam,

Mam problem z prędkością przesyłu sygnału przez port LPT do silników krokowych.
Mianowicie, problem polega na tym, że jeśli chcę zrobić jakiś ustalony obrót to muszę wysłać np 500 sygnałów "1" i 500 sygnałów "0" naprzemiennie w jak najszybszy sposób.

Niby nic trudnego ALE:

Jeśli zrobię prostą pętlę jak tutaj:

 
int wartoscPortu = 8;
for (int i = 0; i < 1000; i++)
{
SetPortVal(0x378, wartoscPortu, 1);
     if (wartoscPortu == 8)
     wartoscPortu = 0;
      else
      wartoscPortu = 8;
}

Czyli zamieniam 0 na 8 i 8 na 0, lecz pętla wykonuje się tak szybko, że sterownik i silniki nie wyrabiają i odczytują to jako sygnał ciągły.

Wpadłem na pomysł, żeby użyć Thread.Sleep(1); - niby przerwa w wykonywaniu wątku 1ms, co powinno dawać teoretycznie 1000hz ale w rzeczywistości daje około 30ms, czyli zaledwie 33Hz... (silniki praktycznie stoją w miejscu)

No to wpadłem na szatański pomysł użycia pętli for. Tak więc program wysyła "8" potem liczy sobie do miliona i wysyła "0", liczy znowu i tak w kółko. Muszę przyznać że zdaje to egzamin całkiem nieźle (zwiększając i zmniejszając ilość uzyskałem minimalny czas zanim silnik "zgubi" kroki) ALE no właśnie.. silnik strasznie szarpie i czasami zgubi krok, co zapewne jest spowodowane tym, że każde "policzenie" do miliona zajmuje różną ilość czasu i jest zależna np od użycia procesora.

Wyczerpałem wszystkie pomysły, naczytałem się sporo w internecie ale wszędzie piszą, że pod windowsem mniej niż 1ms uzyskać nie idzie :(

Interesowałaby mnie częstotliwość około 1-2KHz :)

Wiem, że jest to do uzyskania bo np taki program mach3 radzi sobie z nawet większymi częstotliwościami.

Jakieś pomysły?

0

Aktualizacja:

Podczas testów wyszło, że na port wysyłane są sygnały z częstotliwością około 100-120KHz a po zastosowaniu pętli "do miliona" częstotliwość sięga 2,7 KHz (optymalna częstotliwość dla silników) ale za każdym razem pomiar pokazuje coś innego (pewnie dlatego, że coś innego zajmuje czas procesora).

Rozumiem, że nadal nikt nie wie jak uzyskać przerwę rzędu 0,4 milisekundy?

0

Ani C#, ani Windows, nie należą do rozwiązań, które by sprzyjały czemuś bliskiemu rozwiązaniom real-time. Przez wszystkie te skomplikowane rzeczy, jakie dzieją się "pod spodem" uzyskanie stałych czasowo przerw będzie praktycznie niemożliwe. Tym bardziej tak krótkich.

Według mnie: użyj jakiegoś mikrokontrolera w rodzaju AVR czy ARM, który będzie (powinien) w stanie zrobić to co chcesz. A używając komputera będziesz mógł nim sterować (ale też zachowując reżim czasowy).

0

Jedyne sensowne rozwiązanie, to to które podał @Ktos: jakiś dowolny układ sterujący silnikiem, do którego wysyłasz jeden sygnał a nie tysiąc.
Pecet (a konkretniej zwykły, desktopowy system operacyjny) po prostu się nie nadaje do zastosowań czasu rzeczywistego - w których musi wykonać określoną ilość czynności w określonym co do milisekundy czasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1