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?