Chyba mamy problem z tym, że dwie rzeczy nazywają się podobnie - płytka z Atmegą i środowisko programowania. O ile sama płytka z procesorem ma możliwości czysto fizyczne, ileś pinów i jakiś czas wykonania czegoś tam, to środowisko programowania nakłada czasem nieoczywiste ograniczenia. Np. Arduino IDE dokleja do każdego programu kod, którego istnienia i działania użytkownik nie koniecznie jest świadomy. Np. dlaczego działa millis() ? Bo Arduino IDE rezerwuje niektóre przerwania dla własnych celów.
Często dobrze działający program przestaje działać po dopisaniu jednej linii a przyczyny można szukać długo.
Dlatego kiedy piszę że ArduinoIDE nadaje się tylko do migania lampkami, to mam na myśli środowisko programowania o takiej nazwie.
Ja zaczynałem przygodę z mikrokontrolerami od Intela 8048, więc dla Atmegi mam szacunek, to jest potężny procesor, choć dziś standardem są dużo potężniejsze i dużo szybsze.
Natomiast co do przedmiotowego projektu, to chyba zafiksowałem się na swoich projektach i na tym żeby uniknąć użycia drogiego i delikatnego enkodera.
Natomiast gdyby jako warunek postawić użycie dokładnego enkodera, np. 2000 cpr, to zrobienie posuwu synchronizowanego można zrobić prymitywnie prostą metodą - poprzez wycinanie impulsów.
Przykładowo, jeśli enkoder daje 2000 impulsów na obrót, a sterownik silnika ustawimy na 400 impulsów na obrót, to łącząc bezpośrednio wyjście enkodera z wejściem sterownika, silnik zrobi dokładnie pięć obrotów na obrót wrzeciona. Oczywiście powyżej pewnej prędkości wrzeciona silnik nie ruszy tylko będzie brzęczał ( to po to są akceleracje ), ale to się da łatwo ominąć, o czym później. Jeżeli teraz pomiędzy enkoder a sterownik wstawimy układ, który będzie wycinał pewne impulsy z przebiegu enkodera, to sterownik dostanie ich mniej niż enkoder wysłał, więc silnik obróci się mniej niż pięć obrotów na obrót wrzeciona. Teoretycznie możemy uzyskać dowolnie niską prędkość silnika, ale nadal zsynchronizowaną z wrzecionem. Teraz wystarczy poczekać z początkiem ruchu na indeks wrzeciona i zrobić prostą akcelerację polegającą na rozpoczęciu ruchu z określonym bezpiecznym dzielnikiem i podniesieniu go stopniowo do zadanej prędkości, to samo na koniec ruchu tylko odwrotnie, żeby nie zgubić pozycji.