logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[attiny2313][BASCOM] Generator PWM

maciek_nh 26 Wrz 2008 16:39 6183 15
  • #1 5573811
    maciek_nh
    Poziom 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 5573933
    robi667
    Poziom 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 5574117
    maciek_nh
    Poziom 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 5574295
    robi667
    Poziom 18  
    maciek_nh napisał:
    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 napisał:
    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 5574333
    maciek_nh
    Poziom 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 5574916
    robi667
    Poziom 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 5575173
    robi667
    Poziom 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 5575400
    dawid512
    Poziom 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 5576604
    maciek_nh
    Poziom 12  
    To pierwsze przepisane z książki Pana Góreckiego....
  • #11 5578371
    Darektbg
    Poziom 21  
    robi667 napisał:
    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 5599028
    maciek_nh
    Poziom 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 5600068
    dawid512
    Poziom 32  
    Cytat:
    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 5641678
    maciek_nh
    Poziom 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 5641741
    Konto nie istnieje
    Poziom 1  
  • #16 5641753
    maciek_nh
    Poziom 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.
REKLAMA