Trzykanałowy programowy PWM dla uC4051 w C

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Trzykanałowy programowy PWM dla uC4051 w C

Post autor: slawek55 » 15 sty 2008, 18:51

Cześć.
Powiedzcie mi jak można zrealizować programowo sterowanie PWM pisząc w C trzema niezależnymi wyjściami dla uC4051

ZbeeGin

Post autor: ZbeeGin » 15 sty 2008, 19:43

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.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 15 sty 2008, 19:52

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.

ZbeeGin

Post autor: ZbeeGin » 15 sty 2008, 20:00

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.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 15 sty 2008, 20:08

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; 
  
}

ODPOWIEDZ