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.

Prosty generator p.prostokątnego?

robiw 19 Gru 2012 20:13 3204 23
  • #1 19 Gru 2012 20:13
    robiw
    Poziom 26  

    Witam,
    Czasami przydałby się prosty generator przebiegu prostokątnego powiedzmy w zakresie 1Hz-1MHz (ew. 10MHz) z krokiem 1Hz (i wielokrotności) w związku z czym zrobiłem wstępne rozeznanie w zakresie rozwiązań:

    1. Zastosowanie zwykłego, 16-bitowego timera pracującego w trybie CTC -> wada bardzo słaba rozdzielczość regulacji, do tego brak możliwości ustawienia stałego kroku itd.
    2. DDS - skomplikowane rozwiązanie jak na takie skromne potrzeby.

    Są jakieś inne, alternatywne rozwiązania? robiw

    0 23
  • #2 19 Gru 2012 20:27
    janszy3643
    Poziom 29  

    Od siebie dodam generator z pętla PLL

    0
  • #3 19 Gru 2012 20:34
    BlueDraco
    Specjalista - Mikrokontrolery

    Na ATtiny25 z PLL możesz uzyskać rozdzielczość czasu trwania półokresu rzędu 16 ns. Z AVR chyba już nic więcej nie wyciśniesz. Na różnej maści Cortexach możesz zejść do 6..10 ns, na niektórych modelach TMS320F28xxx nawet poniżej 1 ns.

    0
  • #4 19 Gru 2012 20:40
    robiw
    Poziom 26  

    Problem w tym, że wg. mnie przy CTC nie jestem w stanie uzyskać dokładnie każdej częstotliwości z przedziału 1Hz-1MHz z krokiem 1Hz...robiw

    0
  • #5 19 Gru 2012 20:41
    BlueDraco
    Specjalista - Mikrokontrolery

    Można uzyskać dokładną częstotliwość, ale nie ze stałym krokiem 1 Hz. Za to masz stały krok okresu. To, czego chcesz, da się zrobić na TMS320F28xxx.

    0
  • #6 19 Gru 2012 20:46
    robiw
    Poziom 26  

    ...ale nie w ATmedze...robiw

    0
  • #7 19 Gru 2012 22:20
    94075
    Użytkownik usunął konto  
  • #8 19 Gru 2012 22:28
    robiw
    Poziom 26  

    Fajnie, ale musi być na AVR...robiw

    0
  • #9 20 Gru 2012 00:07
    piotrva
    Moderator na urlopie...

    Na timerze 16 bit + CTC uzyskasz na AVR 15Hz-1MHz z krokiem 15Hz.
    Jeśli chcesz większych rozdzielczości to musisz zawęzić zakres częstotliwości.
    Ewentualnie (jeśli program ma robić tylko to) to możesz odmierzać czas za pomocą kilku timerów np. 16 bit liczy z grubsza półokres, potem 1 lub 2 8-bitowe odmierzają dokładny czas i zmiana stanu pinu. Ale żeby to wtedy było np. 20Hz, a nie 20,001Hz to musiałbyś raczej pisać w ASM i dokładnie liczyć rozkazy procesora.

    0
  • #10 20 Gru 2012 00:31
    hajy
    Poziom 19  

    Witam

    A tak se gdybam, a gdyby połączyć dwa timery razem 8bit + 16bit, oba pracujące w trybie CTC "teoretycznie" wyszedłby licznik 24 bitowy.

    Pozdrawiam Romek

    0
  • #12 20 Gru 2012 09:12
    BlueDraco
    Specjalista - Mikrokontrolery

    To jest najpierw kwestia częstotliwości zegara, a potem dopiero długości liczników. Policz sobie na kartce papieru lub w arkuszu kalkulacyjnym, bez uwzględniania ograniczeń sprzętu, jakie wartości można uzyskać przez dzielenie częstotliwości np. 16 MHz przez kolejne liczby całkowite. Arytmetyki nie przeskoczysz i AVR nie ma tu nic do rzeczy.

    0
  • #13 20 Gru 2012 10:02
    94075
    Użytkownik usunął konto  
  • #14 20 Gru 2012 10:28
    tmf
    Moderator Mikrokontrolery Projektowanie

    piotrva napisał:
    Niestety AVR nie ma możliwości łączenia liczników kaskadowo - trzebaby to zrobić programowo, jak pisałem.


    Co nie do końca jest prawdą, bo w nowych AVRach (XMEGA) liczniki kaskadowo łączyć można.
    Co nie zmienia faktów, że z takimi założeniami problem jest nierozwiązywalny, kolega powyżej problem chyba jasno przedstawił :)

    0
  • #15 20 Gru 2012 10:53
    robiw
    Poziom 26  

    Dzięki za wszystkie odpowiedzi. Oczywiście przy częstotliwościach większych krok nie musi wynosić 1Hz a powiedzmy 10Hz, 100Hz czy nawet więcej jednak do jakiejś, założonej częstotliwości chciałbym by krok wynosił właśnie 1Hz.

    piotrva napisał:
    Na timerze 16 bit + CTC uzyskasz na AVR 15Hz-1MHz z krokiem 15Hz.


    Biorąc pod uwagę wzór na częstotliwość w trybie CTC nie bardzo to sobie wyobrażam.

    fOCnA = fclk_I/O / 2 ⋅ N ⋅ (1 + OCRnA)

    robiw

    0
  • #16 20 Gru 2012 11:06
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeju... Krok częstotliwości nie może być stały, bo funkcja 1/x nie jest liniowa, a jej wartości dla całkowitych x nie zawsze są wymierne. Proste? Stały może być krok okresu generowanego przebiegu, bo do timera zapisujesz czas, a nie częstotliwość. To podstawy matematyki, a nie wiedza o mikrokontrolerach. ;)

    0
  • #17 20 Gru 2012 11:45
    kamyczek
    Poziom 34  

    Programowo w asemblerze da się generować takie przebiegi licznik można stworzyć programowo nie tylko używając gotowego rozwiązania sprzętowego poza tym trzeba użyć bardzo stabilnego generatora kwarcowego !!!.

    0
  • #18 20 Gru 2012 11:47
    BlueDraco
    Specjalista - Mikrokontrolery

    Stabilny generator kwarcowy w połączeniu z asemblerem nie sprawią, że rozwinięcie dziesiętne (a nawet binarne) ułamka 1/3 stanie się skończone.

    0
  • #19 20 Gru 2012 11:51
    kamyczek
    Poziom 34  

    A co będzie jak zrobisz coś 3 razy szybciej ??? pomnóż to przez 3 i masz skończone rozwiązanie problemu .

    0
  • #20 20 Gru 2012 12:45
    BlueDraco
    Specjalista - Mikrokontrolery

    Czyli mam programowo zmieniać kwarc pędzący oscylator? dla 3 kHz wstawiam programowo kwarc np. 3 MHz, a dla 7 kHz - 7 MHz? No, to jest pewien pomysł, tylko nie wiem, jak to zaimplementować. ;)

    To właśnie robi sprzętowy PLL, co już ktoś zasugerował. Tylko że w ATmega nie ma sprzętowego PLL.

    0
  • #21 20 Gru 2012 13:18
    robiw
    Poziom 26  

    BlueDraco napisał:
    Jeju... Krok częstotliwości nie może być stały, bo funkcja 1/x nie jest liniowa, a jej wartości dla całkowitych x nie zawsze są wymierne...To podstawy matematyki, a nie wiedza o mikrokontrolerach. ;)


    Właśnie napisałem, iż nie bardzo sobie wyobrażam stały krok chociażby 15Hz:

    robiw napisał:
    ...

    piotrva napisał:
    Na timerze 16 bit + CTC uzyskasz na AVR 15Hz-1MHz z krokiem 15Hz.


    Biorąc pod uwagę wzór na częstotliwość w trybie CTC nie bardzo to sobie wyobrażam.

    fOCnA = fclk_I/O / 2 ⋅ N ⋅ (1 + OCRnA)

    robiw


    robiw

    0
  • #22 20 Gru 2012 15:43
    Paweł Es.
    Pomocny dla użytkowników

    Można zrobić DDS o dużej rozdzielczości programowo dla mniejszych częstotliwości, a wyjście powielać np. w pętli PLL *10 czy *100.

    Robisz zwiększanie liczby 32 bitowej N o liczbę M, a wyjściem jest sygnał z przeniesienia dodawania.
    Teoretyczne

    $$fwy=fzegar * \frac{M}{N} $$

    fzegar - częstotliwość zwiększania liczby N o liczbę M.


    Dla dużych częstotliwości rozdzielczości rzędu 1Hz nie są tak potrzebne.

    Drobny problem przy DDS, że przebieg nie zawsze ma wypełnienie dokładnie 50%, szczególnie w górnych częstotliwościach, chociaż to można "wygładzić" powielając sygnał z DDS-a więcej niż potrzeba razy i potem przepuszczając go przez kilka dzielników przez 2.

    0
  • #23 23 Gru 2012 00:54
    Sparrowhawk
    Poziom 21  

    Prosty generator sygnału prostokątnego można zrealizować bez pomocy mikrokontrolera (No może być potrzebny jedynie do wyświetlania bieżącej częstotliwości). Jeśli już nie chcemy stosować układów PLL, to może po prostu warto sięgnąć po rozwiązania z dziedziny elektroniki analogowej?

    0
  • #24 23 Gru 2012 12:46
    kamyczek
    Poziom 34  

    Nie ma rzeczy idealnych nawet najlepsze generatory DDS posiadają błąd wynikający z ich kroku podstawowego tylko analogowy generator w teorii nie posiada tego błedu , lecz tu nie jest tak idealnie ze stabilnością . Podstawą rozwiązania powinno być podzielenie całego pasma na zakresy na podstawie dostosowanej do nich metody generowania przebiegu . Należy też pamiętać że na krok generatora będzie wpływała częstotliwość pracy mikrokontrolera. Proponuję więc pojechać na maksymalnym taktowaniu, tym bardziej że mamy do dyspozycji nie tylko preskaler dla tajmerów ,ale też dla samego mikrokontrolera ,który można zmieniać podczas pracy o ile zajdzie taka potrzeba.Dla samej wygody układ podzielił bym na dwa bloki (DDS) oraz blok sterowania łącząc je np magistralą spi bo jest odporna na zmianę częstotliwości taktowania mikrokontrolera pracującego jako DDS.

    0