Autor Wątek: Dokładność czasu.  (Przeczytany 8050 razy)

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Marzec 05, 2012, 22:04:32
Dokładne sterowanie LPT :)

Ok, więc panowie i panie mam do napisania program który generuje sobie impulsy na porcie lpt, każdy bit portu jest w stanie "1" od 1.5ms do 2ms z czego przełaczanie portu trwa około 1us z częstotliwością 1/20ms. Problemem okazała się dokładność xxxdelay (u/m/nano).
Funkcje mimo dokładności większej niz z tego co doczytałem nadal są zbyt problematyczne i sygnał nie jest dokładny co powoduje chorobę parkinsona w moim sprzęcie który steruje LPT.

Ma ktoś może pomysł na dokładniejsze odmierzanie czasu pod linuxem?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Groshu

  • Użytkownik

# Marzec 05, 2012, 22:20:20
A musisz to robić w ten sposób? Czym w ogóle sterujesz? Może prościej będzie dać po drodze jakiś mikrokontroler, jeżeli dokładność czasowa jest taka ważna.

Offline Karol

  • Użytkownik

# Marzec 05, 2012, 22:21:47
Podejrzyj źródła TEpikTimer dla FPC, tam jest zaimplemetnowane użycie http://en.wikipedia.org/wiki/Time_Stamp_Counter . Swego czasu używałem tego do sterowania LCDkiem przez LPT i działało ekstremalnie szybko w porównaniu z programami typu Smarty czy jaLCD.

Offline Kos

  • Użytkownik
    • kos.gd

# Marzec 05, 2012, 22:24:36
A nie ma standardowo jakiegoś hardware do sterowanie tym LPT...? Jakoś nie chce mi się wierzyć, że aplikacje muszą dbać o to programowo. (totally wild guess)

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Marzec 05, 2012, 22:25:07
Groshu:
Gdybym miał czas to bym użył. A steruje 6 serwami. :)

Offline Xender

  • Użytkownik

# Marzec 06, 2012, 00:33:02
Można dograć do jajka patche od real-time, powinno pomóc (nie znam sie dokładnie, tylko słyszałem o podobnym problemie).

Offline Groshu

  • Użytkownik

# Marzec 06, 2012, 07:51:01
Ja robiłem hexapoda na inżynierkę (po 3 serwa na nogę czyli w sumie 18) sterowanego z mikrokomputera z Linuxem. Po niedługim czasie doszedłem do wniosku, że bezpośrednie wykorzystanie GPIO pytki niewiele da i skończyło się na użyciu dodatkowych mikrokontrolerów sterowanych przez UART.
A u Ciebie to by jedna Atmega128 wystarczyła i to by pewnie było najprostsze i najszybsze rozwiązanie ;)

Offline Xender

  • Użytkownik

# Marzec 06, 2012, 08:43:59
Tylko po co bawić się w dodatkowy sprzęt, skoro można zmusić system żeby bardziej uważał na swoje timingi? Sterowanie bezpośrednio z portu równoległego, bez dodatkowych inteligentnych kontrolerów jest częste w CNC, "i jakoś sobie z tym radzą" - sam widziałem jak Ubuntu (tak, Ubuntu do CNC - Argh) odpalone na thin cliencie OOTB się nie wyrabiało, a z patchami całkowicie dawało radę. Wystarczy dograć co trzeba do kernela i po kłopocie - angażowanie dodatkowego hardware zamiast odpowiedniego skonfigurowania software to nie jest dobre wyjście.

Offline agent_J

  • Użytkownik

# Marzec 06, 2012, 09:08:45
Bo Windows ani Linux to nie RTOSy ? CNC bez sprzętowego kontrolera to wersja "z pomocy dla powodzian". Najlepiej wziąć któryś mikrokontroler z wbudowanym USB zamiast bawić się w przestarzałe wynalazki, o których już nikt nie pamięta.
Jak chcesz programowo, to zablokuj przerwania na czas pracy metody wysyłającej dane.
« Ostatnia zmiana: Marzec 06, 2012, 09:28:37 wysłana przez agent_J »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 06, 2012, 10:07:42
Cytuj
Tylko po co bawić się w dodatkowy sprzęt, skoro można zmusić system żeby bardziej uważał na swoje timingi?
Problem w tym, że nie można. Przełączanie pomiędzy wątkami zwykle ma na sztywno wbitą częstotliwość i wiele na to nie pomożesz.


