Cześć.
Powiedzcie mi jak można zrealizować programowo sterowanie PWM pisząc w C trzema niezależnymi wyjściami dla uC4051
Trzykanałowy programowy PWM dla uC4051 w C
-
ZbeeGin
Licznik sprzętowy T0 (podstawa czasu - krótka), przerwanie z T0 w którym wkładasz potrójny licznik programowy i porównywanie zawartości z wirtualnymi trzema rejestrami wypełnień, sterowanie portami (H, L) i... prawie gotowe.
Najprościej zrobić to w trybie FastPWM (liczenie tylko w górę). PWM może być 8 bitowy, 16bitowy... itd do granic dostępnej pamięci.
Najprościej zrobić to w trybie FastPWM (liczenie tylko w górę). PWM może być 8 bitowy, 16bitowy... itd do granic dostępnej pamięci.
A mogę mieć prośbę abyś mi napisał taki przykładowy program.
Chodzi mi o to że spotkałem się z takimi dwoma przypadkami. W obu mam przewanie od przepełnienia licznika. To mi się zgadza, ale w jednym na samym początku każdego przerwania wyjścia PWM są zerowane a potem jest sprawdzane czy zmienna określajaca współczynnik jest wieksz czy mniejsz. Nie wiem po co to zerowanie na początku. Druga sytuacja to sam test czy zmienna ze współczynnikiem jest mniejsza to wystawiany jest np 1 a jak wieksza to 0.
Mam nadzieję ze nie namotałem czegoś w tym opisie.
Chodzi mi o to że spotkałem się z takimi dwoma przypadkami. W obu mam przewanie od przepełnienia licznika. To mi się zgadza, ale w jednym na samym początku każdego przerwania wyjścia PWM są zerowane a potem jest sprawdzane czy zmienna określajaca współczynnik jest wieksz czy mniejsz. Nie wiem po co to zerowanie na początku. Druga sytuacja to sam test czy zmienna ze współczynnikiem jest mniejsza to wystawiany jest np 1 a jak wieksza to 0.
Mam nadzieję ze nie namotałem czegoś w tym opisie.
-
ZbeeGin
Zerowanie musi być. Inaczej stan wysoki na linii wyjściowej ustawiłby się raz i koniec kropka. Testowanie czy wartość jest mniejsza lub większa nie ma zbytnio sensu. Prosty przykład. W czasie wystawiania stanu wysokiego zmieniasz wypełnienie. Procedura stwierdza, że teraz znów wartość jest mniejsza i zeruje port. Powstaje jeden impuls który nijak się ma do zadanego wypełnienia - tzw. glitch.
Z pisaniem programu musisz poradzić sobie sam. Naprawdę nie ma tam żadnej filozofi - rozrysuj (rozpisz) sobie algorytm, a prawie samo się napisze.
Z pisaniem programu musisz poradzić sobie sam. Naprawdę nie ma tam żadnej filozofi - rozrysuj (rozpisz) sobie algorytm, a prawie samo się napisze.
Dobrze, a czy możesz mi to sprawdzić czy ma sens.
Kod: Zaznacz cały
void ObslugaTimera1 (void) interrupt 3 using 2
{
TR1=0;
if (Zmienna>PWM[1]){WY1=0;}else {WY1=1;}
if (Zmienna>PWM[2]){WY2=0;}else {WY2=1;}
if (Zmienna>PWM[3]){WY3=0;}else {WY3=1;}
if(Zmienna==250){Zmienna=0;}
else{ Zmienna+=10;}
TH1=0xFF; //np.
TL1=0x00;
TR1=1;
}