Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Generator VCO - BASCOM. Gdzie znajdę jakieś informacje?

Daretti 08 Jan 2007 13:25 2525 9
Tespol
  • #1
    Daretti
    Level 10  
    WITAM!!!!!!!!!
    Zgłaczam sie do was z wielką prośbą, gdzie mozna znaleźc jakies wiadomości na temat generatora VCO. Mam do napisania program w bascomie bedacy generatorem VCO. Ma ktos z was moze jakis przykladowy program takiego generatora który bedzie można wgrać do mikrokontrolera ATmega8. Może macie jakieś materialy albo pomoce dotyczące tematu.
  • Tespol
  • #2
    st3tc
    Level 14  
    VCO to oscylator przestrajany napięciem. Jakie przebiegi to cudo ma generować ?. Sinuska, fale prostokątną czy coś innego ? Jaka maksymalna częstotliwość ?. To zadanko ze szkoły ( bo może da się zrobić lepsze rozwiązanie).

    Na szybko jak ja bym to zrobił - pod ADC podpiąć strojenie napięciem. Cyklicznie odczytywać wartość i umownie zamieniać ją na częstotliwość ( np. 1V - 1000Hz).

    Po określeniu częstotliwości generacja - zależy już czego. Fali prostokątnej w sumie spoko - Ustawiasz bit jakiegoś portu na 1, czekasz (interwał czasowy wyliczasz z częstotliwości którą chcesz uzyskać), potem na 0 znów czekasz itp.

    Z sinuskiem troszkę problem. Ja bym zrobił małą tablicę z look-upkami (przekalkulowane wartości dla 360 stopni). Generacja to pobieranie kolejnych sampli z buforka (to buforek kołowy). Częstotliwością bym sterował dobierając opóźnienie między pobraniami. Przydałby się do tego jakiś DAC podpięty pod port (lub w ostateczności drabinka z rezystorków). Częstotliwości uzyskasz dużo mniejsze niż dla fali prostokątnej - ale sinus będzie "czysty" (a i przy zmianie częstotliwości masz zapewnioną ciągłość fazy (taki mały DDS :>).

    Można też zrobić w sumie prościej (i chyba lepiej) - wykorzystać PWM procka - dokładna spec jest w pdf-ie atmegi.
  • Tespol
  • #3
    Daretti
    Level 10  
    dokładny temat tej pracy to :" Opracowanie i implementacja programu generatora VCO w języku Bascom"

    Z tego wynika ze moge wybrac sobie jaki to ma byc kształt sygnału wyjściowego.
  • #4
    teedd
    Level 18  
    Witam.
    Czy zakres częstotliwości generatora jest stały czy też można go zmieniać w trakcie pracy?
    Pozdrowienia - teedd
  • #5
    Daretti
    Level 10  
    Chodzi o to żeby zmieniające sie napiecie na wejściu takiego genertora powodowało zmienianie sie czestotlowosć sygnału prostokątnego na wyjsciu takiego generatora. Nie wie czy dobrze to rozumuje .
  • #6
    st3tc
    Level 14  
    To zrób tak jak napisałem wyżej. Użyj ADC procka, a po odczytaniu wartości "zapalaj" i "gaś" jakiś pin - przerwy sobie ustalisz na podstawie napięcia.
  • #7
    Daretti
    Level 10  
    Jest tylko jeden problem , jestem totalnie zielony w tym temacie i nie za bardzo kojarzę o co chodzi :/. ADC procka ??. próbowałem coś dizałać z timer jak PWN ale nie wyszło.
  • Helpful post
    #8
    shg
    Level 35  
    Masz ATmega8, czyli masz ADC i masz timer połączony z pinami I/O, czyli za pomocą timera możesz generować przebiegi na wyjściu.
    Rzecz wręcz banalna.
    Za pomocą ADC wykonujesz pomiar napięcia.
    przeliczasz go na okres, albo odrazu częstotliwość, nie wiem jak to w bascomie wyglada. W każdym razie częsottliwość ustala się przez zapisanie w odpowiednim rejestrze okresu. No i tyle, konfiguracja ADC i timera podstawowa, bez żadnych udziwnień, na pewno gdzieś znajdziesz.

    Chciałbym natomiast poruszyć sprawę samego przeliczania.
    Dla VCO definiuje się parametr zwany wzmocnieniem, wyraża się go w Hz / V (albo w rad / (s * V)).
    czyli jest to prostoliniowa zależność częstotliwośći od napięcia.
    Z przetwornika A/C dostajemy liniową zależność wartości kodu od napięcia wejściowego.
    Możemy w prosty sposób policzyć częstotliwość:
    f = f_0 + k_VCO * U.
    f_0 - częstotliwość początkowa (dla U=0), większość VCO nie pracuje od 0Hz
    k_VCO - wzmocnienie VCO w Hz/V
    U - napięcie z przetwornika w V

    U = ADC / 1024 * U_ref
    ADC - kod z przetwornika (10-cio bitowego, stąd te 1024)
    U_ref - napięcie odniesienia przetwornika

    Problem tylko jest taki, że trzeba policzyć okres.
    Niby banalne, t = 1 / f.
    Niestety liczenie tego na liczbach całkowitych skończy się zawsze zerem (z powodu zaokrągleń), lub nezdefiniowaną wartością (1/0)

    Ale wcale nie trzeba wyrażać okresu w sekundach, można wyrazić do w cyklach timera.
    n = f_t / f
    f_t - częstotliwość taktowania timera, (trzeba przez dwa podzielić, bo stan pinu jest zmieniany na przeciwny po zliczeniu timera do wartości końcowej)
    n - ilość okresów timera które należy odliczyć.
    No i w zasadzie to tyle, wartość n wpisuje się do odpowiedniego rejestru.
    Coś tu tylko mi się nie podoba ze zliczaniem, chyba jakoś tak było, że wartość w rejestrze to ma być ilosć cykli +/- 1 (stara programistyczna sztuczka, dodać/odjąć gdzieś 1 i bedzie działać ;]). Zresztą o tym w nocie katalogowej jest napisane, jest tam podany wzór na ilość cykli w zależności od częstotliwości.
  • #9
    Daretti
    Level 10  
    Dzieki ogromne za podpowiedź naprawdę mi pomogłeś :). MAm tylko jescze małe pytanko ile wynośi wspolczynnik wzmocnienia dla standardowego generatora VCO i jaki jest zakres czestotliwości wyjsciwej dla takiego generatora. A i jeszcze jaki jest standardowy zakres napiecia wejsciowego

    Dodano po 5 [minuty]:

    a i jeszcze jedno jakie jest standardowe napieci odenisienia dla takiego generatora VCo zbudowanego na Atmega8
  • #10
    shg
    Level 35  
    Nie ma standardowych wartości, ile sobie założysz, tyle masz. Nie ma też czegoś takiego jak standardowy VCO, parametry dobiera się stosownie do potrzeb.
    Jest wiele rozwiązań, niektóre pracują z częstotliwościami poniżej 1Hz, a inne z częstotliwościami kilkudziesięciu i więcej GHz.
    To samo dotyczy zakresu napięcia wejściowego, ale najczęściej mieści się ono w jakimś łatwym do uzyskania zakresie (najczęściej od kilku do około 30V, dlatego że stosowane w nich dość powszechnie diody pojemnościowe mogą pracować w takim zakresie napięć).

    Co do napięcia odniesienia ADC w ATmega, to też nie ma jako tako zdefiniowanej standardowej wartości, w każdym razie powinno się ono mieścić w zakresie 2V..V_adc (napięcie zasilania ADC).
    Możesz skorzystać z wewnętrznego źródła naięcia odniesienia, nei wiem ilo ono ma, 2.56V chyba, w nocie katalogowej sprawdź, osobiście wolę używać do tego celu zewnętrznego źródła napięcia odniesienia 2.495V na TL431 (podłączonego do końcówki A_ref). Możesz też użyć napięcia zasilania (V_adc do końcówki A_ref). Zakres przetwarzanych napięć wejściowych zawiera się w przedziale 0V..A_ref.

    Timer w mikrokontrolerze taktowany jest z głównego oscylatora po ewentualnym podzieleniu częstotliwości. Wniosek z tąd taki, że maksymalna częstotliwość na wyjściu określona jest przez częstotliwość głównego zegara (z uwzględnieniem wewntualnego dzielnik częstotliwości). Konkretniej to wynosi ona połowę częstotliwości taktowania timera.
    Jeżeli na przykłąd uC taktowany będzie zegarem f_CLKI/O = 8MHz, a preskaler (dzielnik) dla timera będzie wyłączony, to maksymalna możliwa do uzyskania częstotliwość będzie wynosiła f_CLKI/O / 2 = 4MHz.
    Jeżeli teraz zakres przetwarzanego napięcia (czyli napięcie odniesienia dla ADC) ustalisz sobie na poziomie 5V, to dla uzyskania maksymalnej częstotliwości przy maksymalnym napięciu wejściowym wzmocnienie VCO należy ustalić na poziomie k_VCO = 4MHz/5V = 800000, przy założeniu że czestotliwość początkowa f_0 = 0Hz.

    Ale żeby nie było tak lekko to jest jeszcze jedna rzecz, o której należy pamiętać - za pomocą timera nie można wygenerować dowolnie małej częstotlwości, ograniczona jest ona długościa słowa erjestru wyznbaczającego tę częstotliwość, dla timera 1 rejestr ten ma 16 bitów, co daje stosunek najwyższej do najniższej częstotliwośći równy 65536 (2^16), czyli najmniejsza mozliwa częstotliwość będzie wynosiła w tym wypadku 61.035Hz. Oczywiście da się i mniej, ale wymagało by to zmiany preskalera dla timera w trakcie pracy (ustawienie większego podziału), nie wiem czy bascom umożliwia coś takiego "w locie", jak nie, to musisz operować bezpośredniu na rejestrach uC.

    Zakres napięcia wejściowego możesz rozszerzyć przez dodanie dzielnika napięcia z dwóch rezystorów na wejście ADC, zawęzić można go przez dodanie wzmacniacza.
    Ale to nie jest takie ważne, jak zbydujesz VCO, to w dokumentacji piszesz, że ma taki a taki zakres napięć wejściowych i to wystarczy, resztę układu można zawsze dostowować do tego, ważne tylko żebyś podał wszystkie istotne parametry (czyli te o które pytasz).

    Jeszcze jest jedna dość ważna kwestia - przetwornik A/C ma skończoną rozdzielczość (tu 10 bitów), czyli z całego zakresu częsotliwości będziesz mógł uzyskać 2^10 = 1024 różne częstotliwości i to nie równo (liniowo) rozłożone, tylko hiperbolicznie.
    Ale jeżeli to ma być VCO tylko "na pokaz", to będzie to jak najbardziej wystarczające (i rozdzielczość i zakres częstotliwości).

    W analogowych VCO zakres częstotliwości wyjściowych wybiera się zawse jak najmniejszy zakres częstotliwości wyjściowych, tylko taki, żeby wystarczył do pokrycia pożądanego zakresu częstotliwości, innemi słowy - ustala się najmniejszą akceptowalną wartość wzmocnienia. Ma to na celu redukcję szumów fazowych, czyli tak jak dla amplitudy szumy są odchyleniami od wartości średniej, tak dla częstotliwości szumy fazowe są odcyleniami od średniej wartości częstotliwości. W napięciu sterującym VCO występują zawsze szumy amplitudowe, które wraz z napięciem sterującym zostaną przez VCO "przełożone" na częstotliwość co właśnie spowoduje powstanie szumów fazowych.