AD9833 sinüs sinyal üreteci.

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

ete

Pepe,
Sin dar ninguna explicación, has dicho que tu programa no funciona con pic. Debes decirnos el motivo. Porque la primera versión de este programa funcionaba. En este programa que funciona, solo cambié el comando de desplazamiento de 16 bits por el de 14 bits, por lo que debería funcionar en tu programa. Como ya te he dicho antes, tras la compilación, también tienes que proporcionar los archivos HEX y COF. La simulación se puede realizar más fácilmente con COF, por eso quiero ese archivo.
Además, como no me has proporcionado el archivo BAS, no entiendo muy bien lo que has hecho.  Por lo tanto, vuelve a compilar mi programa y colócalo aquí, por favor. O, si hay algún error, dime cuál es.

Ete

Nota:
voy a explicar una situación adversa relacionada con tu programa.
Cuando el potenciómetro está en la posición máxima, el valor ADC leído será 1023.
En esta posición, se debe añadir 1500 Hz a la frecuencia central y la frecuencia resultante debe ser 456500 Hz. En esta posición, el valor LSB debe calcularse como $4B00.
Cuando el potenciómetro está en la posición mínima, la frecuencia será de 453500 Hz y, en consecuencia, nuestro valor LSB calculado será 4D2C.  Puedes comprobar estos valores realizando cálculos manuales.
Tu programa genera LSB=$4D2C cuando el potenciómetro está en la posición máxima y LSB=$4B00 cuando está en la posición mínima, es decir, da valores completamente opuestos. Compruébalo y verás.




Pepe

#61
en su programa con la modificacion no hay suficiente ram para el pic , mi programa funciona correctamente.



Frecuencia              FreqWord    FreqLSB FreqMSB
453.500 Hz (−1500 Hz)    4.869.420  $4D2C  $4129
455.000 Hz  (  0000  Hz)    4.885.526  $4C16  $412A
456.500 Hz (+1500 Hz)    4.901.632  $4B00  $412B

ete

Pepe,
¿Podrías probar el programa adjunto, por favor?
Ete

ete

Hesaplamasız çalışan programda ufak bir düzeltme yaptım yenisi ilişiktedir.
Sürekli hesaplama yapınca bazen kafa karışıyor yanlış değerler kullnılabiliyor.
Bu sefer dikkatli yaptığımdan emnim.Kusura bakmayın.

Ete


Pepe

#64
ya dije que no hay suficiente ram en el pic para poder compilarlo, la aritmetica de 32 bits que utiliza la libreria del compilador hace que se consuma mas ram y por lo tanto cualquier cambio adicional al programa hace que no compile por ram insuficiente


ete

Pepe,
No tengo compilador, por lo que no puedo saber si la memoria RAM es suficiente o insuficiente. Por eso te pido que lo pruebes.
Prueba el programa adjunto. He eliminado una variable dword. Quizás esta vez se compile.

onurinci

Hocam selam evde yerim olmadığı için yakın arkadaşların atölyelerini kullandığımdan gecikiyorum affola..

PicBasic Pro program..

DosyaTC kapanmış bende çok kısa Video olarak Youtube sayfama yükledim. anahtar basık iken sabit durması gereken yer sürekli değiştiği için Counter okuyamıyor, https://www.youtube.com/watch?v=ZEYAzNJhqKU

Anahtarı bırakıp ADC konumuna geçersem ,Pot en solda düşük konum 455.031  port ortada 2.5 iken gezinme başlıyor.

Pot en sağda 454.980 Hz oluyor.


Pepenin son yolladığı Limitleri aşmış derlenmiyor.

bir evvel yolladığı mükemmel çalışıyor. tam amaca hizmet ediyor. 5 Hz fazlası var tek hatası o...

ona dosyada hatasız ismini veriyorum..

Merkez anahtar basık .  455.005 Hz

pot en sol 453.505 pot ortada 2.5 volt adc 454.984 Hz  Pot en sağda 456.507..

ete

Protonda derleme yapabiliyor isen 65 nolu benim (Pepe ye) mesajım ekindeki programı bir derlermisin bakalım derlenecekmidir.
Yoksa derlenmiyor dediğin o programmıdır acaba.

yine yukarıda 63 nolu mesaj ekindeki programıda bir denermisin (hex olarak denemen gerek) nasıl çalışıyor ona da bakalım.

Ete

Pepe

#68
Onurinci ¿cual de los tres funciona correctamente?

onurinci

Pepe É ótimo, funciona perfeitamente. Agora, se você conseguir reduzir a precisão para 1,4 MHz ± 100 Hz, ficarei muito satisfeito. Atenciosamente.


'****************************************************************
'*  AD9833 DDS Generator - PIC12F675                            *
'*  Base Frequency: 455,000 Hz ±1,500 Hz Variable To 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 Frequency 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 And GP1 Input
GPIO = $20
 
ADFM = 1
ANSEL = %10010010      ' AN1 Enabled   CLK 100
	 
	DelayMS 100
	adcval =1024 
'--- Initialization AD9833 ---
	ENA = 0
	DelayUS 10
	SHOut DAT, CLK, MsbFirst_H, [$0100\16]  ' Reset
	ENA = 1
	DelayMS 200
	 
'--- Main Loop ---
	Do
	    If tx = 1 Then
	        ADCValue = ADIn 1
	    Else
	        ADCValue = 511                     
	    EndIf                  ' Fixed midpoint If tx=0
	    
	    If ADCValue <> adcval Then
	         adcval= ADCValue
	       If ADCValue>511 Then
	         temp = (ADCValue - 511) * 1500 / 511
	           Frequency = 455000 + temp         
	       Else
	        temp = (511 - ADCValue) * 1500 / 511 
	         Frequency = 455000 - temp  
	       EndIf
	       
	       
	       