@świrus: Jeżeli masz kompa z przynajmniej dwoma logicznymi rdzeniami (zakładam że masz), to możesz ustawić swojej aplikacji priorytet na "realtime". Dodatkowo nie polegaj na żadnych systemowych funkcjach czekających (bo uspią ci wątek i nie uzyskasz precyzji większej niż częstotliwość schedulera), tylko rób polling na jakiejś funkcji czasu o dużej precyzji (np. QPC).

Ale serio, jeżeli nie boisz się odrobiny elektroniki, to zainteresuj się mikroprocesorami. Podepniesz sobie jakiegoś niewielkiego AVRa, postawisz na nim V-USB i będziesz mógł sterować robotem chociażby po HID (pomijając oczywisty fakt, że USB jest "nieco" częściej spotykanym gniazdem od LPT). Tylko pamiętaj by nie ciągnąć zasilania z USB, bo tam masz 500mA max, a tyle to dwa serwa pod obciążeniem potrafią zjeść. :)

Cytuj
Najlepiej wziąć któryś mikrokontroler z wbudowanym USB zamiast bawić się w przestarzałe wynalazki, o których już nikt nie pamięta.
Jak wyżej: nie musi mieć wbudowanego USB. Tym bardziej, że modele z wbudowanym USB raczej ciężko spotkać w obudowach nie-SMD (co niedo utrudnia radosny R&D z lutownicą).

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Marzec 06, 2012, 11:58:51
Elektroniki się nie boję (w końcu jestem na profilu elektronicznym), ba mam nawet atmege pod ręką z max232 ale wolałem sterować bezpośrednio. No cóż sprobuję w odzielnym wątku sterować z użyciem jakimś userspace jiffies.

A serwa są zasilane z zasilaczy laboratoryjnych 2x5A :) Żadne tam usb.
« Ostatnia zmiana: Marzec 06, 2012, 12:00:40 wysłana przez świrus »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 06, 2012, 12:04:08
Cytuj
ba mam nawet atmege pod ręką z max232
RS232 jest obecnie równie rzadko spotykanym portem, co LPT. :)

Offline Groshu

  • Użytkownik

# Marzec 06, 2012, 12:16:12
angażowanie dodatkowego hardware zamiast odpowiedniego skonfigurowania software to nie jest dobre wyjście.
Podstawowe zasady mechatroniki, na których opiera się między innymi budowa dysku twardego w Twoim komputerze, mówią zgoła co innego.

RS232 jest obecnie równie rzadko spotykanym portem, co LPT. :)
Zależy. We wszelkich współczesnych systemach sterowania jest tych RS'ów aż gęsto. Co prawda głównie do sterowania urządzeniami, których nie opłacało się wyposażać w Ethernet, ale nie zmienia to faktu, że w tego typu zastosowaniach USB schodzi na dalszy plan.

Offline Xender

  • Użytkownik

# Marzec 07, 2012, 00:19:25
Co do przestarzałości RS232 czy portu równoległego to się nie do końca zgodzę - w takich zastosowaniach nadal są dość popularne.
Wiem, że jeśli chcieć to zrobić porządnie bez RTOS, to macie rację - dodatkowy sprzęt jest właściwym rozwiązaniem, ale da się też zrobić to programowo bez RTOS - tak żeby było wystarczająco - choć nie jest to profesjonalne podejście. Z patchami niepotrzebnie zacząłem gadać, bo nie znam konkretów - mój błąd.

Offline bies

  • Użytkownik

# Marzec 07, 2012, 00:51:31
Problem w tym, że nie można. Przełączanie pomiędzy wątkami zwykle ma na sztywno wbitą częstotliwość i wiele na to nie pomożesz.
CONFIG_PREEMPT(*), CONFIG_NO_HZ, CONFIG_HIGH_RES_TIMERS, CONFIG_PREEMPT_RT(**) i możesz więcej niż na pierwszy rzut oka widać.

(*) Tak naprawdę jest to cała rodzina CONFIG_PREEMPT* -- trzeba poczytać pomoc i wybrać to co jest potrzebne.
(**) Wymaga osobnego patcha na kernel [1], w vanilla jest tylko CONFIG_PREEMPT.

[1] https://rt.wiki.kernel.org/