Port szeregowy lub równoległy jako generator PWM

fatalbomb

Generator PWM (PWM - Pulse Width Modulation) jest generatorem, na wyjściu którego pojawia się sygnał o zmiennym współczynniku wypełnienia. W Pascalu (lub w czymkolwiek innym) bardzo łatwo jest coś takiego stworzyć. Trzeba tylko podłączyć coś do odpowiedniego wyjścia w komputerze.

Przykładowy kod może wyglądać tak:

var PwmCounter, Pwm1a: Byte;
begin
  PWM1a := 96;
  PWMCounter := 0;
 repeat
  Inc (PWMCounter);
   { Ten kod stosujemy dla portu szeregowego i używamy linii DTR lub RTS }
  if PWM1a < PWMCounter then    Port [Baza + 4] := 1 { Bit o wadze 1 ustala stan linii DTR, a bit o wadze 2 - linii RTS } else Port [Baza+4] := 0;
   { Ten kod stosujemy dla portu szeregowego i używamy linii TxD }
  if PWM1a < PWMCounter then    Port [Baza + 3] := 64 { Bit o wadze 64 ustala stan linii TxD - tak zwany Break TxD } else Port [Baza+3] := 0;
   { Ten kod stosujemy dla portu równoległego i wykorzystujemy któreś z wyjść transmisyjnych }
  if PWM1a < PWMCounter then    Port [Baza] := 1 { Bit o wadze 1 ustala stan linii D0, bit o wadze 2 - D1, itd. } else Port [Baza] := 0;
   { Ten kod stosujemy dla portu równoległego i wykorzystujemy któreś z wyjść pomocniczych }
  if PWM1a < PWMCounter then    Port [Baza+2] := 16 else Port [Baza] := 0;
  end;
 until keypressed;
end;

Oczywiście wybieramy tylko jeden z kodów. Zmieniając wartość zmiennej PWM1a (nazwa zapożyczona z procesorów AVR) zmieniamy współczynnik wypełnienia impulsów

Możliwe zastosowania

  • Przetwornik C/A (wpinając kondensator o odpowiedniej pojemności pomiędzy wyjście a masę }
  • Sterowanie wskazówkowym miernikiem (nie potrzeba kondensatora, ponieważ sama bezwładność wskazówki zapewnia wymaganą stabilność)
  • Regulacja głośności podłączonego głośnika (trzeba dobrać częstotliwość)

Czy można użyć przerwania 1Ch?

Niestety taki kod wymaga do prawidłowego działania ciągłej obsługi przez komputer. Zastosowanie przerwania 1Ch nie wchodzi w grę, ponieważ jest ono wywoływane... za rzadko. Podłączenie miernika wskazówkowego (zakres do 250 uA) do portu obsługiwanego przez przerwanie RTC powodowało "merdanie" wskazówki... więc wyglądało to nie najlepiej.

Co podstawić pod zmienną Baza?

PortWartość zmiennej (szesnastkowo)
COM 1 3F8
COM 2 2F8
COM 3 3E8
COM 4 2E8
LPT 1 378
LPT 2 278

1 komentarz

Przerwanie 1Ch można przecież podkręcić żeby było wykonywane częściej... Chyba, że to te nie wystarczy...