Zrozumiałem dlaczego i jak działa moje serwo po zmianach w kodzie, które przyniosły niespodziewane i dobre efekty.
Od czego by tu zacząć...
Może od tego, że wypełnienia PWM od 0 do 60% były bezużyteczne przy sterowaniu gdyż silnik po prostu nie reagował na przyłożone napięcie. Dopiero powyżej wypełnienia 60% dostawał kopa. I to naprawdę nagłego. Tak jakby siła przyrastała wykładniczo do wypełnienia.
Jak wiadomo głównym czynnikiem odpowiedzi regulatora PID jest akcja proporcjonalna. Gdy błąd jest mały odpowiedź również jest mała i błąd nie jest kasowany - dlatego potrzebujemy członu całkującego. Taka charakterystyka powodowała, że serwo w okolicy punktu zadanego było "miękkie" a gdy dochodziło do owych 60% to nagle przesuwając silnik napotykało się jakby ścianę - nagły duży opór silnika. Takie rozluźnienie w okolicach punktu zadanego było usuwane przez akcję całkującą jednak ta nieliniowość siły była mocno wyczuwalna. Mam nadzieję, że opisuję to w miarę jasno.
Po zmianach w kodzie programu serwa, które wprowadziłem i opisywałem jakiś czas temu okazało się, że miękkość serwa wokoło punktu zadanego zniknęła. Co ciekawe odkryłem dziwne zachowanie serwa gdyż wartość PIDa zatrzymywała się i oscylowała wokół wartości 512 a nie jak było wcześniej wokół 0. Winę za to brała akcja całkująca, która miała wartość około 512. Z tego powodu przy włączeniu serwa zawsze było szarpnięcie, którego wtedy nie potrafiłem zrozumieć. Gdy wyłączałym akcję całkującą to serwo zatrzymywało się na 52 kroku przy wzmocnieniu P = 10 mimo punktu zadanego w 0. Wyglądało to tak jakby punktem równowagi było wyjście PIDa około 520 czyli wypełnienie równe około 50%. Było to dla mnie sporym zaskoczeniem. Przy takim sterowaniu końcówka mocy na L298 była zupełnie zimna po wielu testach i zabawach z napędem. Wcześniej przed tą zmianą bardzo mocno się grzała. Nie rozumiejąc dlaczego mój serwonapęd działa tak dobrze

zacząłem dochodzić o co w tym chodzi. Okazało się, że funkcje, które ustalały kierunek pracy serwa w oprogramowaniu są bezużyteczne a silnik samoistnie zatrzymuje się w miejscu przy wypełnieniu 50%. Wróćmy tutaj do tego, że wypełnienia od 0 do powiedzmy 50% były bezużyteczne gdyż silnik w ogóle nie reagował na takie napięcie. Zakładając oczywiście, że napięcie wahało się pomiędzy, 0 a U zasilania. Wtedy sterowanie odbywało się za pomocą jednego przebiegu PWM. Teraz mam dwa odwrotne przebiegi podane na mostek H nazwijmy to na przeciwległe po skosie tranzystory.
W tym momencie tak wygląda przebieg na silniku w stanie spoczynku.
Tym razem napięcie w + i - znosi się i silnik stoi w miejscu. Końcówka mocy nie grzeje się, silnik mimo pozostawienia na 4h również nie zagrzał się nawet w najmniejszym stopniu. Pobierany prąd jest bardzo mały. Właśnie? Dlaczego? Czyż silnik nie powinien walczyć ze sobą? co prawda przy częstotliwości 15kHz jakikolwiek ruch w prawo lewo zgodnie z napięciem jest niemożliwy.
OK, więc mamy wypełnienie 50% i silnik stoi. Już wiecie dlaczego zniknęła nazwijmy to ta strefa miękkości wokół pozycji zadanej? Bo w ten sposób wycięliśmy wartości wyjściowe PIDa, zależnego od członu proporcjonalnego proporcjonalnie do błędu (jak sama nazwa wskazuje

), które wynosiły od 0 do 50%. Poprzednio silnik w wartościach PIDa od -500 do +500 był bezwładny - nie reagował. Teraz stoimy w miejscu 50%, więc wypełnienie 0% oznacza pełną moc powiedzmy w prawo a 100% pełną moc w lewo. Jednocześnie PID oscyluje od 0 do 1023 (równowaga w 511), a nie jak było wcześniej od -1023 do +1023 (równowaga w 0). W tej chwili w ogóle nie ma efektu miękkości silnika wokół pozycji zadanej, ponieważ akcja proporcjonalna od razu wchodzi w zakres działania silnika.
Poniżej rysunek poglądowy, na czerwono jak wcześniej działało serwo, siła wolno przyrastała wokół punktu zadanego po czym nagle mocno rosła. Na zielono jak to działa teraz:
Mam nadzieję, że jest to zrozumiałe.
Czy takie podejście do tematu jest w jakikolwiek sposób błędne? Testy pokazują, że działanie jest ok.
Widzicie jakieś złe strony takiego sterowania?
Czy moje rozumowanie jest prawidłowe?
ursus_arctos, a u Ciebie jak to działa? Tak jak to opisałem?