Prosty DDS z AD9850 / AD9851 — część 1

Prosty DDS z AD9850 / AD9851 — część 1
Razem głosów: 14 co stanowi: 97.14% całości.

S6301750

Po stworzeniu małego potworka , który opisałem kiedyś na forum , przyszła pora na prostszy projekt, a przede wszystkim tańszy … ten DDS (Direct Digital Synthesis) powinien nam pomóc zbudować DDS VFO (Variable Frequency Oscillator)


 

Jak zwykle dokonałem zakupów w pobliskim sklepie z wieczną promocją by zakupić parę modułów :)

generator1741602805_293Tu taka mała informacja, jest tych modułów od czorta … różnią się ceną obsługiwanymi kwarcami , ale też jakością.  Niektóre są wyposażone w generatory kwarcowe 3V  i podłączenie 5V i uruchomienie powoduje niedziałanie prawidłowe i zgoła dziwne zachowania układu , pomaga dołączenie kilku diodek szeregowo w celu zmniejszenia napięcia VCC z 5V do 3,3 – 3,8V. Łatwo te moduły wypatrzeć gdyż mają Kwarce oznaczone 3v3 :)

Nasze popularne moduły mają następujące parametry:

Moduł AD9850 :

  • 70 MHz Filtr dolnoprzepustowy
  • Interfejs równoległy lub szeregowy
  • Zegar 125MHZ
  • 3 lub 5V
  • wyjście sinusa do 20MHz

Moduł AD9851 :

  • 70 MHz Filtr dolnoprzepustowy
  • Interfejs równoległy lub szeregowy
  • Zegar 30MHZ plus x6 pętla PLL (max 180MHz)
  • 3 lub 5V
  • Podwójne wyjście sinusa do 30MHz

 

Zanim napiszę co i jak będziemy robić warto powiedzieć że będziemy pracować z 32-bitowymi i podwójnymi typami danych. Przez co musimy sobie wyliczyć takie słowo dla zmiennej strojenia TUNING  AD9850, które określi częstotliwość wyjściową naszego DDS-a.

 

Pierwszy wzór do wyliczenia wartości słowa (word) TUNING  to:

fo = wartoscTuning * (RefClk / 2 ^ 32)

który możemy zapisać też tak:

vartoscTuning = fo * (2 ^ 32 / RefClk)

z czego obliczymy sobie łatwo że :

Wymagana częstotliwość fo = RefClk = częstotliwość zegara DDS

Posiadane przeze mnie moduły AD9850 używają zegara 125MHz stąd :

2 ^ 32 / RefClk  czyli  2 ^ 32/125000000

Uwaga:   2 ^ 32 = 4294967296 (tak dla ułatwienia)

dlatego też po podstawieniu wartości  otrzymamy wynik:

4294967296/125000000  =  +34,359738368

No tak obliczenia matematyczne są jasne , ale teraz musimy napisać odpowiedni algorytm lub odpowiednik naszego wzoru w języku C …..  zadanie w sumie mamy łatwe wystarczy zdefiniować sobie wyliczone dane :

 # define AD9850_wspolczynnik_FCK +34,359738368;

tak … ale operować będziemy na wartości 32-bitowej, a to nas nieco ogranicza więc musimy co nieco zaokrąglić :

# define AD9850_wspolczynnik_FCK +34,35973837;

Takie rozwiązanie da nam bardzo mały błąd bo tylko 0.00000815% co stanowi mniej więcej  1Hz  przy częstotliwości wyjściowej 10Mhz .  Co w sumie jest do przyjęcia :) Teraz wypadało by zdefiniować nasze słowo  TUNING  po przeliczeniu co czynimy w kodzie linijką:

static unsigned long AD9850_Tuning;

teraz w przypadku języka C nasza formuła do obliczenia wartości słowa TUNING będzie mieć postać :

Ustawia nam to oczywiście odpowiednia formuła o następującej postaci:

ad9850_Tuning = (long) (czestotliwosc  * AD9850_wspolczynnik_FCK);

Wynikiem której są odpowiednio wartości:

ad9850_Tuning = 0x0E560410   // w HEX  lub

ad9850_Tuning = 240518160     // w ułamku

Warto skorzystać w celu sprawdzenia dokładności naszego wzoru z  Interaktywnego kalkulatora Analog Devices dla AD9850 dostępnego na stronie:

http://designtools.analog.com/dt/dds/ad9850.html

Przechwytywanie

 

z którego wynika że prawidłowe wartości dla TUNINGU to:

0x0E560419 lub 7.000000012340024Mhz

a w naszym wzorze wartości te to odpowiednio

0x0E560410 lub 6.999999546678737Mhz

Czyli uzyskujemy błąd o wartości -0.5Hz  na 7MHz. WOW  to całkiem niezły wynik jak na 8 bitowy mikrokontroler. Ale muszę was poinformować że taktowałem MCU 10MHz . Obliczenia wartości zajęło 10ms  i niestety  musimy o tym pamiętać jeśli będziemy chcieli szybko pokręcić encoderem by zmienić wartości.

I to na tyle w tej części ….   trochę nam zajmą czasu zagadnienia związane ze sterowaniem i obsługa AD9850 i AD9851 ale chodzi o uzyskanie stabilnego i czystego sygnału czyli idziemy w jakość , a nie jakoś …

Miłego Liczenia….

 

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay