Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[bascom] generator częstotliwości Atmega8 PWM

piotrdan 01 Lis 2008 19:39 6660 17
  • #1 01 Lis 2008 19:39
    piotrdan
    Poziom 19  

    Witam , mam pytanko związane z Atmegą8, czy jest możliwe z poziomu Bascoma utworzenie programu, który stworzył by generator PWM w którym można płynnie regulować częstotliwość tego generatora w jakimś szerokim zakresie np. od 10Hz do 100kHz . Regulacja wypełnienia jest oczywiście prosta ale nie wiem czy jest mozliwość sterowania częstotliwością . Ważne aby ta czestotliwość była dodatkowo wyświetlana. A może poprostu inny procesor z rodziny AVR sobie z tym poradzi lub jakas kombinacja układów ? Proszę o podpowiedź .Pozdrawiam Piotr

    0 17
  • #2 01 Lis 2008 21:37
    Dr.Vee
    VIP Zasłużony dla elektroda

    Zależy od rozdzielczości PWM. Policzmy. Potrzebowałbyś taktowania CPU 25,6 MHz do 8-bitowego PWM @ 100 kHz. Ale przy 7-bitach wystarczy już 12,8 MHz.

    Skalowanie częstotliwości robisz zmieniając wartość TOP Timera1, ale wtedy musisz też przeskalować odpowiednio wartość OCR1A/OCR1B.

    Po resztę szczegółów zapraszam do datasheeta Atmega8, bo jak widać jeszcze do tej dokumentacji nie dotarłeś :]

    Pozdrawiam,
    Dr.Vee

    0
  • #3 02 Lis 2008 10:00
    ZbeeGin
    Poziom 38  

    A może by tak dwa liczniki zaprzęgnąć do jednego zadania...

    Timer0 byłby generatorem PWM 8-bit z regulowanym wypełnieniem, z zewnętrznym taktowaniem z koncówki T0. Timer1 byłby generatorem o regulowanej częstotliwości (Tryb CTC) i za pomocą przerwań zmieniałby stan końcówki wyjściowej, którą to podłączysz do wejścia T0.

    0
  • #4 02 Lis 2008 22:47
    piotrdan
    Poziom 19  

    Witam , dzięki za podpowiedź :) jeśli chodzi o datascheet, to przeglądałem, ale nie od razu trzeba pojąć to w mgnieniu oka :) . Propozycja ZbeeGin wydaje się dużo prostsza i przejrzysta. zrozumiałem zasadę działania takiej konstrukcji, Timer0 ma być generatorem PWM a Timet1 ma odmierzać odcinki czasu i przepełnienie wysyłać na końcówkę taktującą Timer0. Jak się machnąłem to poprawcie :) , nie rozumiem tylko trybu CTC :( . Pozdrawiam Piotr

    0
  • #5 02 Lis 2008 23:10
    Freddie Chopin
    Specjalista - Mikrokontrolery

    pewnie - lepiej zaprzac dwa timery do zadania ktore wystarczajace jest dla jednego oraz rozkazu mnozenia i dzielenia... ja rozumiem, ze matematyka nie jest extremalnie przejrzysta, ale czy majac dana czestotliwosci i wypelnienie naprawde trzeba miec tez doktorat zeby przeksztalcic to na parametry timera?

    przeciez to sa DWA wzory.

    4\/3!!

    0
  • #6 03 Lis 2008 01:31
    Dr.Vee
    VIP Zasłużony dla elektroda

    Propozycja z 2 timerami może jest koncepcyjnie prostsza, ale zobaczmy - zalecana fext dla timera powinna być < fclk/2.5, czyli TOP timera generującego ustawiasz na min. 2 -> fext = fclk/3 (wypełnienie 1/3 lub 2/3). Stąd widać, że potrzebujesz 3x większej częstotliwości zegara niż w przypadku rozwiązania z pojedyńczym timerem.

    Poza tym z dwoma timerami masz mniejszą dokładność wyboru częstotliwości PWM. Z drugiej strony przy niewielkich zmianach fpwm w rozwiązaniu z jednym timerem ciężko będzie utrzymać dokładność wypełnienia. Jak zwykle jest coś za coś ;)

    W trybie CTC licznik/timer startuje od zera. Po dojściu do określonej wartości generuje przerwanie i w następnym cyklu sam się zeruje - przez to jest wygodniejszy, bo "bezobsługowy" i dokładniejszy :)

    Pozdrawiam,
    Dr.Vee

    0
  • #7 03 Lis 2008 01:57
    piotrdan
    Poziom 19  

    Dr.Vee , fajnie piszesz i tym razem coś tam zrozumiałem hihihihihihi, wiem że wdepnąłem na forum gdzie prawie rozmawia się asemblerem, zaraz ktoś mnie skwituje że asembler jest podstawą hehehehe, Ja niestety spocząłem na podstawach Bascoma. Może dla tego że kiedyś bawiłem się ośmio bitowcami ale to dawne czasy :) . Popatrzcie Panowie na to troszkę inaczej, Ja jestem dobry w innej dziedzinie i mógł bym pisać wywody i dziwić się dla czego ktoś tego nie rozumie :). Niestety nie jestem orłem w prockach ani nawet wróblem :) , Elektronicznie potrafię wykonać bez problemu ale jest problem z napisaniem programu. Chodzi mi o to jakich komend, funkcji, zmiennych albo ustawień powinienem użyć np do Timera1 aby sterować częstotliwością generatora (Timer0) PWM. Czy powinienem podzielić Timer1 preskalerem, czy sterowanie częstotliwością mam robic poprzez wpisywanie wartosci początkowej timera itd. Może z tym zakresem czestotliwości to przesadziłem myślę że 100kHz to chyba za dużo, może ograniczyć się do 10kHz no może troszkę więcej :) , To Wy wiecie na ile można sobie pozwolić :) . Pozdrawiam Piotr

    0
  • #8 03 Lis 2008 03:42
    Dr.Vee
    VIP Zasłużony dla elektroda

    Teraz ni z tego ni z owego zmieniasz wymagania projektowe - jak prawdziwy klient :] Napisz lepiej do czego Ci to potrzebne, bo tak to zgaduj-zgadula...

    Idź żesz w końcu poczytaj datasheeta... Wiesz już że masz użyć trybu CTC/PWM Timera1. Zobacz tabelkę 39.

    Tak naprawdę musisz w Timerze1 zrobić drugi PWM, z wypełnieniem ok. 50%. Nie ruszaj preskalera, tylko zmieniaj wartość TOP licznika (OCR1A) i ustaw wypełnienie wpisując wartość do OCR1B. Ustaw compare match np. na toggle przy A i toggle przy B. Koniec implementacji ;)

    A tłumaczeniem na bascoma to już niech kto inny się zajmie...

    Pozdrawiam,
    Dr.Vee

    0
  • #9 11 Lis 2008 13:18
    vito86
    Poziom 9  

    Cześć.
    Jestem początkujący dlatego chciałbym zaczepnąć porady. Chciałbym zrobić generator PWM na uC Atmega16. Na wyjściu ma byc przebieg +/-12V o zmienianej częstotliwości z pomocą klawiatury, oraz drugi przebieg +-5V także o zmienianej częstotliwości. Wybrałem Timer1,który ma 2 wyprowadzenia. Chodzi o to,że jest dostępne tylko 12V,więc po pierwsze trzeba zjechać do 5V dla uC,wyświetalcza. Zaciski PWM chcę podlłączyć do mostka typu H na MOS-ach,gdzie w zależności od nap.zasilania mostka i napięciach na wejściach jest +-12 o określonej częstotliwości. Teraz chciałbym to samo zrobic dla nap.zasilania mostka 5V.Nie wiem czy dobrze myślę,ale chciałbym uzyc potencjometru cyfrowego tak aby albo dawal 5 albo 12V;tylko,że nap.zasilania takiego potencjometru to zwykle 5V,które nie wiem jak uzyskać.Czy można po prostu zrobić to zwykłym potencjometrem?Czyli mam 2 problemy:jak przełączać zasilanie mostka oraz jak prawidlowo zmniejszyc napięcie do zasilania układu.

    0
  • #11 11 Lis 2008 23:10
    vito86
    Poziom 9  

    Dzieki.
    A czy mogę do wyboru napięcia zastosowac bufory,tzn.bramki trójstanowe;jedną na L drugą na H i gdy wcisne przycisk zmieni sie stan i drugie wejscie zostanie podlączone? Szukałem jakiegoś odpowiedniego układu,ale znalazlem takie na ok. 8V napięcia wejściowego na bufor;poza tym prąd w układzie chyba bedzie potrzebny ok.70mA?Mam LCD,matryce klawiatury,uC,mostek H i te bufory gdyby można było to zastosować.

    0
  • #12 12 Lis 2008 11:38
    Dr.Vee
    VIP Zasłużony dla elektroda

    Nie kombinuj za bardzo. Jeśli chcesz mieć dwa osobne PWMy, to po prostu zastosuj dwa mostki H, jeden zasilany z 5V, drugi z 12V.

    Jeśli chcesz mieć jeden PWM +/-5V lub +/-12V, to zastosuj osobne zasilanie dla mostka H i np. przełączaj napięcie wyjściowe dodatkowego stabilizatora (używasz np LM317). Możesz też zbudować coś na tranzystorach, np. 2 mosfety jeden z drenem na 5V, drugi z drenem na 12V, źródła zwarte, wysterowujesz albo jeden, albo drugi.

    PS. Bufory trójstanowe miałyby słabą wydajność prądową.

    Pozdrawiam,
    Dr.Vee

    0
  • #13 12 Lis 2008 19:21
    vito86
    Poziom 9  

    Dzieki. W takim razie zrobię to na dwóch stabilizatorach. Pozostaje kwestia potencjometru do LM317. Chciałbym to zrobic na potencjometrze cyfrowym sterowanym z klawiatury poprzez uC.Wybrałem DS2890.Nie wiem czy dobrze chcę to podłączyć. Na schemacie do potencjometru dochodzi MASTER BUS. Nie wiem czy to linia bezpośrednio z portu czy trzeba dodatkowy driver. W Atmedze16 za TWI odpowiadają SDA I SCL.
    Jeszcze taka sprawa praktyczna: od jakich wartości prądów należy stosować radiatory na stabilizatorach?


    http://pdfserv.maxim-ic.com/en/ds/DS2890.pdf

    https://obrazki.elektroda.pl/99_1226513602.jpg

    0
  • #14 12 Lis 2008 23:15
    Dr.Vee
    VIP Zasłużony dla elektroda

    Bez sensu, po co potencjometr? W nocie katalogowej do LM jest schemat z szeregiem rezystorów i tranzystorów sterujących:
    [bascom] generator częstotliwości Atmega8 PWM

    Co do radiatorów, to sobie policz. LM317 ma rezystancję cieplną "junction to ambient" 50 st. C/W, a max. temp. pracy 120 st. C. Zakładasz temperaturę otoczenia 40 st. C i obliczasz, że możesz mieć 1,6W strat w układzie.

    Pozdrawiam,
    Dr.Vee

    0
  • #15 13 Lis 2008 00:19
    vito86
    Poziom 9  

    Dziekuję za porady. Moc już wiem jak obliczać, jednak chciałbym zrobić to na potencjometrze cyfrowym;po prostu mam taki wymóg, dlatego prosiłbym o dalsze porady odnośnie podłączenia takiego układu.

    0
  • #16 15 Lis 2008 13:03
    greg_001
    Poziom 11  

    Jak dobrać wartości rezystorów kolektorowych, żeby mieć na Vout napięcia np 11,10,9,8,7,6 V? przy podaniu na Vin 12V

    -2
  • #17 15 Lis 2008 13:16
    ZbeeGin
    Poziom 38  

    greg_001 napisał:
    Jak dobrać wartości rezystorów kolektorowych, żeby mieć na Vout napięcia np 11,10,9,8,7,6 V? przy podaniu na Vin 12V

    Jak najszybciej... ściągnąć sobie notę katalogową układu LM317 i znaleźć wzór na obliczanie rezystancji R2 przy zakładanym R1 dla poszczególnych napięć.

    1
  • #18 04 Sty 2009 13:01
    piotrdan
    Poziom 19  

    Witam,
    udało mi się coś wyskrobać i zrobiłem na razie sam generator częstotliwości, właściwie jakoś tam działa ale chyba napisałem to dookoła , może ktoś spróbował by to jakoś poprawić. Nie dodałem jeszcze generatora PWM, próbowałem ale nie wychodziło mi, chciałem taktować go z wejścia T1 ale nie udało mi się to, nie wiem jak go zmusic do tego żeby czytał zegar z wejścia. Poza tym chyba jest problem z przerwaniami, bo jak włączę Timer1 jako PWM to wydaje mi się że, ze względu na zawiłość kodu z generatora częstotliwości mam jakieś dziwne reakcje procka. Obliczyłem że mój generator działa w zakresie od 50us do 12,75ms ale pewnie coś źle obliczyłem bo mam wrażenie że zakres jest inny hihihihihihihihi. Proszę ponownie o pomoc. pozdrawiam Piotr
    Tylko Panowie , nie linczujcie mnie od razu :)


    Code:

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

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
    Cursor Off

    Config Pinb.3 = Input                                       'przycisk 1
    Config Pinb.4 = Input                                       'przycisk 2
    Config Pinb.5 = Input                                       'Przycisk 3
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pind.0 = Output
    Config Pinb.0 = Output                                      'wyjscie generatora

                                'podciąganie przycisków
     Set Portb.3
     Set Portb.4
     Set Portb.5
                                'konfiguracja Timer0 jako timera
                                'z podziałem preskalera przez 8 = 1us

    Config Timer0 = Timer , Prescale = 8


    On Timer0 Odmierz_1us                   'przerwanie od przepełnienia
                                                          'Timer0 o etykiecie odmierz_1us
    Dim A As Integer                             'zmienna wyświetlająca czas w "us"




    Dim B As Byte                                 'zmiena ile razy zliczyć przerwanie
    Dim C As Byte                    'zmienna pomocnicza do czyszczenia LCD
    Dim D As Single                        'zmienna wyświetlająca czas w "ms"
    Dim F As Byte                           'zmienna ile razy wystąpiło przerwanie

    B = 255
    C = 0
    F = 0

    Enable Interrupts            'odblokowanie globalnego systemu
                                         'przerwań
    Enable Timer0                'odblokowanie przerwania od
                                        'przepełnienia Timer0

    Do                                'pętla główna właściwie tylko do wyświetlania

    If C = 100 Then             'co jakiś czas czyści LCD
       Cls
       C = 0
       End If

    If A >= 1000 Then         'warunki do wyświetlania czasu w us i ms
                 D = A / 1000
                 Locate 1 , 1
                 Lcd D ; "ms"

                 Else
                 Locate 1 , 1
                 Lcd A ; "us"

             End If

     Incr C
    Loop

    End                                    'koniec programu

    Odmierz_1us:                     'początek podprogramu obsługi
                                            'przerwania od przepełnienia
                                            'Timer0
     Load Timer0 = 50             'wartość początkowa Timer0
                                            'ustala na 50us

          Incr F
      If Pinb.3 = 0 Then           'obsługa przycisków zwiększ i zmniejsz
               Waitms 100                     'częstotliwość
               If Pinb.3 = 0 Then Incr B

             End If

      If Pinb.4 = 0 Then
               Waitms 100
               If Pinb.4 = 0 Then Decr B

             End If
         If B = 0 Then B = 1

     'porównanie wykonywanego przerwania z zadaną ilością przerwań
        If F = B Then   
     

           A = 50 * B        ' obliczenie do zmiennej czasu do wyświetlacza
           F = 0                 'zerowanie zmiennej licznikowej
           Toggle Portb.0     'zmień na przeciwny stan linii

      End If             


    Return                      'powrót z przerwania

    0