Atmega 16 i 3 PWM

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
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Atmega 16 i 3 PWM

Post autor: M@ciej » 20 paź 2007, 16:27

Witam wszystkich :)

Używam procesora Atmega 16 i Bascoma i chciałbym zaimplementować na nim trzy wyjścia PWM. Dwa skonfigurowałem bez problemu jako Timer1 i użyłem pinów OC1A i OC1B, odpowiednio dla Pwm1A i Pwm1B.

Jak zaimplementować trzecie wyjście i na którym pinie? Domyślnie mam na OC2,ale mogę się mylić.

ZbeeGin

Post autor: ZbeeGin » 20 paź 2007, 16:50

Jak zaimplementować trzecie wyjście i na którym pinie? Domyślnie mam na OC2,ale mogę się mylić.
Może być OC0 (sterowane przez 8 bitowy Timer0) lub OC2 (sterowane przez 8 bitowy Timer2). Problem w tym, że:
- oba te liczniki są 8 bitowe, a licznik Timer1 jest 16-bitowy, zatem
- wszystkie kanały PWM musiałbyś mieć 8 bitowe jeśli mają być "takie same", a
- jeśli chodzi o sterowanie silnikami, falownikiem itp. to takie kombinacje mogą nie działać poprawnie, gdyż OC1A/OC1B nie będzie idealnie synchroniczny z OC0/OC2.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 20 paź 2007, 22:50

Nie chcę sterować silnikami,tylko 3-kolorową diodą LED,dlatego potrzebne mi są aż 3 kanały PWM :) Poza tym dla OC1A i OC1B pracuje już Timer1:

Kod: Zaznacz cały

Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Interrupts

Enable Timer1

Pwm1a = 128  ' wypełnienie 50% (na przykład)
Pwm1b = 64 ' wypełnienie 25%
Teraz chciałbym wykorzystać OC2, gdyż tam mam podłączony tranzystor sterujący 3-cią strukturą. Czy da się zastosować Timer0? Implementacja jak powyżej wykazuje błąd,ale czytałem, że można to zrobić inaczej - odwołując się bezpośrednio do rejestrów,nie wiem tylko jak tego dokonać, nie jestem aż tak dobry w te klocki.[/code]

ZbeeGin

Post autor: ZbeeGin » 21 paź 2007, 7:33

M@ciej pisze:Implementacja jak powyżej wykazuje błąd
Nie dziwię się, gdyż nie zadeklarowałeś jaki procesor będziesz używał.

Niepotrzebnie też włączasz przerwania. Chyba, że planujesz w przyszłości skorzystać z tego mechanizmu do synchronicznej zmiany wypełnień.
M@ciej pisze:Teraz chciałbym wykorzystać OC2, gdyż tam mam podłączony tranzystor sterujący 3-cią strukturą. Czy da się zastosować Timer0?
No, takich kombinacji to nie będzie. Jak OC0 to Timer0, jak OC2 to Timer2:

$regfile = "m16def.dat"
$crystal = 10000000

Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Timer2 = Pwm , Pwm = On , Prescale = 64 , Compare Pwm = Clear Down

Compare1a = 128 ' wypełnienie 50% (na przykład)
Compare1b = 64 ' wypełnienie 25%
Compare2 = 32 ' wypełnienie 12,5%

Do
nop
Loop

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 21 paź 2007, 9:29

obie dyrektywy mam tak napisane:

$regfile = "m16def.dat"
$crystal = 12000000

bo mam rezonator 12 MHz.Troche na wyrost,ale nie będę miał potem kłopotów z wydajnością,bo prócz sterowania 3-kolorową diodą LED układ będzie wykonywał także inne zadania, jak odświeżanie wyświetlacza LCD czy praca z jednym (na razie) a docelowo z dwoma przetwornikami AC.

Niemniej ta procedura co napisałeś niezmiernie mi się przyda i dziękuję ZbeeGin :)

ODPOWIEDZ