w 24h
samopoczucie?
Poniżej znajduje się szczegółowy opis działania kluczowych funkcji oraz ich roli w kodzie projektu HAL2UDP. Funkcje te zarządzają zarówno kontrolą, jak i interakcją z sprzętem oraz komunikacją sieciową.
https://github.com/jzolee/HAL2UDP/blob/main/src/main.cpp
setup()
Co robi: Inicjalizuje wszystkie niezbędne piny, ustawia je jako wyjścia lub wejścia w zależności od ich przeznaczenia. Ustala również ustawienia dla timerów, które będą odpowiedzialne za generowanie kroków dla silników oraz uruchamia zadanie do obsługi głównej pętli.
Dlaczego: Funkcja ta jest niezbędna do skonfigurowania środowiska pracy przed rozpoczęciem działania kodu. Umożliwia prawidłowe zainicjowanie wszystkich komponentów, co jest kluczowe przed rozpoczęciem pracy systemu.
setup_Core0(void* parameter)
Co robi: Inicjalizuje porty wejściowe, inicjuje Etherent oraz UDP, a także tworzy i przypisuje zadanie do core 0, które będzie odpowiedzialne za główną pętlę funkcji.
Dlaczego: Potrzebne do uruchomienia komunikacji sieciowej i zapewnienia, że program będzie mógł odbierać polecenia oraz wysyłać dane zwrotne przez Ethernet. Przypisanie zadań do odpowiedniego rdzenia (core) pozwala na optymalizację działań wielowątkowych.
loop_Core0(void* parameter)
Co robi: Główna pętla zarządzająca odbiorem danych UDP oraz przetwarzaniem komend. Jej zadaniem jest kontynuowanie cyklicznego sprawdzania odebranych pakietów, obsługa stanów wejściowych i generowanie sygnałów wyjściowych.
Dlaczego: Funkcja ta jest kluczowa dla działania systemu, pozwala na bieżącą komunikację oraz odpowiedź na zmiany wprowadzone w systemie przez użytkownika. Jej działanie sprawia, że system jest reaktywny i elastyczny.
commandHandler()
Co robi: Obsługuje odbierane komendy, dekoduje je i ustawia odpowiednie wartości dla kontrolowanych osi, takich jak kierunek ruchu, przyspieszenie oraz częstotliwość PWM.
Dlaczego: Umożliwia to szybką i efektywną reakcję na zmiany wymagań użytkowników, co pozwala na dynamiczne zarządzanie ruchem silników oraz ich parametrami.
inputHandler()
Co robi: Odczytuje stany pinów wejściowych i ustawia odpowiednie flagi w strukturze fb
informującej o statusach wejść.
Dlaczego: Umożliwia to monitorowanie stanu zewnętrznych przełączników lub czujników, co może być kluczowe dla działania systemów automatyki.
outputHandler()
Co robi: Zarządza sygnałami wyjściowymi, ustawiając je na podstawie odbieranych komend oraz aktualnych stanów PWM; aktualizuje odpowiednie piny na podstawie wartości.
Dlaczego: Pozwala to na dynamiczną zmianę sygnałów wyjściowych w odpowiedzi na zmieniające się dane, co jest kluczowe dla precyzyjnej kontroli urządzeń peryferyjnych.
Timer Functions (onTime_0()
, onTime_1()
, onTime_2()
)
Co robi: Obsługuje generację kroków dla każdej z osi, zapewniając odpowiednie impulsy dla silników krokowych w oparciu o wyliczone wartości czasowe.
Dlaczego: Stanowią one elementy krytyczne w czasie rzeczywistym dla systemów sterowania ruchem, pozwalając na precyzyjne sterowanie silnikami w oparciu o zdefiniowane przyspieszenia i prędkości.
Mathematical Functions (newT()
, acceleration()
, deceleration()
)
Co robi: Obliczają różne parametry, takie jak czas ruchu na podstawie przyspieszenia, oraz zarządzają logiką przyspieszania i zwalniania dla każdej z osi.
Dlaczego: Odpowiadają za optymalizację ruchu silników, co jest niezbędne dla bardziej płynnej i kontrolowanej reakcji systemu na polecenia użytkownika.
fastInvSqrt()
Co robi: Metoda matematyczna optymalizująca obliczanie odwrotności pierwiastka kwadratowego.
Dlaczego: Użycie tego algorytmu pozwala na szybsze obliczenia, co jest istotne w kontekście aplikacji czasu rzeczywistego, gdzie wydajność ma kluczowe znaczenie.
Każda z powyższych funkcji odgrywa istotną rolę w całości projektu, umożliwiając sprawną komunikację z użytkownikiem, kontrolę nad sprzętem oraz dynamiczną adaptację systemu w odpowiedzi na metryki i dane. Ich współpraca pozwala na stworzenie elastycznego i efektywnego systemu automatyzacji, który jest w stanie zarządzać wieloma zadaniami równolegle w czasie rzeczywistym.