W poprzednich częściach cyklu przedstawiliśmy sposoby sterowania liniami GPIO oraz obsługę przetworników ADC i DAC w środowisku .NET. Kolejny przykład poświęcamy prezentacji sposobom generacji przebiegów PWM za pomocą wyspecjalizowanych timerów wbudowanych w mikrokontrolery STM32.

Obsługa generatorów PWM

Generator PWM (ang. Pulse-Width Modulation – modulacja szerokości impulsów) służy do generowania przebiegu prostokątnego o określonej szerokości impulsu. Sygnał PWM generowany przez mikrokontroler jest sygnałem dwustanowym – zmienia się między stanem wysokim a niskim. Wbudowane w mikrokontroler timery mogą pełnić funkcję generatorów PWM. Pracując z zestawem uruchomieniowym nie trzeba wgłębiać się w zasadę działania i budowę timerów, ponieważ w bibliotece zestawu wyszczególniono 7 kanałów PWM.

Do obsługi generatorów PWM służy klasa PWM znajdująca się w przestrzeni nazw Microsoft.SPOT.Hardware. W celu wykorzystania klasy należy do programu dodać referencję Microsoft.SPOT.Hardware.PWM. Ponieważ metody opisującej klasy należy do grupy metod instancji należy dla każdego kanału stworzyć obiekt typu PWM. Parametry generatora można ustawić w konstruktorze oraz w trakcie działania programu. Poniżej przedstawiono prosty program wykorzystujące wszystkie możliwe kanały PWM.

 

 

Zawsze należy włączyć dany generator za pomocą metody Enable(). Istnieje również metoda Disable() wyłączająca kanał. W celu zmiany wypełnienia lub częstotliwości w trakcie działania programu wystarczy wpisać pożądaną wartość do zmiennych obiektu kolejno DutyCycle oraz Frequency.

Dla kanałów PWM0 – PWM3 oraz PWM4 – PWM6 trzeba ustawić tą samą częstotliwość generowanego sygnału, ponieważ są podłączone do wspólnego timera (kolejno TIM1 i TIM4). Poniższy rysunek przedstawia otrzymane rezultaty zobrazowane na cyfrowym oscyloskopie.

 

 

Jak łatwo zauważyć częstotliwość oraz wypełnienia posiada lekkie odchyłki od wartości ustawionej. Teoretycznie można ustawić bardzo dużą częstotliwość generowanego przebiegu, jednak w praktyce nie jest to możliwe. Poniżej przedstawiono sygnał o wyplenieniu 10% i częstotliwości 1 MHz – przebieg jest nieco zniekształcony.

 

Sterowanie diodą RGB

Generatory PWM mogą pracować w różnorakich zastosowaniach od płynnej regulacji obrotów silnika po przetworniki DAC (z filtrem dolnoprzepustowych o małej stałej czasowej). Za pomocą generatora PWM można sterować jasnością świecenia diody LED stosując odpowiednio dużą częstotliwość. Diody RGB zawierają w swojej strukturze trzy diody LED ze wspólną anodą lub katodą emitujące światło o trzech podstawowych barwach (czerwonej, zielonej oraz niebieskiej), z których można teoretycznie uzyskać każdy kolor. Na poniższym rysunku przedstawiono sposób podłączenia diody RGB do mikrokontrolera.

 

Poniższy program steruje diodą RGB ustawiając losowe kolory:

 

Klasa RGB zawiera jeden konstruktor ustawiający numery kanałów PWM, do których podłączona jest dioda RGB. Metoda Enable()włącza diodę natomiast metoda Disable() wyłącza diodę poprzez włączenie bądź wyłączenie generatorów PWM. Metody SetColor(), SetRandomColor() ustawiają kolejno zadany oraz losowy kolor za pomocą zmiany wypełnienia sygnału PWM. Do losowania liczb pseudolosowych stworzono obiekt typu Random, a metoda NextDouble() generuje pseudolosowe liczby z zakresu od 0 do 1, co odpowiada bezpośrednio wpisywanemu wypełnieniu. Lepszy efekt wizualny sprawia płynne zmienianie kolorów. Poniższy fragment programu przedstawia ideę płynnej zmiany koloru diody:

 

 

Za pomocą stałej delay_time można ustawić szybkość zmiany barw diody RGB. W ćwiczeniu wykorzystano diodę ze wspólną anodą. Stosując diodę ze wspólną katodą wystarczy zmienić na przeciwny parametr invert w konstruktorze obiektów typu PWM.

W celu dołączenie drugiej diody RGB wystarczy stworzyć nowy efekt i zastosować te same metody. Oczywiście należy pamiętać, że na każdą diodę RGB należy zarezerwować 3 kanały PWM. Stosowanie drugiej diody ma sens jedynie wówczas, gdy diody mają w jednej chwili świecić w różnych kolorach – w przeciwnym przypadku wystarczy diody połączyć równolegle stosując klucze tranzystorowe (maksymalna obciążalność linii mikrokontrolera wynosi 25 mA). Na poniższym filmie przedstawiono uzyskane efekty wizualne za pomocą powyższych programów.

Krzysztof Gońka