Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

AD9851 DDS

Başlatan askuzucu, 18 Temmuz 2007, 14:19:58

askuzucu

Merhaba Arkadaşlar;
Analog Devices firmasının ürünü olan AD9851 entegresi ile Minikits sayfalarında bulunan DDS sinyal generatorunu yaptım.Devre 1 Hz adım aralığı ile DC-70 MHz ye kadar sinyal üretebiliyor.Çok kullanışlı bir alet, tavsiye ederim.Sorunuma gelince; bu entegrenin datasheetini incelediğimde frekans kontrol  için 32 bit dizi kullanılıyor.Bu entegreye senkron seri veya 1'er byte lık katarlar halinde palelel olarak aktarılıyor, bunda da bir sorun yok.Ancak frekansı hesaplamak için yapacağım aritmetik işlemleri basic te nasıl yaptıracağımı bilemiyorum.Çünkü nasıl yaparsam yapayım 32 biti aşıyor.Basicte de yeniyim.Bu entegreyi yapacağım spectrum analizorun tarayıcı vco katında PLL desteği ile kullanmak istiyorum.Daha önce bu entegre ile çalışanlar var mı?Hesap kısmında yardımcı olabilirmisiniz? yardımcı olacaklara şimdiden teşekkür ederim...

aslan_korhan

AD9858'i tavsiye ederim. Bununla 500MHz'e kadar üretebiliyorsun.
Bende buna bir program yazacağım ama henüz fırsat bulamadım.

AD9851'de kullanmıştım. Buna PBP'de veri göndermek çok basit.
Shiftout komutu ile oluyor.

SHIFTOUT da,ck,4,[$7D,$D2,$27,$7D,$01]          ' 88MHz


Böyle birşeyi AD9851'de kullanıyordum...
32Bit'i 4 parçaya bölerek işlem yapman gerekiyor.  Tek 32bitlik bir veri ile pek olmaz.
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

askuzucu

Bilgiler için teşekkür ederim.Yazacağım programda başlama ve bitiş frekansları ile giriş yapılacak,step seçilecek  ve hızlı bir şekilde başlangıç frekansından başlayarak bitiş frekansına kadar tarama yapılacak.Tabi çözünülürlüğe göre her adımda bekleme süresi de değişecek.Bu kısmı for next döngüsü ile halletmeyi düşünüyorum.Frekans güncellemenin kısa sürmesi için de palalel giriş uçlarını kullanacağım.Bu bana beş kat zaman kazandıracak.877 ile 20 MHz kristal kullanacağım.Çıkış frekansının da PLL devresi ile 64 katını alıp 500-1000 MHz arasını taratacağım.Ama bütün olarak frekansı hesaplatmam zor görünüyor, 32 bit diziyi bölerek bu işi nasıl halledeceğimi bilemiyorum.Çözünülürlüktende taviz vermek istemiyorum, zira bu devre spektrum analizörde kullanılacak.

aslan_korhan

Çok iyi bir filtre devresi kullanman gerekir DDS çıkışında. Ayrıca çıkış seviyesi linear olmadığı için otomatik kazanç ayarlı bir yükselteç koyarasan daha iyi olur. Üst frekanslarda seviye düşüyor ve sinyal sinüse benzemiyor artık. Frekans katlama olayı pek iyi olmaz bence. Spectrum Analyzer yapacağından bir çok harmonik alırsın. 500 den 1000MHz'e kadar alıcı yapmak için en uygun AD9858. Bu direkt 500MHz'e kadar çalıştığından daha iyi. Bir tane sabit 500MHz Osilatör ve bunu bir mikser üzerinden DDS'in sinyali ile toplarsan olur.
Seri giriş kullansan bile baya hızlı oluyor. 4MHz PIC kullansan bile.
Tabiki program olarak IF THEN 'den farklı bir formül kullanman gerekir.
Yoksa hızın düşer.
Analog Devices'in sitesinde bu DDS'ler için örnek hesaplama programı var. Kendin yazacağın programda hesaplama işi biraz karışık gibi.
Stepler küsüratlı olduğundan uygun birşey bulmak lazım...

