Może pomyśl nad takim sposobem:
- tablica wychyleń serw;
- Timer1 w trybie FastPWM (z preskalerem 8), gdzie TOP to OCR1A;
- wykorzystanie przerwania od OCR1A i OCR1B;
- ustawienie OCR1A na 3 999;
- do rejestru OCR1B wpisujemy wartość wychylenia serwa (np 1023, 1456, - wartości te odpowiadają czasie trwania stanu wysokiego wyrażonego w mikrosekundach).
W przerwaniu od OCR1A ustawiamy pin sterujący serwem np A1 na "1", a do rejestru OCR1B wczytujemy wartość wychylenia z tablicy dla tego serwa. W przerwaniu od OCR1B ustawiany pin sterujący serwem A1 na "0". W kolejnym przerwaniu od OCR1A zmieniamy pin i wartość OCR1B na kolejne serwo, np A2. W następnym przerwaniu od OCR1B ustawiany pin sterujący serwem A2 na "0". I tak dalej, i tak dalej.
Skąd się wzięła wartość 3999 w OCR1A:
1.) częstotliwość z preskalerem : 8 000 000 Hz / 8 = 1 000 000 Hz;
2.) ilość taktów Timer1, by uzyskać 50 Hz: 1 000 000 Hz / 50 Hz = 20 000;
3.) standardowe serwa przyjmują sygnał w zakresie od około 0.8 ms do około 2.2 ms, natomiast długość całej ramki to 20 ms.
Mając te wszystkie informacje możemy założyć, że na obsługę jednego sygnału dla serwa, czas trwania jednego pełnego obiegu Timer1 to minimum 2.5 ms. Dzieląc 20 ms przez 2.5 ms otrzymujemy maksymalną ilość obsługiwanych serw równą 8. Chcąc sterować 5 serwami, wystarczy 20 ms (20 000 taktów Timer1) podzielić przez 5, co daje nam 4 ms (4 000 taktów Timer1). Pamiętając o tym, że zaczynamy liczyć od 0, a nie od 1, to zamiast do OCR1A wpisać 4 000, musimy wpisać 3 999. Mam nadzieję, że w miarę jasno się wyraziłem
