PID - jeszcze raz

Jan 22, 2026 Last reply: 5 miesięcy temu 59 Replies

Próbuję okiełznać po raz kolejny sterowanie nadążne PID silnika z enkoderem. Enkoder jest podłączony do Pi Pico, odczytuje go program w PIO, a wartość czytam w micropythonie i obliczam dane dla PWM. Działa mi to tak, że wystrojenie do +- kilkadziesiąt podziałek enkodera zachowuje się przewidywalnie. Ale można to zrobić praktycznie do jednej działki, i pamiętam, że ktoś tu na grupie się chwalił że to zrobił.



Zwiększam kP, układ zaczyna nadążać, ale powoli, zwiększam dalej... już blisko, pojawia się przerzut, jeszcze trochę i pojawiają się oscylacje. Te oscylacje można zniwelować kD. Zwiększam kD, oscylacje zaczynają maleć... jeszcze bardziej maleć... już prawie... i zwiększenie dalej powoduje, że pojawiają się nowe oscylacje, tylko szybsze (krótszy okres) i dalsze zwiększanie kD zwiększa amplitudę jeszcze bardziej. Co tu jest grane? Mam swoją teorię, ale zanim napiszę - może ktoś puści parę - to na pewno szkolny błąd i znane zjawisko.



Masz metodę Zieglera-Nicholsa:

formatting link
Wyłaczasz człony D i I, podkręcasz powoli wzmocnienie, az wystąpią oscylacje. Znalazłes wzmocnienie krytyczne Kc, i mierzysz okres oscylacji Pc.

A następnie jak w tabelce: Kp = 0.6*Kc Ki = 2*Kp/Pc Kd = Kp*Pc/8

IMO - w zależności od tego czym silnik kręci - może się okazać, ze to krytyczne wzmocnienie jest inne, w zalezności od zadanych obrotów.

Program jest wystarczająco szybki, nie gubi kroków z enkodera? Enkoder bezpośrednio na osi silnika, czy po jakiejs przekładni ... bo luzy mogą być tu wredne ...

J.

W dniu 22.01.2026 o 23:44, J.F pisze:

Nie sprawdza się. Nie udało mi się doprowadzić do stabilności z jakimkolwiek Ki. Może to jest kwestia jednostek? Uchyb jest liczony w działkach enkodera, przyrost uchybu w działkach na mikrosekundę, okres oscylacji to jakieś 0,2-0,5sekundy, to ki jakoś strasznie małe wyjdzie, kd ogromne. Kp rozumiem że w tym wzorze 1 oznacza maksymalną moc?

Silnik kręci bezpośrednio enkoderem. próbowałem też przez przekładnie ale nic to nie zmienia - wolniej wszystko się odbywa, ale nadal nie da się wystroić lepiej niż +- 50 - 100 podziałek. Kroków nie gubi, bo kroki odczytuje PIO. Program szybki... a jaki szybki ma być? Jaki powinien być krok pomiędzy kolejnymi obliczeniami?

Być może - przy bardzo wolnym narastaniu powinno jakoś działać. Nie mówię, że całkiem stabilnie, bo jakies tarcie i histereza silnika dochodzi. Ale okres mógłbys wydłużać w nieskonconosc.

A z kolei szybkie procesory bardzo szybko całkują :-) i kiepsko różniczkują :-)

Wzmocnienie częsci P

Na tyle szybki, żeby nie gubił impulsów z enkodera. Chyba, że masz jakiś absolutny.

A sam regulator niekoniecznie musi być szybki - sam widzisz, że oscylacje maja 0.2-0.5s

J.

W dniu 23.01.2026 o 22:34, J.F pisze:

Nie działa. Tak jak zauważyłeś silnik ma tarcie, zaskok magnetyczny - jak sygnał narośnie na tyle że ruszy to przejedzie kilkadziesiąt - kilkaset kroków i zaczyna się kołysanie.

Tak to powinno działać:

formatting link
chyba że to jest ściema i enkoder jest w rzeczywistości 100-1000 razy dokładniejszy.

Bez członu "całkowego" prawie niemożliwe jest uzyskanie naprawdę małego błedu. W praktyce liczy się sumy i odwrotność okresu sterownika PID daje współczynnik skalujący sumę do całki. Oczywiście musisz użyć zgodne jednoski inaczej wyjdą błędne wartości współczynników. Działki enkdera wyglądają OK, ale musisz poprawnie uwzględnić czas.