@      __config _XT_OSC & _WDT_OFF & _CP_OFF &_PWRTE_ON 
DEFINE OSC 4                                    ' 4MHz Clock
OPTION_REG = $7f                                ' PORTB'nin çekme dirençlerini devreye sok
DEFINE SHIFT_PAUSEUS 2                          ' DATA hızını belirle

SYMBOL DA=PORTB.0                               ' DATA pini
SYMBOL CK=PORTB.1                               ' CLOCK pini
SYMBOL EN=PORTB.2                               ' ENABLE pini

low en                                          ' Enabel'i low yap
pause 200                                       
main:
                   
'SHIFTOUT da,ck,4,[$9F,$F4,$49,$1F,$01]          ' 22MHz
'SHIFTOUT da,ck,4,[$6C,$C1,$16,$6C,$01]          ' 76MHz
'SHIFTOUT da,ck,4,[$7D,$D2,$27,$7D,$01]          ' 88MHz
'SHIFTOUT da,ck,4,[$50,$FA,$A4,$8F,$01]          ' 101MHz
'SHIFTOUT da,ck,4,[$42,$86,$CA,$CE,$01]          ' 145,4MHz
'SHIFTOUT da,ck,4,[$3F,$E9,$93,$FE,$01]          ' 179MHz
SHIFTOUT da,ck,4,[$AC,$8B,$DB,$00,$01]          ' 603KHz

low ck
pulsout en,3                                    ' Enable gönder
pause 2000
goto main

end                                             ' SON    


Bu şekilde istediğini gönderebilirsin. Deneme amacı ile yazmıştım.
Analog'un programının hesapladığı değerlere yazarak istediğin frekansı alırsın. Normalde ancak 70MHz'lere kadar çalıştığı halde 179MHz'e kadar çalıştı...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

askuzucu

Merhaba;
ad9851 datasheetinde 180 MHz ye kadar PLL bölücüsü olarak kullanılabileceği belirtilmiş.Hesaplamayı onun için yapıyor.
Hazır DDS devresinde kod göndermeyi denedim.Kodları aşağıdaki şekilde değiştirmem gerekti.
TRISA=1
TRISB=0
OPTION_REG.7=0                                
DEFINE SHIFT_PAUSEUS 5
DT VAR PORTB.7
CL VAR PORTB.5
FU VAR PORTB.0
CLEAR
W0 VAR WORD
W1 VAR WORD
B0 VAR W0.BYTE0
B1 VAR W0.BYTE1
B2 VAR W1.BYTE0
B3 VAR W1.BYTE1
pause 100
PORTB=0
shiftout  DT,CL,0,[1,0,0,0,0]
cl=0
FU=0      
FU=1
DT=0
PAUSEUS 10
FU=0
PAUSE 100
W0=5542
W1=4551
BASLA:
PORTB=0
for W1=4096 to 6000 step 2
shiftout  DT,CL,0,[B0,B1,B2,B3,1]
cl=0
FU=0      
FU=1
DT=0
PAUSEUS 10
FU=0
PAUSE 1
next w1
                                                                                     
GOTO BASLA
END                                  

İlk açılışta dds multiplieri (osilator sinyalini 6 ya katlayan)çalışmadı.Daha doğrusu çalışıyor, ancak genellikle çalışmıyor.Bu sorunu şu yolla aştım;
önce mutiplier kapalı (32.bit=0) olarak 0.01 Hz de çalıştırıp daha sonra ana proğramda multiplieri açarak(32.bit=1)kodu gönderip istediğim frekansı aldım.Hatta for next döngüsü ile tarama da yaptırdım.Ama gönderim süresi seri iletişimde çok uzun sürdügü için yavaş kaldı.En uygun yol palelel veri aktarımı galiba, yine onu deneyeceğim.Tabi 20 MHz osilator ile....