AD9833 sinüs sinyal üreteci.

Başlatan onurinci, 02 Kasım 2025, 21:11:41

Pepe

#45
Este es el procedimiento creado por Les el creador del compilador Proton Basic y también desplaza 14 bits, fue utilizado en el ejemplo de la onda cuadrada y pertenece a la librería creada por el.

' Set the frequency of the AD9833 device (in Hz)
' Input    : pChan holds the channel to alter the frequency for (0 or 1)
'          : pFreq holds the frequency required (in Hz)
' Output    : None
' Notes    : None
'
Proc AD9833_SetFreq(pChan As AD9833_bChannel, pFreq As Dword)
Global Dim AD9833_bChannel As Byte Shared                              ' Holds the channel for procedure parameters
    Dim wLSB As Word
    Dim wMSB As Word
    Symbol cPow2_28 = (268435456.0 / cAD9833_MCLK_Freq)                ' Calculate the frequency constant of: pow(2, 28) / cAD9833_MCLK_Freq

    If pFreq > cAD9833_Max_Freq Then
        pFreq = cAD9833_Max_Freq
    EndIf
    If pFreq.SDword < 0 Then
        pFreq = 0
    EndIf

    Select pChan
        Case 0
            wLSB = cAD9833_Freq0_Reg                                    ' Bit-15 and bit-14 hold 01
            AD9833_dFreq[0] = pFreq
        Case 1
            wLSB = cAD9833_Freq1_Reg                                    ' Bit-15 and bit-14 hold 10
            AD9833_dFreq[1] = pFreq
        Case Else
            ExitProc
    EndSelect
    wMSB = wLSB                                                        ' Copy wLSB into wMSB
    AD9833_wControl.cAD9833_B28_Bit = 1                                ' Make sure bit-B28 is set
    AD9833_WriteCtrlReg(AD9833_wControl)
'
' Convert the frequency to a value for the AD9833 device:
'  pFreq = (pFreq * pow(2, 28) / 25MHz)) Where... (25MHz = Frequency driving the MCLK pin)
'
    pFreq = pFreq * cPow2_28                                            ' cPow2_28 holds the calculation (pow(2, 28) / crystal frequency)
'
' Write 28 bits in two sets of 16-bits
'
    wLSB = wLSB | (pFreq & %0011111111111111)
    wMSB = wMSB | ((pFreq >> 14) & %0011111111111111)
    AD9833_WriteData32(wLSB, wMSB)
EndProc

La frecuencia de 28 bits se divide en dos de 14 para luego agregar 2 bits en la parte alta y obtener los valores de 16 bits que se transmiten.

ete

#46
Pepe,
Puede que tengas razón. No tengo experiencia con el AD833, lo estoy aprendiendo desde hace unos días.
Como el sistema utilizado es de 32 bits, supuse que el cálculo de la frecuencia era de 32 bits (2x16 bits). Sin embargo, creo que la frecuencia calculada se aceptará como de 28 bits. Digo «se aceptará» porque pueden aparecer diferentes números de bits según la frecuencia. Aquí ya es de noche, mañana lo examinaré y haré pruebas. Probablemente tendré que cambiar mi programa según esta lógica.
Gracias por insistir en explicarme cómo funciona realmente.
Ete

note:
Al realizar el cálculo con 28 bits, la frecuencia de 455 kHz aparece como 1820 Hz en la simulación. Si utilizo mi cálculo, el resultado es 453. Es difícil decidir cuál es el correcto.
Es necesario probarlo en un circuito real.

onurinci

Hocam bana bir semt uzakta bir arkadaşta PK2 varmış, yarın öğlen ona gidiyorum, oradan sonuçları paylaşacağım.. sevgiler..

ete

İnternette yaptığım araştırmada AD9833 frekans hesabında 28 bit kullanıldığını gördüm.
Bu konuda 16+16 bit üzerinden hesap yapmaya çalıştığım için hatalıyım.
Pepe yi kutlamak lazım. Bir sürü açıklama vererek dikkatimi çekmeyi başardı.

Her neyse hesap sistemimizde ufak bir değişiklik yapmamız gerekiyor.
Onu mesajın sonunda yeniden yapıp vereceğim.
Diğer taraftan hesabı doğru yapıp da simulasyonda düşük frekasn çıkmasınında bir sebebi varmış.
AD9833 model parametrelerine bakarsanız ortalarda Master Clock diye bir seçenek mevcut.
Burada default olarak 100K yani 100Khz yazıyor. Bütün hesaplamalarda ne hikmetse herkes 25Mhz ref osc değeri yani master Clk=25Mhz alıyor. Bizde hesaplarımızda bu değeri aldık. Hala anlamadığım şey bir çok şema ve açıklama inceledim yalnızca bir şemada AD9833'in MCLK pinine bir kristal osilatör bağlandığını gördüm. Pek çok kişi başka bağlantı gerekmez deyip MCLK pini boş bırakıyor.
Acaba entegre içinde bir iç osilatör mü var senbir şey bağlamaz isen o işi idare ediyor. Yoksa gerçek devrende buraya mutlaka bir osilatör bağlıyormusun? bilen varsa söylesin lütfen.

Simulasyonda yanlış sonuç almamın sebebi model parametresinde Master clk olarak 100K alınmış olması imiş.
O kutucukta yazan 100K yı silip yerine 25M yazınca çıkan sinyalde doğru çıkmaya başladı.

