Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[attiny2313][BASCOM] Generator PWM

maciek_nh 26 Sep 2008 16:39 5994 15
  • #1
    maciek_nh
    Level 12  
    Witam przepisałem z książki Pana Góreckiego taki programik:

    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down
    'Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down
    'Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
    Pwm1a = 255
    Do
    If Pind.0 = 0 Then Decr Pwm1a
    If Pind.1 = 0 Then Incr Pwm1a
    'Debounce Pind.0 , 0 , Zmniejsz , Sub
    'Debounce Pind.1 , 0 , Zwieksz , Sub
    'Portb.3 = 1
    'Incr Pwm1a
    If Pwm1a = 250 Then Pwm1a = 0
    Cls
    Lcd Pwm1a
    Lowerline
    Lcd Timer1
    Waitms 100
    
    Loop
    End
    
    Zmniejsz:
    Pwm1a = Pwm1a + 100
    'Toggle Portb.3
    Return
    
    Zwieksz:
    Pwm1a = Pwm1a - 100
    Return
    
    


    Dołączam diode LED do portu PB.3 ale dioda w ogóle nie świeci. Jak zmierzyłem napięcie to było ono rzędu 0,1 V. Pomyślałem ze dioda LED nie startuje tak już od 0,7V. Podłączyłem tranzystor przez rezystor do PB.3 emiter do masy w kolektorze wiatraczek (60Ω) i dalej do +12V. I dalej nie działa. Jak dałem na portb.4 = 1 to wiatraczek normalnie działał. Co źle robię że mi to nie startuje ??
  • #2
    robi667
    Level 18  
    Pind.0 i Pind.1 to są przełączniki zwiększające/zmniejszające wypełnienie sygnału PWM? Podłączyłeś je do Vcc bądź GND, czy wiszą w powietrzu? Możesz dołączyć schemat? W momencie startu nie ma prawa nic świecić - gdyż ustawiłeś wypełnienie Pwm1a = 255.
    Do potestowania PWM proponuję Ci poniższy kod, który stopniowo rozjaśnia/przygasza na zmianę diody podłączone do linii wyjściowych OC1A i OC1B.
    
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    Dim I As Byte
    Do
     For I = 0 To 255
      Pwm1a = I
      Pwm1b = I
      Waitms 4
     Next I
     For I = 255 To 0 Step -1
      Pwm1a = I
      Pwm1b = I
      Waitms 4
     Next I
    Loop
    End
  • #3
    maciek_nh
    Level 12  
    Przełączniki dołączone do pind.0/1 są na stałe podłączone do Vcc. Po naciśnięciu na ten port jest podawane "0". Jeszcze jakbys mi mógł wytłumaczyć o co chodzi z Compare A i compare B. Clear up/down mniej więcej kojarzę o co chodzi.
  • #4
    robi667
    Level 18  
    maciek_nh wrote:
    Przełączniki dołączone do pind.0/1 są na stałe podłączone do Vcc.

    Ale czy w momencie nie naciśnięcia przycisku, pin jest podpięty pod Vcc albo GND? Jeżeli nie jest do niczego podpięty, to może panować na nim stan nieustalony.
    Przy rozwartych przyciskach proponowałbym, aby do linii dołączone były wewnętrzne rezystory podciągające wymuszające stan wysoki. Służy do tego polecenie Set Portd.0. Wciśnięcie przycisku niech dołącza do GND.

    maciek_nh wrote:
    Jeszcze jakbys mi mógł wytłumaczyć o co chodzi z Compare A i compare B. Clear up/down mniej więcej kojarzę o co chodzi.

    Compare A PWM określa tryb pracy generatora PWM. Clear Up zlicza licznik w górę, Clear Down w dół.
    Samo Compare to polecenie konfigurujące OC1A lub OC1B. Myślę, że pan Piotr Górecki opisał to w książce.
  • #5
    maciek_nh
    Level 12  
    1. A czy w ten sposób tzn przez generator PWN można sterować wiatraczkami. Chodzi mi o to że w zależności od temperatury wolniej/szybciej obracał by się wentylator.
    2. A dajmy na to że chciałbym podłączyć sobie nie jeden ale 4 wentylatory i żeby każdy można było regulować oddzielnie. Czy jest to możliwe do zrealizowania na procesorze np atmega8? Albo ja jakim innym.
    3. I ostatnie. Czy jest jakaś inna możliwość sterowania tranzystorem w sposób analogowy ? Czyli nie chodzi mi o to żeby był tylko stan "0" lub "1" tylko również jakieś pośrednie.
  • #6
    robi667
    Level 18  
    Ad.1. Oczywiście! Pomiar temperatury możesz w prosty sposób zrealizować cyfrowym układem DS18B20 firmy Dallas Semiconductor. Wydaje mi się, że odpowiedni układ i kod jest opisany w książce, o której wspominałeś. Jeśli nie, na pewno jest w książce Piotra Wiązani "Programowanie mikrokontrolerów AVR w języku Bascom". Na elektrodzie też bez problemu znajdziesz odpowiednie materiały.
    Ad.2. Może być na ATmega8, albo na innym AVR z czterema kanałami PWM. To również było na elektrodzie, choćby i tutaj.
    Ad.3 Tranzystor przewodzi albo nie przewodzi. Co rozumiesz przez pośredni stan? Po to właśnie się stosuje PWM, żeby regulować średnią wartość napięcia.
  • #8
    robi667
    Level 18  
    No dobrze, przegiąłem. Jest tak, jak charakterystyki przedstawiają, ale w praktyce tranzystor w roli przełącznika przechodzi szybko do stanu przewodzenia. Czy może się wygłupiłem i mam zrewidować swoją wiedzę o tranzystorach? :>
  • #9
    dawid512
    Level 32  
    Lol ale śmieszny program np.
    If Pind.0 = 0 Then Decr Pwm1a 
    nie wiedziałem ze można od razu zmniejszać wartość pwmu operując bezpośrednio na rejestrze :P Ja bym do niego wpisywał jakąś zmienna.

    Następnie:
    'Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111 
    Nie wiem czy wiesz ale ta linijka kodu jest komentarzem a powinna ustawiać portb jako wyjście i 2 piny portu D jako wejście.
  • #10
    maciek_nh
    Level 12  
    To pierwsze przepisane z książki Pana Góreckiego....
  • #11
    Darektbg
    Level 21  
    robi667 wrote:
    praktyce tranzystor w roli przełącznika przechodzi szybko do stanu przewodzenia.

    Chyba raczej w stan nasycenia. Tranzystor w roli przełącznika jest albo w stanie nasycenia(złącze BE i BC są spolaryzowane w kierunku przewodzenia) albo w stanie zatkania(BE i BC spolaryzowane w kierunku zatkania)
  • #12
    maciek_nh
    Level 12  
    Czyli jeśli dobrze rozumiem z tego co przeczytałem w tematach podanych wyżej Attiny2313 ma 4 kanały PWM. 2 są powiązane z Timer1 a 2 pozostałe z Timer0. I mam pytanie czy te dwa kanały z timer1 mogą pracować z różną częstotliwością ? Czy Timer0 który jest 8 bitowy pozwala na generacje sygnału PWM tylko poprzez napsanie programu zaświeć diodę zaczekaj 1s zgaś diodę ? I czy można mieć dwa kanały z różną częstotliwością z timer0.
  • #13
    dawid512
    Level 32  
    Quote:
    Czy Timer0 który jest 8 bitowy pozwala na generacje sygnału PWM tylko poprzez napsanie programu zaświeć diodę zaczekaj 1s zgaś diodę ?


    Częstotliwość możesz mieć inna ale tylko poprzez użycie 2 timerów. Timer0 generuje sygnał o jakiejś częstotliwości a Timer1 o innej. Jeżeli użyjesz jednego z nich to możesz na Kanale A i B zmieniać ale tylko wypełnienie.
  • #14
    maciek_nh
    Level 12  
    Mam pytanie jak skonfigurować timer0 który jest 8 bitowy aby pracował jako generator PWM ?

    Mam coś takiego:
    
    
    
    $regfile = "attiny2313.dat"
    Config Portd = &B1111100
             Portd = &B1111111
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.2 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64
    Config Timer0 = Pwm , Prescale = 1                          'Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64
    Dim I As Byte
    
    Pwm0a = 200
    Do
     'For I = 0 To 255
     'Cls
     'Lcd Pwm1a
      'Pwm1a = I
      'Pwm1b = I
     ' Waitms 2
     'Next I
     'For I = 255 To 0 Step -1
     ' Pwm1a = I
     ' Pwm1b = I
      'Waitms 2
     'Next I
    
    Debounce Pind.0 , 0 , Zwieksz , Sub
    Debounce Pind.1 , 0 , Zmniejsz , Sub
    
    
     'If Pwm1a = 255 Then Pwm1a = 0
    
    
    Waitms 1
    Loop
    End
    
    Zwieksz:
    Pwm0a = Pwm0a + 50
    'Pwm1b = 0
    Return
    
    Zmniejsz:
    Pwm0a = Pwm0a - 50
    'Pwm1b = 200
    Return
    
    


    Tranzystor jest podłączony do nogi 14 uC attiny2313
  • #15
    Anonymous
    Level 1  
  • #16
    maciek_nh
    Level 12  
    Wiem mniej więcej jak zrobić generator PWM programowo. Ale czy da się zrobić generator PWM na timerze0 sprzętowo. Wg katalogu da się tylko nie wiem jak to zapisać w Bascomie.