W dniu 24.01.2026 o 15:14, Mirek pisze:

Tak mnie jeszcze nachodzi: Przecież taki układ jest w drukarkach atramentowych. Nie przyszło mi do głowy sprawdzić jaka tam jest rozdzielczość tego enkodera, nie mam żadnej drukarki rozwalonej w tej chwili, bo bym sprawdził. A może silnik musi być specjalny - w sensie nie może mieć zaskoków i symetryczny moment w obie strony?

W dniu 2026-01-25 o 12:34, Mirek pisze:

W osi Y 200 linii na cal. W osi X (karetka z tuszami) 200 lub 400 linii na cal. I to to z układem optyki (rozdzielczość x4) na wyjściu układu daje odpowiednio rozdzielczość 800-1600 pikseli na cal. Tyle co do prostych enkoderów bez jakiejś specjalnej ochrony pyłoszczelnej.

W drukarkach masz zwykły DC tyko wolnoobrotowy z ciut większym momentem obrotowym.

OT

formatting link

W dniu 2026-01-25 o 14:03, alojzy nieborak pisze:

Drugi raz OT

formatting link
formatting link

W dniu 25.01.2026 o 14:12, alojzy nieborak pisze:

No i kluczowe pytanie: ile wynosi błąd sterowania - ustawia do jednej działki?

Krzywymi sterowania będę się bawił jak PID będzie chodził tak jak powinien.

Wcale nie musi - wystarczy, że się porusza w miarę równomiernie, potem wystarczy wypluc kropelkę we własciwym momencie.

I ta rozdzielczość może być myląca - ona jest, bo kropelki można gęsto pluc, pytanie na ile jest to dokładne/powtarzalne.

J.

W dniu 25.01.2026 o 19:07, J.F pisze:

Na jedno wychodzi. Z resztą w Y musi dokładnie ustawić inaczej wyjdą smugi na wydruku.

W dniu 24.01.2026 o 15:14, Mirek pisze:

Nie, tam nie ma pid-a, tam sterowanie silnika musi mieć odpowiednią rampę startową i zatrzymania która zwalnia silnik i pozycjonuje. Rampa to np kroki enkodera opadająco czyli np 32,16,8,4,2,1 odejmuje sie ją od skoku i robi skok a potem kolejne małe kroczki wg ramy opadająco aż do zera. Oczywiście kroki mogą być mniejsze albo większe np 32,8,1, ważne żeby wychamować silnik dokładnie na punkt. To na filmie trudno zauważyć ale silnik zwalania przed zatrzymaniem, co jest oczywiste bo ma swój moment i musi mieć czas aby wyhamować, właśnie po to jest ta rampa. A pid-a stosuje się do ciągłego sterowania np termostat czy obroty silnika.

Napisane, że ma. Silnik też wygląda na DC, a nie krokowy.

A nie widać :-)

Musi mieć czas, ale ten robi to w jedną klatkę na YT - czyli chyba w mniej niż 1/30 s.

Tu cos o większej bezwładności

formatting link
Widać, że dopiero "anti windup" uzdrawia sytuację, ale to może być częściowo fałszywe wrażenie.

J.

No nie, bo kropelka ma bardzo małą bezwładność :-)

I ma tam enkoder czy zwykły krokowiec?

J.

Może byc pseudo-pid, czyli niepełny, zauważ że przy pojedynczym ruchu niepowtarzalnym pid nie ma sensu, działa dopiero przy powtarzających się ruchach.

Silnik nie ma znaczenia.

To ponad 30ms, kupa czasu, silniki w przewijakach małych z Mery miały

10ms czas startu/zatrzymania a były to prawie zwykłe silniki dc, a z dużych przewijaków bezinercyjne miały pojedyncze ms ale ich wirnik to była tylko miedź i karkas z płytki z włókna szklanego. Tam sterowanie robiło właśnie rampę o której pisałem, tyle że analogowo, wzmacniacz miał w sprzężeniu zwrotnym diody i oporniki i w zależności od napięcia włączały się odpowiednie diody i zmieniało się sprzężenie zwrotne, tak aby nadać odpowiednią rampę silnikowi. Zresztą nie tylko tam, w dyskach głowice (cewka przesuwająca) też były tak sterowane. Wiem bo to naprawiałem.

