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?
Port | Wartość zmiennej (szesnastkowo) |
---|---|
COM 1 | 3F8 |
COM 2 | 2F8 |
COM 3 | 3E8 |
COM 4 | 2E8 |
LPT 1 | 378 |
LPT 2 | 278 |
Przerwanie 1Ch można przecież podkręcić żeby było wykonywane częściej... Chyba, że to te nie wystarczy...