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

[bascom] Atmega8 Bascom – jak płynnie regulować częstotliwość PWM 10Hz–100kHz i wyświetlać?

piotrdan 01 Lis 2008 19:39 7524 17
REKLAMA
  • #1 5690985
    piotrdan
    Poziom 20  
    Posty: 361
    Pomógł: 18
    Ocena: 109
    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
  • REKLAMA
  • #2 5691487
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    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
  • REKLAMA
  • #3 5692472
    ZbeeGin
    Poziom 39  
    Posty: 4329
    Pomógł: 605
    Ocena: 463
    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.
  • REKLAMA
  • #4 5695394
    piotrdan
    Poziom 20  
    Posty: 361
    Pomógł: 18
    Ocena: 109
    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
  • #5 5695490
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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!!
  • #6 5695741
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    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
  • #7 5695765
    piotrdan
    Poziom 20  
    Posty: 361
    Pomógł: 18
    Ocena: 109
    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
  • #8 5695784
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    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
  • #9 5725617
    vito86
    Poziom 10  
    Posty: 39
    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.
  • #10 5727235
    marek-c
    Poziom 19  
    Posty: 257
    Pomógł: 22
    Ocena: 18
    zastosuj lm7805
  • #11 5728515
    vito86
    Poziom 10  
    Posty: 39
    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ć.
  • #12 5729392
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    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
  • REKLAMA
  • #13 5730975
    vito86
    Poziom 10  
    Posty: 39
    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
  • #14 5732357
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Bez sensu, po co potencjometr? W nocie katalogowej do LM jest schemat z szeregiem rezystorów i tranzystorów sterujących:
    [bascom] Atmega8 Bascom – jak płynnie regulować częstotliwość PWM 10Hz–100kHz i wyświetlać?

    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
  • #15 5732579
    vito86
    Poziom 10  
    Posty: 39
    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.
  • #16 5741145
    greg_001
    Poziom 12  
    Posty: 45
    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
  • #17 5741177
    ZbeeGin
    Poziom 39  
    Posty: 4329
    Pomógł: 605
    Ocena: 463
    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ęć.
  • #18 5947546
    piotrdan
    Poziom 20  
    Posty: 361
    Pomógł: 18
    Ocena: 109
    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 :)


    
    $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

Podsumowanie tematu

✨ Dyskusja dotyczy możliwości płynnej regulacji częstotliwości PWM w zakresie od 10 Hz do 100 kHz na mikrokontrolerze Atmega8 programowanym w Bascom. Wskazano, że do uzyskania PWM o wysokiej częstotliwości (np. 100 kHz) potrzebne jest wysokie taktowanie CPU (około 12,8–25,6 MHz) oraz odpowiednie ustawienie rejestrów timera, zwłaszcza wartości TOP w Timerze1 i przeskalowanie wartości OCR1A/OCR1B. Proponowano wykorzystanie dwóch timerów: Timer0 do generowania PWM z regulowanym wypełnieniem, a Timer1 w trybie CTC do generowania sygnału taktującego Timer0, co pozwala na regulację częstotliwości. Omówiono tryb CTC, który umożliwia automatyczne zerowanie licznika i generowanie przerwań, co ułatwia precyzyjne sterowanie częstotliwością. Zwrócono uwagę na kompromisy między dokładnością częstotliwości a wypełnieniem PWM oraz na konieczność zmiany wartości TOP zamiast preskalera dla płynnej regulacji. Autor pytał o konkretne komendy i ustawienia w Bascom do sterowania Timerem1, a także o ograniczenie zakresu częstotliwości do niższych wartości. W dalszej części dyskusji pojawiły się pytania dotyczące zasilania mostka H i regulacji napięcia wyjściowego za pomocą stabilizatorów LM317 oraz potencjometru cyfrowego DS2890 sterowanego przez mikrokontroler. Poradzono stosowanie dwóch osobnych mostków H z różnymi napięciami zasilania lub przełączanie napięcia zasilania mostka za pomocą tranzystorów. Omówiono też kwestie doboru radiatorów do stabilizatorów i alternatywne metody regulacji napięcia. Autor podzielił się fragmentem kodu Bascom z implementacją generatora częstotliwości i prosił o pomoc w poprawie oraz integracji generatora PWM, zwłaszcza w kwestii taktowania z wejścia T1 i obsługi przerwań.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA