[Bascom] Generator sygnału prostokątnego

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. 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
Awatar użytkownika
malcik
-
Posty: 8
Rejestracja: 23 mar 2008, 15:22
Lokalizacja: Płock
Kontakt:

[Bascom] Generator sygnału prostokątnego

Post autor: malcik » 19 kwie 2008, 9:52

Witam
Potrzebuję generatora sygnału prostokątnego np. do migania diodą z tym, że czas świecenia diody będzie stały a muszę zmieniać czas zgaszenia diody - odstęp miedzy kolejnymi "świeceniami" diody. Czas ten muszę regulować za pomocą potencjometru.
Naskrobałem coś takiego :

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 4000000

Config Timer1 = Pwm , Pwm = 10 , Prescale = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down       'Konfiguracja Timera

Config Portd = 127                                          'Pd.0 i Pd.1 jako wejścia
Portd = 127

Ddrb = &B11111111                                           'Odblokowanie globalnego wyjścia OC1

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Start Timer1

Pwm1a = 1023
Dim A As Word
A = 0

Do
  A = Getadc(0)
 Pwm1b = A
Loop : End
Czy to zadziała? W symulacji co prawda zmieniając suwakiem wartość ADC0 zmienia się wartośc zmiennej A... no i w sumie to tylko tyle.. Czy tym sposobem rozwiąże mój problem?

Pozdrawiam

ZbeeGin

Post autor: ZbeeGin » 19 kwie 2008, 13:03

Przede wszystkim, aby coś było widać to Precaler nie może być na tak niskim poziomie. Obecnie PWM będzie generował przebieg 250kHz = 4MHz / 8 / 2 Dlaczego? 4MHz przelatuje przez prescaler o stopniu podziału równym 8, a ponieważ PWM pracuje w trybie Phase Correct licznik liczy raz w dół raz w górę i występują dwa porównania stąd 2 we wzorze.
Nawet jak przestawisz Prescaler na 1024 to przy tej częstotliwości rezonatora będzie to dalej zbyt dużo = 1,95kHz. Zatem migania nie zobaczysz.

Po drugie. PWM działa na zasadzie regulacji wypełnienia, która zakłada, że czasy stanu wysokiego i niskiego są różne. Ale nie są one niezależne, gdyż częstotliwość takiego przebiegu będzie stała! Zatem regulując czas zgaszenia, regulujesz tym samym czas zapalenia diody. A więc nie spełnią się Twoje oczekiwania.


Trzeba wykorzystać Timer i przerwania jego w inny sposób. Niech najpierw timer odliczy stały czas włączenia diody. Gasisz diodę i ładujesz nową wartość do licznika - tą zmienną określającą czas wyłączenia i czekasz na przerwanie by móc znów zapalić diodę i tak w kółko.
Proponuję skorzystać z możliwości jakie oferują przerwania CAPTURE, a całość się znacznie uprości.

ODPOWIEDZ