pFud do sterowania sterownikami silników używa sygnału z zakresu 0-3.3V. Jako że komputery nie potrafią podawać na wyjście napięcia o dowolnej wartości, w projekcie jest wykorzystany PWM (Pulse Width Modulation), czyli odpowiednie włączanie i wyłączanie prądu 3.3V, by (uśredniając) uzyskać dowolną wartość z zakresu 0-3.3V.
Dla lepszego zrozumienia mikrokontrolerów, "zbudujemy" ściemniacz żarówek wolframowych.
1. Stajemy przy włączniku światła w pokoju.2. Wymyślamy, z jaką dokładnością chcemy sterować. Ja wybieram dokładność do 1%, czyli dzielę 100% możliwości żarówki na 100, czyli okres wynosi 100.
3. Wybieramy, ile procent możliwości żarówki chcemy wykorzystać. Ja wybieram 10%, czyli "duty" wynosi 10.
4. Ustawiamy kontakt/przełącznik światła w pozycji "światło włączone".
5. Zaczynamy liczyć do 100.
6. Gdy dojdziemy do 10, przełączamy przełącznik w pozycję przeciwną.
7. Gdy dojdziemy do 100, przełączamy przełącznik w pozycję przeciwną i zaczynamy liczyć od nowa.
Gratulacje, właśnie sterowałeś światłem jak prawdziwy mikrokontroler. Z tym, że mikrokontroler wykona 20k cykli w sekundę i efekt będzie zdecydowanie lepszy.
W taki sposób działa sterowanie silnikami w pFudzie. Przypatrzmy się punktowi 4. pFud zaczyna zawsze od włączonego "światła". Jednak, co by się stało, gdyby podczas jazdy 20% mocy naprzód, coś przestawiło polaryzację (czyli właśnie początkową pozycję w punkcie 4)? Silniki dostałyby 80% mocy (sporo upraszczam i kłamię w tym punkcie). Przy czym, musiałoby się to przestawić na wszystkich czterech kanałach PWM. Jeśli przestawiłoby się na jednym, jedno koło jechałoby 20% do przodu, a drugie 80% do przodu. I tak właśnie wyglądał stan berserk robota, na który trafiałem od dłuższego czasu.
Po dłuższych badaniach, okazało się, że w rejestrze ustawień modułu PWM nie ma informacji o tym, że polaryzacja została przestawiona. Robot nie wie, że coś jest nie tak, więc skoro nie może sam wykryć, nie może sam tego naprawić. Stąd też, byłem zmuszony zastosować tytułowy ugly hack: reset kanałów PWM co 64 cykle głównej pętli. Przypuszczalnie, pFud będzie mógł szaleć około pół sekundy, zanim sterowanie nie wróci do normy.
!Ona (0/0)