AD9833 sinüs sinyal üreteci.

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

ete

#30
Pepe ,
Thank you for the new program.
The LSB calculation and transferring it to Register is ok. It looks as $4C15.
But the MSB is seen 412A on the display it is wrong. It should be $404A instead $412A
The problem is here;
  FreqLSB = (frec & $3FFF) | $4000
            FreqMSB = (frec >> 14) | $4000
            SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]

Frec is 32 bit integer. To pull the LSB and MSB side, we need to make following calculation
FreqLSB=((Frec & $FFFF) & 3FFF) | $4000
FreqMSB=((Frec>>16) & 3FFF) | $4000

I do not understand why you use flag variable. My idea is will be better if you take out it and give above calculation only.

Ete

Pepe

programa corregido

Pepe

#32
la frecuencia se divide en dos partes de 14 bits alta y baja y despues se le adicionan 2 bit (b15 y b14) a cada uno para transmitir los dos registros de 16 bits

'****************************************************************
'*  AD9833 DDS Generator - PIC12F675                            *
'*  Frecuencia base: 455.000 Hz ±1.500 Hz según ADIN(1)         *
'****************************************************************

Device = 12F675
Config FOSC_INTRCIO, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, CP_OFF, CPD_OFF
Declare Xtal = 4

Declare Create_Coff On
Declare Optimiser_Level 3
Declare Watchdog Off

Declare Adin_Res = 10
Declare Adin_Tad = FRC
Declare Adin_Stime = 50

Symbol ADFM = ADCON0.7
Symbol DAT  = GPIO.2
Symbol CLK  = GPIO.4
Symbol ENA  = GPIO.5
Symbol tx   = GPIO.0

Dim ADCValue   As Word
Dim Frecuencia As Dword
Dim frec       As Dword
Dim FreqLSB    As Word
Dim FreqMSB    As Word
Dim adcval     As Word
Dim flag       As Bit
Dim temp As Dword

Symbol i      FreqMSB
Symbol sum    FreqLSB

TRISIO = %00000011      ' GP0 y GP1 entradas
GPIO = $20

ADFM = 1
ANSEL = %00000010       ' AN1 habilitado
adcval = 1024
DelayMS 100

'--- Inicialización AD9833 ---
ENA = 0
DelayUS 10
SHOut DAT, CLK, MsbFirst_H, [$0100\16]  ' Reset
ENA = 1
DelayMS 200

'--- Bucle principal ---
Do
    If tx = 1 Then
        sum = 0
        For i = 1 To 8
        sum  = sum + ADIn 1
        Next
        ADCValue = sum /8
    Else
        ADCValue = 511                     ' Punto medio fijo si tx=0
    EndIf
    
    If ADCValue <> adcval Then
        adcval = ADCValue
        
        ' Escala lineal: ±1500 Hz desde el centro (455000 Hz)
        ' ADC=0   ? -1500 Hz
        ' ADC=512 ?  0 Hz
        ' ADC=1023? +1500 Hz
        
        temp = (ADCValue * 1500 / 511) - 1500
        
        Frecuencia = 455000 + temp 
     
        '--- Conversión a palabra de frecuencia para AD9833 ---
       
        frec = (Frecuencia * 268.435456) / 25   ' Factor 2^28 / MCLK (25 MHz)
        
        ENA = 0
        
        If flag = 0 Then
            FreqLSB = (frec & $3FFF) | $4000
            FreqMSB = (frec >> 14) | $4000
            SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]
        Else
            FreqLSB = (frec & $3FFF) | $8000
            FreqMSB = (frec >> 14) | $8000
            SHOut DAT, CLK, MsbFirst_H, [$2800\16, FreqLSB\16, FreqMSB\16, $C000\16, $2800\16]
        EndIf
        
        Toggle flag
        ENA = 1
        
        DelayMS 50
    EndIf
Loop


ete

Pepe,

Try to compile following program and give me the hex file pls.

'****************************************************************
'*  AD9833 DDS Generator - PIC12F675                            *
'*  Frecuencia base: 455.000 Hz ±1.500 Hz según ADIN(1)         *
'****************************************************************

Device = 12F675
Config FOSC_INTRCIO, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, CP_OFF, CPD_OFF
Declare Xtal = 4

Declare Create_Coff On
Declare Optimiser_Level 3
Declare Watchdog Off

Declare Adin_Res = 10
Declare Adin_Tad = FRC
Declare Adin_Stime = 50

Symbol ADFM = ADCON0.7
Symbol DAT  = GPIO.2
Symbol CLK  = GPIO.4
Symbol ENA  = GPIO.5
Symbol tx   = GPIO.0

Dim ADCValue   As Word
Dim Frecuencia As Dword
Dim frec       As Dword
Dim FreqLSB    As Word
Dim FreqMSB    As Word
Dim adcval     As Word
Dim flag       As Bit

TRISIO = %00000011      ' GP0 y GP1 entradas
GPIO = $20

ADFM = 1
ANSEL = %00000010       ' AN1 habilitado

DelayMS 100

'--- Inicialización AD9833 ---
ENA = 0
DelayUS 10
SHOut DAT, CLK, MsbFirst_H, [$0100\16]  ' Reset
ENA = 1
DelayMS 200

