Cześć wszystkim
Zdaję sobie sprawę, że temat trochę już oklepany, ale zauważyłem, że każdy ma inny problem z tym PIDem
Otóż muszę (do jutra wieczór) zaimplementować regulację prędkości obrotowej regulatorem PID dwóch silników DC (Dagu DG01D). Każdy z silników jest wyposażony w enkoder w postaci hallotronu. Na wale silnika osadzony jest magnes neodymowy ośmiopolowy, czyli mam 8 impulsów na obrót.
Co zrobiłem do tej pory? Mam pomiar szerokości impulsu z enkodera. Oto kod:
Pozostaje sprawa implementacji PIDa. Jak prawie każdy, miałem teorię sterowania na wykładzie, jednakże wiadomo, że wykład jedno, a zrozumienie drugie. Pora więc temat zrozumieć. Znalazłem taki pseudokod obrazujący PID w wersji cyfrowej:
Muszę to teraz odnieść do swojego projektu.
Silniki są na pokładzie robota, więc nie ma sensu żeby PID regulował jak nie jedzie. Chodzi mi o to, by PID załączał się w momencie komendy uruchamiającej silniki. Czy to jest dobre podejście?
Kolejna sprawa - silniki są sterowane przy pomocy mostka TB6612FNG, więc mam możliwość podania PWM i myślałem właśnie, żeby procent wypełnienia PWM był wyjściem regulatora. Czy takie podejście jest słuszne?
Wykonałem też pomiary i przy 100% PWM sygnał z enkodera ma wypełnienie 50% a szerokość impulsu waha się od 50 do 52ms. Dwa silniki i każdy kręci trochę inaczej, co jest normalne. Chciałbym je wyregulować by sygnał z enkodera miał szerokość 60ms, więc powinny się zrównać.
Mam teraz kłopot jak połączyć to wszystko razem i wykonać PID. Czy output w tym pseudokodzie powyżej to powinna być wartość rejestru CCA/CCB odpowiadającego za współczynnika wypełnienia sygnału PWM?
Proszę uprzejmie o wskazówki i pozdrawiam.
Edit: tak sobie myślę o tym PIDzie i jest tak, że moim inputem jest sygnał z enkodera, czyli jego szerokość w mikrosekundach (milisekundach jak po odbiorze długości z kanału podzielę od razu przez tysiąc). Jednakże moim outputem powinien być jakiś procent wypełnienia sygnału PWM dla silnika.
Napisane jest:, czyli odejmuję aktualną szerokość impulsu z zadaną. Jak to jednak pożenić z outputem PIDa, który powinien być procentem PWM/ew. wartością rejestru?
Zdaję sobie sprawę, że temat trochę już oklepany, ale zauważyłem, że każdy ma inny problem z tym PIDem
Otóż muszę (do jutra wieczór) zaimplementować regulację prędkości obrotowej regulatorem PID dwóch silników DC (Dagu DG01D). Każdy z silników jest wyposażony w enkoder w postaci hallotronu. Na wale silnika osadzony jest magnes neodymowy ośmiopolowy, czyli mam 8 impulsów na obrót.
Co zrobiłem do tej pory? Mam pomiar szerokości impulsu z enkodera. Oto kod:
Kod: C / C++
Pozostaje sprawa implementacji PIDa. Jak prawie każdy, miałem teorię sterowania na wykładzie, jednakże wiadomo, że wykład jedno, a zrozumienie drugie. Pora więc temat zrozumieć. Znalazłem taki pseudokod obrazujący PID w wersji cyfrowej:
Kod: C / C++
Muszę to teraz odnieść do swojego projektu.
Silniki są na pokładzie robota, więc nie ma sensu żeby PID regulował jak nie jedzie. Chodzi mi o to, by PID załączał się w momencie komendy uruchamiającej silniki. Czy to jest dobre podejście?
Kolejna sprawa - silniki są sterowane przy pomocy mostka TB6612FNG, więc mam możliwość podania PWM i myślałem właśnie, żeby procent wypełnienia PWM był wyjściem regulatora. Czy takie podejście jest słuszne?
Wykonałem też pomiary i przy 100% PWM sygnał z enkodera ma wypełnienie 50% a szerokość impulsu waha się od 50 do 52ms. Dwa silniki i każdy kręci trochę inaczej, co jest normalne. Chciałbym je wyregulować by sygnał z enkodera miał szerokość 60ms, więc powinny się zrównać.
Mam teraz kłopot jak połączyć to wszystko razem i wykonać PID. Czy output w tym pseudokodzie powyżej to powinna być wartość rejestru CCA/CCB odpowiadającego za współczynnika wypełnienia sygnału PWM?
Proszę uprzejmie o wskazówki i pozdrawiam.
Edit: tak sobie myślę o tym PIDzie i jest tak, że moim inputem jest sygnał z enkodera, czyli jego szerokość w mikrosekundach (milisekundach jak po odbiorze długości z kanału podzielę od razu przez tysiąc). Jednakże moim outputem powinien być jakiś procent wypełnienia sygnału PWM dla silnika.
Napisane jest:
Kod: C / C++