Widać że pid w takich zastosowaniach jest bez sensu. Są wersje 'wyprzedzające' i one by tu zadziałały, ale zwykły nie, bo on działa na podstawie tego co było i to musi jeszcze być ileś iteracji żeby odpowiednio 'nazbierał' wartości korekcyjnych. Kto się pid-em nie bawił to tego nie wie.

Nie bardzo rozumiem.

A tu na oko jakby zwykły silniczek. Ale wiadomo - na oko to chłop w szpitalu ... :-)

Silniki do napędu głowic w dyskach pamiętam - niezłe bydlaki, a faktycznie niskoinercyjne. Zresztą sam wózek z głowicami, to było cięzkie bydle.

Ale w szczególy sterowania nie wchodziłem.

Nie piszesz o jakiś bardzo nowoczesnych regulatorach? Bo taki zwykły, analogowy może nawet, to co ma "nazbierać"?

Natomiast, fakt, że:

-trzeba go dobrze dostroic, żeby dobrze regulował, bo inaczej będzie to kiepsko wyglądało,

-do czegoś typu serwomotor się tak sobie nadaje, bo zadajemy mu np pozycję "10.5 obrotu do przodu", i on całkuje sygnał błędu zanim te 10 obrotów nakręci, i pod koniec ma sporą wartość w całce. Ale jakby tak prędkośc posuwu i rampę dołożyć do układu zadającego pozycję, to wtedy PID powinien pilnować naśladowania pozycji w miarę dobrze.

J.

Niżej masz wyjaśnione.

Ale ten 10ms też tak wyglądał :) Jedynie wirnik i komutator był lepiej zrobiony.

Tak ale one max osiągały 70ms bo cała karetka z pakietem głowic swoje ważyła.

W nowoczesnych to guzik pooglądasz bo wszystko robi procek. Widzisz tylko efekt końcowy, w tych starszych analogowych można było zobaczyć jak to jest zrobione.

No ale kiedy? podczas jednego skoku i to jeszcze za każdym razem innego? czy też w trakcie skoku jeżeli jest podzielony na drobne kroczki i każdy analizowany z osobna? Właśnie o czymś w miarę podobnym sugerowałem autorowi, wpierw duży krok-rampa a potem coraz mniejsze kroczki w ramach rampy, wtedy wystarczy zwykły proporcjonalny sterownik.

I tu jest problem bo silniki się zużywają, zmienia sie obciążenie i pid taki idzie w buraki, stąd w starszych był uproszczony a w nowych na prockach są samostrojące sie pid-y.

Wtedy on już prawie niepotrzebny, albo można go znacznie uprościć jak robiłem na atmelach aby mieć odpowiednią wydajność.

Ale regulator PID nic nie "analizuje", po prostu realizuje funkcje P, I, i D, zgodnie z nastawami. Chyba, że piszesz o jakims trybie automatycznego strojenia.

To co taki zwykły regulator "zbiera", to jest wartość całki w członie I.

Proporcjonalny sterownik ma tę wadę, że na koncu prawie zawsze będzie błąd. Bo sam człon P, przy małym błędzie, nie zapewnia wystarczającego wysterowania, aby silnik błąd zlikwidował.

Silniki na mój gust się mało zużywają, a jak się zużyją, to do wymiany/dużego remontu. Obciążenie ... róznie bywa, czasem nie jest az takie zmienne.

J.

W dniu 26.01.2026 o 06:22, J.F pisze:

Tak, robiłem też anti windup albo integral clamping, ale mi się to zachowuje dokładnie tak jak pod koniec filmiku. Gość twierdzi, że problemem jest zbyt rzadki okres odświeżania i to by się zgadzało z moimi podejrzeniami. Ja tak sobie kombinowałem, że ten czas między pomiarami musi być mniejszy niż silnik jest w stanie przesunąć się o jeden krok przy minimalnej, stabilnej prędkości. Niestety w Pythonie nie zrobię tego szybciej, bo o zgrozo najwięcej czasu zajmuje odczytanie tego rejestru z PIO. Co ciekawe, od wersji z 22 roku do obecnej ten czas zmalał prawie dwukrotnie, ale to wciąż za mało żeby uzyskać tak jak u niego 800Hz. Fajnie by było przerobić to na C, ale nie wiem czy mi starczy motywacji.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required