Lepszym sposobem było by sterowanie serwami jedno po drugim (zwłaszcza kiedy ma być ich 6) tzn. kiedy ustawisz wyjście serwa w stan wysoki i czekasz 1,5 - 2,5ms, to wtedy ustawiasz stan niski dla tego serwa, a dla kolejnego dopiero w tym momencie ustawiasz stan wysoki i tak po kolei dla wszystkich serw.
Sygnał sterujący jednym serwem trwa 20ms, więc dzieląc go przez 2,5ms (maksymalny czas trwania stanu wysokiego), wychodzi że w tym czasie można po kolei wysterować do 8 serw.
Wygląda to mniej więcej tak (przykład dla 2 serw, atmega8, taktowanie 8MHz):
Inicjalizacja timera:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Obsługa przerwania:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wartość OCRA oznacz czas po jakim włączane są kolejne serwa, a do OCRB wpisujesz wartość w zależności od położenia serwa od 1500 do 2500 ale tak żeby nie przekroczyć wartość w OCRA (wtedy nie wykona się przerwanie COMPB).
W ten sposób można zrealizować to na jednym timerze, z precyzją do 1000 pozycji serw (teoretycznie
), a przerwania od timera nie obciążają zbytnio mikrokontrolera, bo przerwanie wywoływane jest co ok 1ms (w zależności od położenia danego serwa), a nie jak w twoim przypadku co kilkanaście us.