'--- Frequency Word Conversion for AD9833 ---
	     frec = (Frequency * 268.435456) / 25   ' Factor 2^28 / MCLK (25 MHz)
	        
	     ENA = 0
	     
	        FreqLSB=(frec & $3FFF) | $4000
	        FreqMSB=((frec>>14) & $3FFF) | $4000   
	    
	        SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]
	 
	     ENA = 1
	        
	        DelayMS 50
	     EndIf 
	Loop
	 

onurinci

Hocam 65 nolu mesajı hata vermeden derledim..

onurinci

Hocam 63 nolu programı deneyip , yarın bildirebileceğim..

Pepe

'****************************************************************
'*  AD9833 DDS Generator - PIC12F675                            *
'*  Base Frequency: 455,000 Hz ±1,500 Hz Variable To 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 Frequency  As Dword
Dim frec       As Dword
Dim FreqLSB    As Word
Dim FreqMSB    As Word
Dim adcval     As Word
Dim temp       As Dword 
TRISIO = %00000011      ' GP0 And GP1 Input
GPIO = $20
 
ADFM = 1
ANSEL = %0010      ' AN1 Enabled  
	 
	DelayMS 100
	adcval =1024 
'--- Initialization AD9833 ---
	ENA = 0
	DelayUS 10
	SHOut DAT, CLK, MsbFirst_H, [$0100\16]  ' Reset
	ENA = 1
	DelayMS 200
	 
'--- Main Loop ---
	Do
	    If tx = 1 Then
	        ADCValue = ADIn 1
	    Else
	        ADCValue = 511                     
	    EndIf                  ' Fixed midpoint If tx=0
	    
	    If ADCValue <> adcval Then
	         adcval= ADCValue
	       If ADCValue>511 Then
	         temp = (ADCValue - 511) * 1500 / 511
	           Frequency = 455000 + temp         
	       Else
	        temp = (511 - ADCValue) * 1500 / 511 
	         Frequency = 455000 - temp  
	       EndIf
	       
	       
	       
'--- Frequency Word Conversion for AD9833 ---
	     frec = (Frequency * 268.435456) / 25   ' Factor 2^28 / MCLK (25 MHz)
	        
	     ENA = 0
	     
	        FreqLSB=(frec & $3FFF) | $4000
	        FreqMSB=((frec>>14) & $3FFF) | $4000   
	    
	        SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]
	 
	     ENA = 1
	        
	        DelayMS 50
	     EndIf 
	Loop
	 


ete

Bana göre en doğru program ilişikteki olmalı.
Pepe'nin verdiği ile doğru dediğimin arasında yalnızca 2 satır farklı.

Birincisi Pepe ANSEL registerini ANSEL=%0010 şeklinde kullanıyor.
Ben ise ANSEL = %00010010  şeklinde kullanıyorum. Zira ANSEL registeri 6-4 bitleri ADC CLK select işini üstlenir. Ben Fosc/8 kullanıyorum bu nedenle 4.cü bit 1 olmalı.
Pepe FRC kullanıyor bu durumda onun ansel registeri ANSEL=%00110010 şeklinde olmalı. Muhtemelen ADC ayarlaması için vermiş olduğu Declare Adin_Tad = FRC satırı bu kusuru düzeltiyordur.

İkinci fark , Frecuencia = 455000 + (ADCValue - 512) * 1500 / 511  satırında. Ben burada yer alan 512 değerini kullanıyorum çünki 1023-511=512 oluyor ama aslında 511 çıkması gerekiyor. Bu nedenle 512 kullanıyorum Pepe ise 511 kullanıyor. Pot maksimum seviyede iken hesap (512 x 1500)/511 =1502 çıkıyorki burada beklenen 1500 çıkmasıdır.

Programı yeniden veriyorum.

Ete
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 = 20
 
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

TRISIO = %00000011      ' GP0 y GP1 entradas
GPIO = $20
 
ADFM = 1
ANSEL = %00010010      ' AN1 habilitado
	 
	DelayMS 200
	adcval =1024 
	'--- Inicialización AD9833 ---
	ENA = 0
	DelayUS 10
	SHOut DAT, CLK, MsbFirst_H, [$0100\16]  ' Reset
	ENA = 1
	DelayMS 100
	 
	'--- Bucle principal ---
	Do
	    If tx = 1 Then
	        ADCValue = ADIn 1
	    Else
            Frecuencia=455000 
            GoTo calc                  
	    EndIf                  ' Punto medio fijo si tx=0
	    
	    If ADCValue <> adcval Then
	         adcval= ADCValue
	       If ADCValue>511 Then
	           Frecuencia = 455000 + (ADCValue - 512) * 1500 / 511         
	       Else
	          Frecuencia = 455000 - (511 + ADCValue) * 1500 / 511   
	       EndIf
calc:	       
	  '--- 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>>14) & $3FFF) | $4000   
	    
	        SHOut DAT, CLK, MsbFirst_H, [$2000\16, FreqLSB\16, FreqMSB\16, $C000\16, $2000\16]
	 
	     ENA = 1
	        
	        DelayMS 50
	     EndIf 
	Loop

Onur, bu porgramıda derleyip deneyebilirsin. Merak ediyorum 5 Hzlik fark burada da çıkacakmıdır.


onurinci

Hocam PEPE ANSEL'de Clock Divider kullanmıyor. Sadece portu seçmiş, Clock Divider'leri ben ilave ediyordum.

acaba bu bir kusurmu ? bunu yapmamın nedeni Proteus Clock uyuşmazlığı bildiriyor. onuda en soldaki 3 Bit ile oynayarak Suppress ediyordum.

Powered by EzPortal
▲