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

Jak zapisać dane do AD9850, by generować 1kHz z AVR?

dreslak 23 Lip 2013 18:23 4248 20
  • #1 12553063
    dreslak
    Poziom 17  
    Witam,
    Na wstępie chciałbym przeprosić jeśli post umieściłem w złym dziale.

    Mój problem polega na zapisaniu do układu AD9850 danych w taki sposób aby była generowana określona częstotliwość. AD9850 ma być sercem amatorskiego generatora funkcyjnego ( prostokąt i sinus). Dane do układu wysyłam szeregowo, lecz nie potrafię skonstruować algorytmu który np. po wpisaniu 1kHz wyśle taki pakiet, aby układ wygenerował właśnie 1kHz. Znam poszczególne wagi każdego z 32 bitów, lecz nie potrafię tego wykorzystać.
  • #2 12555308
    kamyczek
    Poziom 38  
    W dokumentacji układu jest dokładny opis jak wygląda ramka . Układ generuje wielokrotności podstawowego kroku . Algorytm jest dość prosty trzeba podzielić zadaną wartość przez krok podstawowy : (0.0291 Hz) a wynik w postaci bin wstawić do ramki uzupełniając o resztę z 40 bitów dotyczących przesunięcia fazowego i typu wyjścia dla 1KHz 00000000 00110100 01101111 10001010 XXXXXXXX gdzie xxxxxxxxxx to konfiguracja .
  • #3 12557161
    dreslak
    Poziom 17  
    niby proste, ale: doświadczalnie 1000,002Hz to 11010010 01100001 00000000 00000000 XXXXXXXX to problem nr 1. Problem nr 2 polega na tym iż wysyłając po bajcie transmisja jest ok, Wysyłając zmienną typu Long (4 bajty) Transmisja nie jest taka jak powinna być, tzn z moich obserwacji wynika że zostają utracone dwa pierwsze bity. Co ciekawe nawet gdy transmisje zainicjowałem na pętli FOR.
  • #4 12557176
    BlueDraco
    Specjalista - Mikrokontrolery
    I oczywiście nie widząc kodu mamy zgadnąć, gdzie popełniłeś błąd?
  • #5 12557209
    dreslak
    Poziom 17  
    kodu jako całego nie ma. Są to tylko testy uruchomieniowe.

    Kod wysyłania po bajcie:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    gdzie:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Kod wysyłania ramki odpowiedzialnej za częstotliwość:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    gdzie:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 12557337
    dreslak
    Poziom 17  
    Co proponujesz ?
  • #8 12557710
    kamyczek
    Poziom 38  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Miedzy tymi operacjami warto wstawić pusty krok "nop" wydaje mi się że masz problem z czasami operacji wyboru układu itp. może warto podejrzeć co się dzieje na analizatorze TTL i dodać w niektórych miejscach zwłokę na ustalenie stanów której potrzebuje AD9850 .
  • #9 12557884
    dreslak
    Poziom 17  
    Analizatora nie posiadam, na oscyloskopie podejrzałem jedynie że dwa pierwsze bity są gubione nie wiadomo czemu. Ale o Tym później, ważniejszy jest "problem 1"
  • #10 12558772
    BlueDraco
    Specjalista - Mikrokontrolery
    Zacznij od zmiany typu, ze zmiennopozycyjnego na całkowitoliczbowy. Z tym "single" to nie ma żadnego prawa działać.
  • #11 12560374
    dreslak
    Poziom 17  
    Bez rozwiązania problemu nr 1 nie ma sensu gdybanie nad problemem nr 2. Po Wysłaniu sekwencji z drugiego posta , otrzymana częstotliwość to:85 764 Hz.
  • #12 12560459
    BlueDraco
    Specjalista - Mikrokontrolery
    A który to jest problem nr 1? Na moje oko skoro z powodu użycia typu single wysyłasz do układu śmieci, a nie poprawne dane, to trudno oczekiwać od niego zachowania takiego, jakie byłoby przy poprawnych danych.
  • #13 12560592
    dreslak
    Poziom 17  
    Może inaczej, taki oto kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    generuje częstotliwości jak w komentarzach , co ma się nijak do obliczeń zaproponowanych przez kolegę "kamyczek".
  • #14 12560862
    BlueDraco
    Specjalista - Mikrokontrolery
    Prawie dobrze. W jakiej kolejności wysyła dane Spiout z argumentem typu long, a w jakiej spodziewa się ich układ?
  • #15 12561043
    dreslak
    Poziom 17  
    Ramka danych wygląda tak:

    Jak zapisać dane do AD9850, by generować 1kHz z AVR?

    Gdzie kolor czerwony to zegar, niebieski dane. Tak są wysyłane. Jak spodziewa się układ to przedmiot tej rozmowy. Wiem że synchronizacja jest zboczem narastającym.
  • #16 12562032
    kchpl
    Poziom 15  
    Witam
    Z datasheet`a wynika że podajesz mu słowo sterujące częstotliwością od LSB do MSB (32bity) i potem Control(8bit) i następnie na FQ_UD impuls wysoki.

    Słowo sterujące wyliczasz ze wzoru fout=(ΔPhase*CLKIN)/2^32 gdzie:
    ΔPhase - słowo sterujące
    CLKIN - częstotliwość zegara referencyjnego w MHz
    fout - wyjściowa częstotliwość w MHz
  • #17 12562057
    PDT
    Poziom 24  
    Witam,
    Oprogramowywanie AD9850 trzeba zacząć od funkcji obliczającej 'tunning_word', 32-bitowej reszty z dzielenia częstotliwości ustawianej DDS przez częstotliwość referencyjną (najczęściej 125MHz). Dla zachowania dokładności nie liczymy słowa sterującego jako mnożnik rastra.

    Przykładowo mój DDS ma dokładną częstotliwość referencyjną 125 001 320 Hz (07735E68).
    Wartość tune32 dla kilku nastawionych F wynosi:

    F[Hz] tune32
    27.555.000 386E9A70 monitor AT
    225.000 0075F6AB cz. wzorcowa W-wa1
    1.000 00008637 1 KHz

    Programowanie DDS-a polega na wysłaniu słowa 'tune32' począwszy od LSB do MSB. Piąty bajt może mieć wartość '0' (przesunięcie fazowe). Po przesłaniu sygnał FQ_UP ustawia DDS na żądaną F. Dla 225 kHz przesyłamy w kolejności od lewej do prawej 40bitów/5bajtów:

    11010101 01101111 10101110 00000000 00000000

    Pzdr

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Oczywiście powyższy algorytm znacznie lepiej jest napisać w asemblerze (ja pisałem na 51).
  • #18 12563759
    dreslak
    Poziom 17  
    kchpl napisał:
    Witam
    Z datasheet`a wynika że podajesz mu słowo sterujące częstotliwością od LSB do MSB (32bity) i potem Control(8bit) i następnie na FQ_UD impuls wysoki.

    Słowo sterujące wyliczasz ze wzoru fout=(ΔPhase*CLKIN)/2^32 gdzie:
    ΔPhase - słowo sterujące
    CLKIN - częstotliwość zegara referencyjnego w MHz
    fout - wyjściowa częstotliwość w MHz

    Słowo sterujące to 110000111010010 bin =25042 dec CLKIN/2^32 =0,0291 dec. Wówczas z twojego wzoru wychodzi 728Hz a z pomiaru wynika że jest 1 Khz. Wedle wzoru słowo sterujące dla 1kHz to 34359 dec.


    PDT napisał:
    Witam,
    Oprogramowywanie AD9850 trzeba zacząć od funkcji obliczającej 'tunning_word', 32-bitowej reszty z dzielenia częstotliwości ustawianej DDS przez częstotliwość referencyjną (najczęściej 125MHz). Dla zachowania dokładności nie liczymy słowa sterującego jako mnożnik rastra.

    Przykładowo mój DDS ma dokładną częstotliwość referencyjną 125 001 320 Hz (07735E68).
    Wartość tune32 dla kilku nastawionych F wynosi:

    F[Hz] tune32
    27.555.000 386E9A70 monitor AT
    225.000 0075F6AB cz. wzorcowa W-wa1
    1.000 00008637 1 KHz

    Programowanie DDS-a polega na wysłaniu słowa 'tune32' począwszy od LSB do MSB. Piąty bajt może mieć wartość '0' (przesunięcie fazowe). Po przesłaniu sygnał FQ_UP ustawia DDS na żądaną F. Dla 225 kHz przesyłamy w kolejności od lewej do prawej 40bitów/5bajtów:

    11010101 01101111 10101110 00000000 00000000

    Pzdr

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Oczywiście powyższy algorytm znacznie lepiej jest napisać w asemblerze (ja pisałem na 51).


    Po wysłaniu :
    11010101 01101111 10101110 00000000 00000000 gdzie ostatni bajt to ustawienia
    Otrzymałem ok 40MHz

    Po wysłaniu w odwrotnej kolejności:
    00000000 01110101 11110110 10101011 00000000
    Otrzymałem ok 333KHz

    z bajtem ustawień j/w na początku ok 40MHz
    00000000 00000000 01110101 11110110 10101011 .
  • Pomocny post
    #19 12563991
    PDT
    Poziom 24  
    Kolego dreslak, szukaj w swoim sposobie przesyłania słowa kodującego jakiegoś błędu. Dane zawarte w moim poprzednim poście pochodziły z odczytu panela LCD działającego DDS-a. Nie ma tu mowy o pomyłce. Zresztą sprawdź u źródła:

    http://designtools.analog.com/dtDDSWeb/dtDDSMain.aspx

    To jest witryna obliczająca w/w parametry firmy Analog Devices, źródło pewnych wartości słowa sterującego. Sprawdź podane wyżej przeze mnie (uwaga! u mnie Fref 125001320 Hz).

    Pzdr

    Kod: text
    Zaloguj się, aby zobaczyć kod


    MPU 51 transmituje bit najmłodszy bajtu jako pierwszy. Port pracuje w trybie synchronicznym (bez bitów startu/stopu itp.).
  • #21 12564978
    dreslak
    Poziom 17  
    Opanowałem już wczoraj, przyczyną jest funkcja spiout która nie wiedzieć czemu miała "przyspieszony zegar" albo inaczej mówiac dane były opóźnione względem zegara
REKLAMA