'--- Bucle principal ---
Do
    If tx = 1 Then
        ADCValue = ADIn 1
    Else
        ADCValue = 511                     
    EndIf                  ' Punto medio fijo si tx=0
    
    If ADCValue <> adcval Then
       IF ADCValue>511 then
          Frecuencia = 455000 + ((ADCValue - 511) * 1500) / 511           
       else
          Frecuencia = 455000 - ((511 - ADCValue) * 1500) / 511   
       endIF
     ENDIF   
  '--- Conversión a palabra de frecuencia para AD9833 ---
     frec = (Frecuencia * 268.435456) / 25   ' Factor 2^28 / MCLK (25 MHz)
        
     ENA = 0
     
   	 FreqLSB=((Frec & $FFFF) & 3FFF) | $4000
	 FreqMSB=((Frec>>16) & 3FFF) | $4000   
    
     SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]

     ENA = 1
        
        DelayMS 50
    EndIf
Loop

ete

As you know (I hope you undrstood very well what ONUR is asking) there are two side of pot. If you turn it to clockwise the ADC value will be added to the center frequency.
If you turn the pot to the counterclockwise the  ADC value will be subtracted from the centre frequency.

Considering the Frec variable is 32 bit you should first divide it in two equal part each 16 bit. Than you take out the 15 and 14 bits or change them as %01
For this reason you can not shift the variable just 14 bits. You have to make it as 16 bits shifting.

The program which I gave you is right and I will wait the compiled hex file.

Ete

Pepe

ejemplo de baja frecuencia para demostrar que mis calculos son correctos.
La frecuencia central es de 1khz y varia entre 900hz y 1100hz.hay que esperar un poco para ver el valor en el frecuencimetro tambien se puede ver el periodo en el osciloscopio

ete

Pepe,

Pls. compile my program and put the files here.

Regarding your test program, do you make also calculation manually.
Because if the center frequency is 1000 hz the register calculation will be as follows.


Por favor, compile mi programa y coloque los archivos aquí.

En cuanto a su programa de prueba, ¿también realiza los cálculos manualmente?
Porque si la frecuencia central es de 1000 Hz, el cálculo del registro será el siguiente.

frec=(0,001*268435456)/25=10737 or $000029F1
Freq_LSB=($29F1 & $3FFF) | $4000 =$69F1 
your figure on display was $75C2 (Tu cifra en pantalla era $75C2).
Freq_MSB=($0000 & $3FFF) | $4000 =$4000 
your figure on display was $40A3 (Tu cifra en pantalla era $40A3)

This is the right calculation. Do not look to the frequency counter look to the figures
(Este es el cálculo correcto. No mires al contador de frecuencia, mira las cifras. )

I am waiting my program compiled (Estoy esperando a que se compile mi programa.)

Ete



Pepe

#37
el programa que desea que yo compile da errores de compilacion.
Aqui esta reformado para que compile pero creo que ud esta equivocado como maneja los registros porque al hacer or con $4000 esta modificando el valor de la frecuencia por considerar los 16 bits
'****************************************************************
'*  AD9833 DDS Generator - PIC12F675                            *
'*  Frecuencia base: 455.000 Hz ±1.500 Hz según ADIN(1)         *
'****************************************************************
 
Device = 12F675
Config FOSC_INTRCIO, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, CP_OFF, CPD_OFF
Declare Xtal = 4
 
Declare Create_Coff On
Declare Optimiser_Level 3
Declare Watchdog Off
 
Declare Adin_Res = 10
Declare Adin_Tad = FRC
Declare Adin_Stime = 50
 
Symbol ADFM = ADCON0.7
Symbol DAT  = GPIO.2
Symbol CLK  = GPIO.4
Symbol ENA  = GPIO.5
Symbol tx   = GPIO.0
 
Dim ADCValue   As Word
Dim Frecuencia As Dword
Dim frec       As Dword
Dim FreqLSB    As Word
Dim FreqMSB    As Word
Dim adcval     As Word
Dim flag       As Bit
Dim temp As Dword 
TRISIO = %00000011      ' GP0 y GP1 entradas
GPIO = $20
 
ADFM = 1
ANSEL = %00000010       ' AN1 habilitado
 
DelayMS 100
adcval =1024 
'--- Inicialización AD9833 ---
ENA = 0
DelayUS 10
SHOut DAT, CLK, MsbFirst_H, [$0100\16]  ' Reset
ENA = 1
DelayMS 200
 
'--- Bucle principal ---
Do
    If tx = 1 Then
        ADCValue = ADIn 1
    Else
        ADCValue = 511                     
    EndIf                  ' Punto medio fijo si tx=0
    
    If ADCValue <> adcval Then
         adcval= ADCValue
       If ADCValue>511 Then
         temp = (ADCValue - 511) * 1500 / 511
           Frecuencia = 455000 + temp         
       Else
        temp = (511 - ADCValue) * 1500 / 511 
         Frecuencia = 455000 - temp  
       EndIf
       
       
       
  '--- Conversión a palabra de frecuencia para AD9833 ---
     frec = (Frecuencia * 268.435456) / 25   ' Factor 2^28 / MCLK (25 MHz)
        
     ENA = 0
     
        FreqLSB=(frec & $3FFF) | $4000
     FreqMSB=((frec>>16) & $3FFF) | $4000   
    
     SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]
 
     ENA = 1
        
        DelayMS 50
     EndIf 
