Rozwiązaniem problemów wiązanych z niedokładnościami opisanymi na poprzedniej stronie jest użycie sprzętowego generatora PWM, w który uzbrojony jest nasz komputerek Raspberry.
Użyjemy testowego programu servp.c (skrypt do kompilacji csp).
Program ten steruje serwomechanizmem pokazanym na filmiku na pierwszej stronie tego opisu.
Jeśli pominąć niuanse związane z samym pwm, jest bardzo prosty.
Programujemy kanał pwm, zegar 0,1 ms, okres 20 ms:
pinMode(1, PWM_OUTPUT); pwmSetMode(PWM_MODE_MS); pwmSetClock(1920); pwmSetRange(200);Dwukrotnie poruszamy wałkiem od jednego skrajnego położenia do drugiego, zatrzymując się pośrodku:
for(i=0;i<2;i++) { pwmWrite(1,6); sleep(1); pwmWrite(1,15); sleep(1); pwmWrite(1,25); sleep(1); pwmWrite(1,15); sleep(1); }Teraz obracamy wał serwomechanizmu od jednego skrajnego położenia do drugiego zwiększając czas trwania jedynki logicznej skokowo co 0,1 ms (9°). Po każdym przeprogramowaniu generatora (pwmWrite(1,i);) w prostej pętli odliczamy niewielkie opóźnienie, żeby serwomechanizm zdążył obrócić wałek:
for(i=6;i<26;i++) { pwmWrite(1,i); for (j=0;j<30000000;j++); }