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.

atmega32 Bascom - pomiar i generowanie częstotliwości

Worker13 08 Mar 2014 22:08 1239 6
  • #1 08 Mar 2014 22:08
    Worker13
    Poziom 5  

    WItam
    Potrzebuję zmienić częstotliwość przebiegu prostokątnego o np 3,3 raza. Czestotliwość wejściowa jest zmiennna w pewnym zakresie maks 500hz.
    Wymyśliłem sobie żeby to zrealizować tak aby na INT0 podawać sygnał wejściowy i wywołuje przerwanie impulsy a timer0 generuje przerwania co jakiś mniejszy czas probkowania. Zliczam impulsy probowania pomiedzy impulsami z INT0 i na drugiej zmiennej wyliczam o potrzebna mi wartość . W teori to działa w praktyce "prawie " też.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Problem polega na tym że wartość generowana nie jest dokładnym przeliczeniem w tym przypadku wartości 3,4 a dokładnie 1,7 ponieważ na toggle mam podział przez 2.
    Jak to zmienić/zrealizować żeby uzyskać możliwie najlepszy efekt[/code]

    0 6
  • #2 08 Mar 2014 22:28
    piotrva
    Moderator Mikrokontrolery

    1. Pokaż CAŁY kod.
    2. Zdajesz sobie sprawę, że parametry timera można zmieniać skokowo co 1 bit - policz sobie jakie wartości będą wpisywane do rejestrów, które nim sterują przy różnych parametrach wejściowych - być może Twoje operacje powodują że np. zmiana częstotliwości o paręset Hz to zmiana o 1 bit - wtedy trzeba inaczej dobrać prescaler itp. Warto zastosować timer1 do generowania wyjściowego sygnału, bo ma rozdzielczość 16 bit, więc będzie dokładniejszy.

    0
  • #3 09 Mar 2014 08:51
    Worker13
    Poziom 5  

    cały kod aktualnie wygląda tak. Docelowo w pętli głównej będą inne rzeczy jeszcze.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    ogólnie to działa ale sa różnice niewielkie np stosując podział przez 1,4 uzyskuje podział przez około 1,4 np 1,35. Sprawdzam to na analizatorze stanów logicznych.
    przerwanie impulsy powoduje rozpoczęcie zliczania zmiennej A (jako impulsów próbkujących) a C ma być odliczaniem "poprawionej" liczby impulsów do wygenerowania Fwyj. Jeśli dobrze policzyłem to próbkowanie mam co 10us powinno w zupełności wystarczyć.
    Może moja metoda jest zła, próbowałem z trybie CTC ale wtedy właśnie nie mam płynnej f wyj tylko właśnie skokowo w związku z rozdzielczością i preskalerem.

    0
  • #4 09 Mar 2014 21:38
    emarcus
    Poziom 34  

    Worker13 napisał:
    cały kod aktualnie wygląda tak. Docelowo w pętli głównej będą inne rzeczy jeszcze.
    .
    Może moja metoda jest zła, próbowałem z trybie CTC ale wtedy właśnie nie mam płynnej f wyj tylko właśnie skokowo w związku z rozdzielczością i preskalerem.


    Stosując prescaler = 1, oraz timer0 preload = 96 zakładasz że przrwania wywołane przez Ovf0 wystąpią co 160 cykli zegara (10us); inaczej mówiąc tyle (lub o wiele mniej) masz czasu na wykonanie czynności w tym przerwaniu, gdy tymczasem faktyczna obsługa tego tylko przerwania włącznie z obsługą stosu "kosztuje" 662 cykli.
    Pewna ilość przerwań jest zwyczajnie gubiona.
    Trochę to 'przechytrzony' koncept...

    e marcus

    0
  • #5 10 Mar 2014 23:02
    Worker13
    Poziom 5  

    No właśnie tak podejrzewałem. 10us to już było w akcie desperacji zmniejszone aby poprawić dokładność ale wyszło tak że przedobrzyłem. Wcześniej założyłem sobie 100us co też w gruncie rzeczy niewiele zmieniało. Musze spróbować albo zmniejszyć ilość próbkowania i może uda się wtedy nieco wyrównać ewentualny błąd, albo zmienić metodę.
    Powiem szczerze że zablokowałem się jakoś na ewentualne pomysły jak to sensownie zrealizować. Może coś podpowiecie?
    mam przebieg prostokątny wejściowy i chce niejako online zmienić go w dól lub w górę o jakąś wartość ułamkową.

    0
  • #6 12 Mar 2014 11:11
    Worker13
    Poziom 5  

    nikt nic nie doradzi? może inna metoda zupełnie?

    0