Loop


ete

Gracias, Pepe.

Program doğru çalışıyor. Simule edince merkez frekansı olan 455 Khz potun orta noktasında çıkmaktadır. Her ne kadar Frekans sayıcı bunu 453-454 gibi bir değer gösterse de zaman ölçümüne bakınca sinüs tepe noktaları arasındaki zamanın 2,19ms olduğunu görüyorum. Bu onun tam 455 Khz lik bir sinyal olduğunu gösteriyor. Tam da istediğimiz gibi pot ile oynayınca LSB değerini değiştiğini ama MSB değerinin hiç değişmediğini görebilirsiniz. Bunun sebebi 455 KHz lik merkez frekansında ±1.500 Hz lik bir değişim yapmış olmamız. Bu değişim yalnızca LSB yi etkilemektedir.
Pot'u yukarı alıp butona basınca sinyal hemen merkez frekansına dönmekte ve butonu bırakınca yeniden pot değeri değerlendirelerek hesaplanan frekans Out pininden çıkartılmaktadır.

Onur, umarım bu programı gerçek devresinde dener ve bize sonucu söylersin.

Ete

onurinci

hocam günaydın, bugün mutlaka neticeyi , detaylayacağım..

Pepe

Esto es lo que dice la ia

Para programar el AD9833 con 455 kHz (usando MCLK de 25 MHz), el valor hexadecimal completo es 0x4A87C3.
Los valores que se envían alregistro FREQ0 a través de la interfaz SPI se dividen en dos palabras de 16 bits, cada una con un prefijo de control (asumimos 0x4000 para seleccionar FREQ0).
Aquí están los valores hexadecimales exactos que se transmiten al chip:
1. Registro LSB (14 bits menos significativos)
Cálculo: Se enmascara la parte baja del valor: 0x4A87C3 & 0x3FFF = 0x3FE3
Valor a enviar (con prefijo): 0x3FE3 | 0x4000 = 0x7FE3
2. Registro MSB (14 bits más significativos)
Cálculo: Se desplaza el valor 14 bits a la derecha: 0x4A87C3 >> 14 = 0x012A
Valor a enviar (con prefijo): 0x012A | 0x4000 = 0x412A

Pepe

#41
demostracion proteus onda cuadradada con valores de registros usando >>14

onurinci

Hocam affınıza sığınıyorum, 10 gün evvel PK3 Microchip almıştım, bu gün taktım usb tanımadı, aradım ...renc.net'i , değişişim için ellerinde olmadığını , pazartesi teslim edebileceklerini söylediler.

konu çok güzel hararetli gidiyordu ne oldu anlamadım sakınan göze çöp oldu...

ete

Sağlık olsun. Değiştirince yaparsın.
Ancak PK2 ve PK3 için artık Pickit_minus isimli arayüzü kullanıyoruz. Devşce dosyası sürekli yenileniyor. Arayüz zaten microchip ile hemen hemen aynı.

https://github.com/jaka-fi/PICkitminus/releases/download/v3.28.03/PICkitminus_3_28_03.zip

bu en son versiyon. Yükleyip bir yerde dosyaları çıkar direk exe dosyasını kullanabilirsin. Kapsamlı setup yapmaya gerek yok. Bu exee hem pK2 yi hemde PK3 ü çalıştırmaktadır.

Ete

ete

#44
Pepe,
Me gustaría saber cómo ha obtenido AI estos valores.
La fórmula se encuentra en la hoja de datos. Según la fórmula:
(0,455 * 2^28)/25= 4A 8C16  este resultado debería ser correcto.
Dado que este resultado es de 32 bits, en realidad debería escribirse como $004A 8C16. Según esto, LSB=$8C16 y MSB=$004A.

En mi opinión, el cálculo de MSB de AI es incorrecto. Si desplazas 14 bits a la derecha de un número de 32 bits, obtienes un número de 18 bits. Sin embargo, el número debería ser de 16 bits. Por lo tanto, lo correcto es (($4A8C16>>16) & $3FFF) | $4000=$404A.

De todos modos, envía esos valores calculados al AD833 y mira qué pasa. La frecuencia resultante se lee como 1818 Hz en el frecuencímetro. Es un cálculo completamente erróneo.

0x4A87C3 & 0x3FFF = 0x3FE3 ....incorrecto   ,  0x4A87C3 & 0x3FFF = 0x07C3 .....correcto
0x4A87C3 >> 14 = 0x012A .......incorrecto  ,
0x4A87C3 ==> BIN 0000 0000 0100 1010 1000 0111 1100 0011 >>14 ==> 0000 0000 0100 1010 10
Los dos bits de la derecha(%10), que en realidad pertenecen al LSB, pasan al MSB y el resultado es incorrecto.                 

Ete

Powered by EzPortal
▲