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

AD9833 Wznowienie tematu- generator funkcyjny

16 Wrz 2007 18:23 6042 11
  • Poziom 15  
    Witam,
    nie jestem bardzo zaawansowanym elektronikiem i zamierzam zrobić generator funkcji na układzie AD9833. Jasne jest dla mnie podłączenie układu do uC (u mnie atmega8). Natomiast kompletnie nie jasne jest sterowanie układem aby generował żądany przebieg.

    Rozumiem, że DB15 i DB14 muszą być zerem. Rozumiem, że muszę wysłać do układu 16bitowe słowo w którym OPBITEN i MODE sterują kształtem (na razie nie wiem jak uzyskać przebieg prostokątny: 10 czy 11).
    Ale nie wiem:
    jak powinno wyglądać to słowo w reszcie bitów aby sterować częstotliwością?
    jak powinno wyglądać to słowo w reszcie bitów aby sterować wypełnieniem?

    Czy rzeczywiście niezbędny jest filtr przy granicznej częstotliwości? (nota twierdzi, że vout nie wymaga żadnego)

    Czy ktoś może podać przykład 16 bitowego słowa dla sinus 1kHz? Triangle 10kHz?

    Code:

    $regfile = M8def.dat
    $crystal = 16000000
    $lib "mcsbyteint.lbx"
    dim data_ad1 as Byte
    dim data_ad2 as Byte

    Config Portb.5 = Output
       clk Alias Portb.5
    Config Portb.3 = Output
       sdout Alias Portb.3
    Config Portc.5 = Output
       cs Alias Portc.5

    Config Spi = Soft , Dout = sdout , Ss = None , Clock = clk

    waitms 10

    'Tu własnie jest problem ze stworzemniem tego slowa

    data_ad2=pierwsze_8_bitów_slowa
    data_ad2=drugie_8_bitów_slowa

    gosub spi

    End

    spi:
       Reset cs
       Spiout data_ad1 , 1
       Spiout data_ad2 , 1
       Set cs
    return

    Czy dobrze rozumiem, że przy skonfigurowanym SPI (Bascom) musze po prostu wysłać 16bitowe slowo lub 2x8 bitów (tak bylo przy SPI z PGA2310)

    A co jest jeszcze ważne to podaje 20MHz na wejćcie MCLK z generatora kwarcowego, którego zasilam z VCC czyli +5V uC/AD9833

    Będę wdzięczny za pomoc bo nie wiem gdzie tego jeszcze szukać.\
    dzieki
    w

    Moderowany przez androot:

    Przeniosłem z "Układy elektroniczne DIY pomysły, problemy"

  • Poziom 27  
    Witaj
    Z tego co widzę, a jest napisane niezbyt przejrzyście, to kształt wybierasz przy wysyłaniu słowa za pomocą bitów: D5(OPBITEN), D3(DIV2), D1(MODE).

    Nie raczyłeś napisać jakiego kontrolera używasz, wspomniałeś tylko o Baskomie... tez nie wiadomo do której rodziny jest ten "kompilator", a z tego co już wiem to raczej operujesz na 8-bitowcach. Nie wiem jak inne procki, ale sprzętowe SPI AVRów jest 8mio bitowe (chyba, że sie mylę) a transmisja z tym układem powinna byc co najmniej 16bitowa (pewne uniedogodnienie)
    Rozpisz sobie słowa sterujące na poszczególne bity i powinno wszystko powoli sie wyjaśnić.
    A przepraszam w definicji programu jest ATMega8.
    Próbujesz wysłać dwa 8mio bitowe słowa... a trzeba dostarczyć dwa 16bitowe.
    Pisze to wszystko naprędce po 5min studiowaniu datasheetu więc moge się mylić.
    Na pewno ktoś zechce wnikliwiej się przyjrzeć i pomóc
    Pozdrawiam
  • Poziom 19  
    AD9833 zawiera 5 rejestrów:
    1. 16 bitowy rejestr kontrolny (w zasadzie 14 bitowy)
    2. 28 bitowy rejestr częstotliwości FREQ0
    3. 28 bitowy rejestr częstotliwości FREQ1
    4. 12 bitowy rejestr fazy PREG0
    5. 12 bitowy rejestr fazy PREG1

    Rejestry fazy możesz sobie na poczatek darować, podobnie jak wykorzystanie jednocześnie dwóch rejestrów częstotliwości.
    Z tego wynika, że aby uzyskać pożądaną czestotliwość (i kształt) należy wpisać odpowiednie słowo sterujące 16bit, MSB rejestru czestotliwości - 16bit, LSB rekestru częstotliwości - 16bit.

    Przykładowo dla sinus 1kHz:
    Nie da się wprawdzie przy MCLK=20Mhz uzyskać 1kHz ale da się 1000.02Hz
    Częstotliwość ustalamy z krokiem MCLK/(2^28 ):
    dzielimy 1000/(20*10^6/(2^28 ))=13422=0h346E
    Wpisujemy kolejno:
    0010 0000 0000 0000 - słowo kontrolne (rejestr 0, sinus, 2x zapis)
    0111 0100 0110 1110 - LSB rejestru częstotliwości (rejestr FREQ0)
    0100 0000 0000 0000 - MSB rejestru częstotliwości (rejestr FREQ0)

    Sprawdź powyższe rachunki.

    Możesz używać BASCOM'owege spiout (8 bitów) ale pin FSYNC musisz sterować samemu.

    Sinus czy trójkąt wybierasz bitem MODE, przebieg prostokątny bitem OPBITEN w słowie kontrolnym. Nie ma bezpośredniej mozliwości regulacji wypełnienia ale możesz na wyjściu dać komparator z jakimś potencjometrem i uzyskać przebieg prostokątny z regulowanym wypełnieniem z przebiegu trójkątnego.
  • Poziom 15  
    Dzięki wielkie, a możesz jeszcze napisać jak mam wyłapać opadające zbocze aby dac FSYNC LOW?



    OK, znalazłem coś takiego jak NOP, ale jak obliczyć ile razy mam użyć NOP?
  • Poziom 19  
    Przyznaję, że nie za bardzo rozumiem pytanie ale jeżeli chodzi o SPI w AD9833 to FSYNC służy do wskazywania, że transmisja jest w trakcie i ewentualnie do zakończenia słowa. Czyli przesył jednego słowa moze wyglądać tak:
    FSYNC<-1 //na wszelki wypadek
    FSYNC<-0 // początek transmisji
    spiout // 8 bitów
    spiout //8 bitów
    FSYNC<-1 //koniec transmisji 16 bitów

    Czas między FSYNC<-0 i faktycznym rozpoczęciem transmisji (za pomocą SDATA i SCLK) jest nieistotny, podobnie jak i w przypadku ostatniego FSYNC<-1. Możesz go ustawić na 1 i po godzinie - byle przed wpisaniem następnego 16 bitowego słowa.
  • Poziom 15  
    Działa

    Code:

    $regfile = M8def.dat
    $crystal = 8000000
    $lib "mcsbyteint.lbx"

    dim word_b(6) as byte


    Config Portb.5 = Output
       clk Alias Portb.5
    Config Portb.3 = Output
       sdout Alias Portb.3
    Config Portc.5 = Output
       cs Alias Portc.5

    Config Spi = Soft , Dout = sdout , Ss = None , Clock = clk
    spiinit

    waitms 500

    word_b(1) = 0010 0000
    word_b(2) = 0000 0010

    word_b(3) = 0111 0100
    word_b(4) = 0110 1110

    word_b(5) = 0100 0000
    word_b(6) = 0000 0000

       set cs
       Reset cs
       spiout word_b(1) , 6
       set cs

    End
  • Poziom 15  
    Witam, muszę dodać post pod postem.

    Napisałem takie procedury:
    Code:


    początek programu:
    f_out=1000

    word_b(1) = &b00100000
    word_b(2) = &b00000000

    word_b(5) = &b01000000
    word_b(6) = &b00000000

    gosub oblicz
    gosub send

    oblicz:
       f_out = f_out + 100
       f_calc = 40000000 / 268435456
       f_calc = f_out / f_calc
       f_calc = round(f_calc)
       tmp = f_calc
       tmp = tmp or &b0100000000000000
       word_b(3) = high(tmp)
       word_b(4) = low(tmp)

    return

    send:
       Reset cs

          'control x2
          spiout word_b(1) , 1
          spiout word_b(2) , 1
          spiout word_b(1) , 1
          spiout word_b(2) , 1

          'LSB data
          spiout word_b(3) , 1
          spiout word_b(4) , 1

          'HSB data
          spiout word_b(5) , 1
          spiout word_b(6) , 1

       set cs
          waitms 50
    return


    nie bardzo to działa. Wprawdzie jest sinus ale o charakterystyce zbliżonej do losowej- skacze od kHz do Mhz przy kroku f_out=100

    Jak by ktoś mógł mi pomóc i powiedzieć gdzie robię błąd.
  • Poziom 27  
    A spróbuj wpisać takie wartości:
    word_b(1) = 0010 0000
    word_b(2) = 0000 0000

    word_b(3) = 0100 0000
    word_b(4) = 0000 0000

    word_b(5) = 0100 0000
    word_b(6) = 0011 1111

    i napisz co się dzieje z układem.
  • Poziom 15  
    rozumie, że chodzi o wysyłanie danych do MSB a nie LSB?

    Jutro sprawdzę i dam znać.
  • Poziom 15  
    jeżeli są tyo bity statyczne to co mam wysylac zeby zmieniac tylko wybrane- na przykład tylko control lub LSB?

    Ch.M. ->>
    Te wartości dają mi 0.5 ms (od wierzchołka do wierzchołka) i 0,6V/div
    czyli 2kHz

    2kHz ze wzoru
    Code:

    (F_OUT/(MCLK/2^28) -> 2000/(20000000/2^28)) powinno dać 26844

    natomiast z Twojego przykładu &b0100000000111111=16477
  • Użytkownik usunął konto  
  • Poziom 15  
    Może ktoś wkleić kawałek kody bascom'a do sterowania AD9833 przykładowo 1kHz i 12kHz?

    Cały czas nie mogę sobie z tym poradzić.