Sonuç olarak MCLK da 25Mhz lik bir ref sinyali olması gerek.

Gelelim Hesap kısmına.
Ana formül,................     Freq_Reg =(Out_Freq * 2^28) / 25 Mhz
Burada Out_Freq denilen şey çıkartmak istediğimiz sinyal frekansı oluyor. 2^28=268.435.456,- alınıyor. 25 Mhz de MCLK frekansı oluyor.
Şimdi 455Khz için yeniden bir örnek hesap yapalım.
Freq_Reg=(455.000 * 268.435.456)/25.000.000 =4.885.525,299 sondaki küsürat nedeni ile son rakamı bir artırıp çıkan değeri 4.885.526 olarak kullanacağız. BU sayının Hex karşılığı 4A 8C16 dır.
Önce Freq_LSB yi hesaplayalım.
Freq_LSB=($4A8C16 & $3FFF)= $0C16 olarak bulunur. Bu sayı 14 bitlik bir sayı ve bunun 15-14 nolu bitlerine %01 ekleyerek sayıyı 16 bit haline getiriyoruz. Burada %01 sayısı sıfır nolu Frekans Registerinin adresi oluyor.
Freq_Lsb=(4A8C16 & $3FFF) | $4000 = $4C16 şeklinde LSB register değerini hesaplamış olduk.

Şimdi MSB registerini hesaplayalım.
Freq_MSB=(4A8C16 >>14)= $012A  , işlemi ile frekans register değerimizi 14 bit sağa kaydırarak MSB tarafını alıyoruz. Sonra bu sayınında 15 ve 14 nolu bitlerine %01 sayısını yerleştiriyoruz.
Freq_MSB=(4A8C16 >>14)| $4000 =$412A olarak MSB tarafını hesaplamış oluyoruz.
Süreki sinüs dalga üzerine çalışıyoruz ama bu AD9833 aynı zamanda kare dalga ve testere dişi şeklinde dalgada üretebiliyor.
Registerlere yazma komutumuz ;
SHIFTOUT DAT, CLK, 5, [$21,$00,Freqlsb.BYTE1,Freqlsb.BYTE0,FreqmSB.BYTE1,FreqmSB.BYTE0,$C0,$00,$20,$00]
En sonda yer alan $20 $00 dalga şeklini belirliyor.
$00 yerine $28 yazarsanız sinyaliniz kare dalga çıkacaktır.
$00 yerine $02 yazarsanız sinyal testere dişi çıkacaktır.

Şimdilik bu kadar.

Ete

 

ete

Pepe,
Después de la configuración de cálculo de 14+14 bits, es necesario recompilar el programa.
Te agradecería que compilaras el programa adjunto y colocaras el archivo hex aquí.

Ete

onurinci

#50
Hocam bazi aksilikler oldu ama güzel şeylerde var Rapor halinde ekliyorum. bir dosya amaca uygun,

fakat bir ara durdu yarın yeni üniteler ile tekrar deneyeceğim..

bir ilave not pot gezerken kusurlu çalışanlarda oynamaması gereken Nibble'leride oynatıyor pot..

onurinci




sanki dalga formunu distort ettiriyor , oysa 1.4 MHz formu çok güzel

onurinci

#52



Frekans çok iyi GPS Disiplinli sayıcıda 5 Hz hata var , bunuda üzerindeki 25 MHz osilaörün tam frekansında olamamasından kaynaklanıyor. program son halini aldığında belki -5 yazıp yok edebiliriz,

onurinci

#53



Hocam'  Modul bu muhakkak dışarıdan 25 MHz hazır osilatör istiyor, iç osc'si yok. 5 ayaklı SOT23 çip

AD8051  yükseltici opamp. birde kazancı ayarlamak için MCP41010 digital Pot var ben buna hükmedemeyeceğim için kullanamıyorum, şansıma SPI' dan doğru bilgi gelmeyince en düşük direç değerinden başladı. sevindim..

onurinci

Hocam en son yolladığınız dosyayı derledim..

Pepe

#55
compilado,

@onur bu dosyayı kullan lütfen. (ete)

ete

Pepe,
No sé por qué, pero la simulación se bloquea. Quizás sea necesario ejecutar la simulación con el archivo .COF.
He detectado un pequeño error en el cálculo. Debería aparecer LSB $4C16, pero aparece $4C15.
¿Podrías volver a compilar el archivo adjunto? Además, te agradecería que añadieses los archivos Hex y COF.
Ete

ete

İlişikteki programı 455Khz merkez frekansını kullanarak ADC üzerinden pot değerine bağlı olarak +/- 1500 Hz fark oluşturan mantığı büyük hesap kullanmadan sadece değişen miktarları ekleyerek veya çıkartarak çalışacak şekilde hazırladım.
Simulasyonda çalışıyor gözüküyor. Gerçek devresinde de denemek gerekir. Zira sinyal peryodunda oluşan zaman farkı çok küçük olduğu için hassas bir şekilde ölçebilmek pek kolay değil

Ete

Pepe

su programa no entra en el pic, adjunto el mio que si funciona

Pepe

#59
El programa ad9833_ete.pbp calcula mal el msb debe dar $4129 en -1500

y $4126 en +1500, no $412A en ambos casos

El MSB cambia a $412A recién cuando la palabra vale 4882432 ≈ 455 000 Hz, o sea en la frecuencia central, no en −1500 Hz. o +1500

Powered by EzPortal
▲