# Generando señales utilizando DDS (Sintesis Digital Directa de Frecuencia)



## FernandROCK (Abr 24, 2009)

Hola, alguien de ustedes ha trabajado con DDS (Sintesis Digital Directa), para generar señales
Los DDS son chips que se utilizan para generar señales estables de diferentes frecuencia, pero de una forma digital, es decir utiliza registros de n bits, una memoria que contiene valores de una funcion sin/cos, etc. Y un ADC (Convertidor analógico a Digital).
Si pueden entren a la pagina de analog device: http://www.analog.com/en/index.html
Ahi les dejo un archivo para que se informen un poco mas acerca de los DDS.


----------



## jenn_t (Jul 1, 2009)

hola, yo tambien estoy desarrollando un sistema con DDS, pero las noticias no han sido muy wenas respecto a el, es un chip demasiado sensible. yo utilizo uno de 250 mhz como maxima frecuencia, aunke en realidad el chip estrabajable solo hasta 100mHz aprox.


----------



## FernandROCK (Abr 15, 2010)

Estoy trabajando con la tarjeta de evaluación del DDS AD9912 de analog device, utilizando el microcontrolador ATmega644P, controlamos la frecuencia de salida del AD9912, a través de un interfaz de control SPI. Los resultados han sido muy bueno, estamos generando frecuencia en el rango de VHF, principalmente 170 MHz, utilizando el DDS, modulamos tonos audibles, en FM de banda angosta, como les comento los resultados han sido muy buenos, bueno como aporte les dejo el programa en BASCOM del microcontrolador atmega644P para controlar el ad9912 via la interfaz SPI, es muy bueno revisenlo

```
+++++++++++++++++++PROGRAMA+++++++++++++++++++++++++++++++
'-------------------------------------------------------------------------------
'name                     : CH_AD9912_03_mod.bas
'copyright                : (c) 2009, Dipl.Ing. Dr. Christian Hirt, Austria
'purpose                  : AD9912 DDS Control TEST
'micro                    : ATmega32-16
'flash                    : 35% used
'programmer               : homebrew (STK200/STK300 emulation)
'compiler                 : MCS BASCOM-AVR 1.11.9.3
'hardware                 : AVR + AD9912 Modul + LCD
'code build               : 20032009 (20. März 2009)
'status                   : Only simulated
'run time                 : 2,57 ms with LCD
'-------------------------------------------------------------------------------
'$sim
$regfile = "m644pdef.dat"                                   'ATmega32
'$PROG &hFF , &hE1 , &hD9 , &h00        'Fuse bits. Take care !!
$crystal = 11059200
'stack and framesize not optimized!
$hwstack = 64
$framesize = 64
$swstack = 64
$baud = 9600
' ----- Config LCD 16 x 2 lines -------
Ddrc.3 = 1                                                  'R/W LCD bei Bascom normal auf GND
R_w Alias Portc.3                                           'R/W LCD bei Bascom normal auf GND
R_w = 0                                                     'R/W to GND bei Bascom normal auf GND
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portc.2 , E = Porta.1
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcdbus = 4
Initlcd                                                     'wegen R/W Leitung nötig
Cls
Cursor Off

'----- Config AVR SPI ----------
'Config Portb = Output
Ddrb = &B11111011                                           'portb = Output/Input
Ddra = &B00000110                                           'PA1,PA2 = Output
Spcr = &B01010001                                           'SPI Control Register
         ' Bit 0 = 1 SPR0 - 11059200Hz/16 = 691.2 kHz  bis 2.7 MHz getestet
         ' Bit 1 = 0 SPR1 - 11059200Hz/16 = 691.2 kHz
         ' Bit 2 = 0 CPHA - Clock Phase
         ' Bit 3 = 0 CPOL - Clock Polarity
         ' Bit 4 = 1 MSTR - Select as Master
         ' Bit 5 = 0 DORD - MSB first
         ' Bit 6 = 1 SPE  - SPI enabled
         ' Bit 7 = 0 SPIE - No SPI interupt if SPIF is set
Rst Alias Portb.0                                           'RESET
Ioupd Alias Porta.2                                         'IO-Update
Cs1 Alias Portb.4                                           'SPI-Chip1 Select
Cs2 Alias Portb.3                                           'SPI-Chip2 Select
'Sdio Alias Portb.5                                          'Harware SPI kein Config nötig
'Sclk Alias Portb.7                                          'Harware SPI kein Config nötig
Rst = 1                                                     'Inverse = 0
Waitms 10
'----- AD9912 Instruction Word Bits -----
Const Iwb = &B0110_0000                                     [EMAIL="'@MSB"]'@MSB[/EMAIL] first
   'Bit15 = R/W = 0 => Write
   'Bit14 = W1 = 1 and Bit13 = W0 = 1  => Streaming Mode
   'Bit0 - Bit12    => Selected Register Address (AD9912 Register Map)
'----- Declarations ----------------------
Dim D_ftw As Double
Dim Ref_freq As Double
Dim Freq As Double
Dim Freq_anz As Long                                        'Zusätlich für Frequenzanzeige LCD
Dim D_temp1 As Double , D_temp2 As Double
Dim Ftwo(6) As Byte
Dim L_j As Long
Dim Fstrng As String * 9
Dim S As String * 9
Dim S1 As String * 11
Dim Ftw As String * 16
Dim I As Byte
Dim A As Byte
Declare Sub Writedata(byval Dat As Byte)
Declare Sub Setaddr(byval Addr As Word)
Declare Sub Initad9912
Declare Sub Calcftwo
Declare Sub Writeftwo
Declare Sub Showfreqlcd
Declare Sub Showftwo_lcd

'Main begin -----------
Call Initad9912
Ref_freq = 1000000000                                       'Reference Frequency 1 GHz
Freq = 128500000                                            '--> Testfrequenz 300.0 MHz
Call Calcftwo
Call Writeftwo
Call Showfreqlcd
Call Showftwo_lcd
Print Ftwo(1)
Print Ftwo(6)
End                                                         ' Main End --------
'##########################################################################
Function Writedata(byval Dat As Byte)
   Spdr = Dat                                               'AVR SPI Data Register
   Bitwait Spsr.7 , Set                                     'wait until SPIF = 1
End Function
Function Setaddr(byval Addr As Word)                        'Set 16-bit Instruction Word
   Reset Cs1                                                'CS = 0
   Reset Ioupd                                              'IOUPD = 0
   A = High(addr)
   Spdr = A Or Iwb                                          'Instruction Word Bits
   Bitwait Spsr.7 , Set                                     'wait until SPIF = 1
   A = Low(addr)
   Spdr = A
   Bitwait Spsr.7 , Set                                     'wait until SPIF = 1
End Function
Sub Initad9912
   'AD9912 Chip Reset
   Rst = 0                                                  'Reset = 1  (Ansteuerung inverse)
   Waitms 10
   Rst = 1                                                  'Reset = 0  (Ansteuerung inverse)
   Waitms 10
   Reset Ioupd                                              'IOUPD = 0
   Set Cs1                                                  'CS = 1
   Call Setaddr(&H0000)                                     'Set Serial Config Register
   Call Writedata(&B0001_1000)                              'Default Hex 18 vorher keine DDS-Funktion!!
   'SDO Active = D0,D7 = 0 => 3-wire mode with SDIO
   'LSB First  = D1,D6 = 0 => MSB first
   'Soft Reset = D2,D5 = 0 => S1 to S4 tristated
   'Long Instr = D3,D4 = 1 => Long instructions only for Read
   Set Cs1                                                  'CS = 1
   Call Setaddr(&H0010)                                     'Set Power-Down and Enable
   Call Writedata(&B1100_0000)
   'HSTL Power down = D7 = 1
   'Disable CMOS     = D6 = 0
   'PLL Power Down  = D4 = 1
   Set Cs1                                                  'CS = 1
   'wait 1
   Call Setaddr(&H0022)
   Call Writedata(&B0000_0000)
   Set Cs1
   Call Setaddr(&H0500)
   Call Writedata(&B1000_1111)
   Set Cs1
   Call Setaddr(&H0505)
   Call Writedata(&B1000_1111)
   Set Cs1

End Sub
Sub Writeftwo                                               'Write FTWO into AD9912
   Call Setaddr(&H01ab)
   For A = 1 To 6
      Spdr = Ftwo(a)                                        'SPI Data Register
      Bitwait Spsr.7 , Set                                  'wait until SPIF = 1
   Next
   Set Cs1                                                  'CS = 1
   Set Ioupd                                                'IOUPD = 1
End Sub
 
'Calculate FTWO from Freq (Algorithm from Hecker & Steih)
Sub Calcftwo
   D_ftw = Freq / Ref_freq
   For I = 1 To 6
      D_temp1 = D_ftw * 256.0
      D_temp2 = Int(d_temp1)
      D_ftw = D_temp1 - D_temp2
      L_j = D_temp2
      Ftwo(i) = L_j
   Next I
End Sub

Sub Showfreqlcd                                             'show Freqency LCD upper line
  Freq_anz = Freq                                           'Left,Mid,Right funktioniert nicht mit Double
  Fstrng = Str(freq_anz)
  S = Format(fstrng , "000000000")
  S1 = Left(s , 3) + "." + Mid(s , 4 , 3) + "." + Right(s , 3)
  Upperline
  Cursor Off
  Lcd "F " ; S1 ; " Hz"
End Sub
Sub Showftwo_lcd                                            'show FTWO (hex) LCD lower line
  Ftw = "FTW "
  For A = 1 To 6
    Ftw = Ftw + Hex(ftwo(a))
  Next
  Lowerline
  Cursor Off
  Lcd Ftw
End Sub

'############################## End ############################################
```

En las proxima oportunidad, les publicare, los programas para modular tonos audibles y los esquematicos del circuito


----------



## cofhal (Abr 23, 2010)

FernandROCK dijo:


> Estoy trabajando con la tarjeta de evaluación del DDS AD9912 de analog device, utilizando el microcontrolador ATmega644P, controlamos la frecuencia de salida del ..............


esto*Y* trabajando en una tarjeta con e lAD9912 pero no se como hacer modulacion en FM y como generar tonos


----------



## jkoalaj10 (Dic 8, 2010)

estoy aprndiendo dobre dds, pero los pdf 's q dejaste para ilustranos los q no sabemos no se abren....q pasa fernanda rock.....ayudame porfa si puedes con esos pdf


----------



## tiago (Dic 9, 2010)

jkoalaj10 dijo:


> estoy aprndiendo dobre dds, pero los pdf 's q dejaste para ilustranos los q no sabemos no se abren....q pasa fernanda rock.....ayudame porfa si puedes con esos pdf



Se abren bien.  Comprueba o actualiza tu reader.

Saludos.


----------



## FernandROCK (Feb 21, 2011)

He realizado un Transmisor FM en la banda VHF usando la tarjeta de evaluacion del AD9912 y el microcontrolador ATmega644P. Si necesitas informacion mas profunda a cerca de este proyecto mi mail es:


----------



## gabriel77sur (Nov 26, 2011)

Hola todos disculpas por reabrir el tema solo a modo de consulta, recien estoy comenzando en el tema de los DDS, estoy utilizando un ad9851 pretendo generar señales de hasta 70 Mhz mi consulta va dirigida a la señal reloj que debo que debo inyectar en el pin nro 9 esta debe tener una amplitud de por lo menos 5 volt o me equivoco, de ser así tengo un oscilador ecl de 100 Mhz hay alguna forma de usarlo sin realizar cambios muy grandes desde ya muchas gracias por sus respuestas. saludos


----------



## ricbevi (Nov 26, 2011)

gabriel77sur dijo:


> Hola todos disculpas por reabrir el tema solo a modo de consulta, recien estoy comenzando en el tema de los DDS, estoy utilizando un ad9851 pretendo generar señales de hasta 70 Mhz mi consulta va dirigida a la señal reloj que debo que debo inyectar en el pin nro 9 esta debe tener una amplitud de por lo menos 5 volt o me equivoco, de ser así tengo un oscilador ecl de 100 Mhz hay alguna forma de usarlo sin realizar cambios muy grandes desde ya muchas gracias por sus respuestas. saludos



Hola...generalmente por lo practico se usa un modulo oscilador(rectangular de 4 pines) con salida ya TTL de 30Mhz y se activa el multiplicador interno X6 para tener el reloj en 180Mhz y así en teoría te puedes acercar a la salida a la frecuencia de 1/2 reloj(90Mhz) si no debes generarlo tu mediante XTAL + cirxcuito oscilador + adaptador salida niveles TTL.

Saludos.

Ric.


----------



## gabriel77sur (Nov 26, 2011)

Hola ricbevi, gracias por responder a mi consulta, acá me surgen nuevas dudas en el circuito original me pide un oscilador TTL de 100 Mhz como el que tu describes, el que yo tengo es similar solo solo que la señal es mucho mas baja la idea esta en amplificarla y llevarla a un valor TTL pero eso implica modificaciones mayores, mi nueva duda esta el multiplicador x 6 se activa al leer que la señal es de 30 Mhz o tambien multiplicaría mi señal de 100 Mhz, gracias nuevamente


----------



## ricbevi (Nov 26, 2011)

gabriel77sur dijo:


> Hola ricbevi, gracias por responder a mi consulta, acá me surgen nuevas dudas en el circuito original me pide un oscilador TTL de 100 Mhz como el que tu describes, el que yo tengo es similar solo solo que la señal es mucho mas baja la idea esta en amplificarla y llevarla a un valor TTL pero eso implica modificaciones mayores, mi nueva duda esta el multiplicador x 6 se activa al leer que la señal es de 30 Mhz o tambien multiplicaría mi señal de 100 Mhz, gracias nuevamente



A los osciladores que me refería es a estos que subo en las imágenes...los mismos están recuperados de placas de red antiguas de bus ISA de 10Mbs. Colocan al activar en el AD9851 el multiplicador interno X6 a 120Mhz lo que permite llegar hasta los 60Mhz de frecuencia de generación. La hoja de datos la tienes acá  http://www.alldatasheet.es/datasheet-pdf/pdf/48611/AD/AD9851.html y trabaja con frecuencias de reloj de hasta 180Mhz a si que si el oscilador esta a 100Mhz no puedes activar el multiplicador X6 y solo llegarías hasta los 50Mhz a la salida.
Hay infinidad de proyectos en base a ese chip. Incluso se venden placas armadas de generadores desde U$A50 por Ebay.

Ric.


----------



## gabriel77sur (Nov 26, 2011)

OK ricbevi ya entendí el tema del multiplicador, el tema es que tengo dos osciladores uno de 16 Mhz TTL idéntico al de la foto, el otro es igual pero funciona con 3,3 volt con una frecuencia de 100 Mhz y la señal generada es apenas de 100 mVpp, a lo que me referia es si hay alguna forma de usar este oscilador sin tener que amplificar la señal generada, digamos ya sea colocando un divisor en el pin 9 del reloj no se si me explico.


----------



## ricbevi (Nov 27, 2011)

gabriel77sur dijo:


> OK ricbevi ya entendí el tema del multiplicador, el tema es que tengo dos osciladores uno de 16 Mhz TTL idéntico al de la foto, el otro es igual pero funciona con 3,3 volt con una frecuencia de 100 Mhz y la señal generada es apenas de 100 mVpp, a lo que me referia es si hay alguna forma de usar este oscilador sin tener que amplificar la señal generada, digamos ya sea colocando un divisor en el pin 9 del reloj no se si me explico.


  Segun mi entender y te lo exprese en mis anteriores post NO( SIC " si no debes generarlo tu mediante XTAL + cirxcuito oscilador + adaptador salida niveles TTL.")ya que dicho integrado trabaja con señales de CLOCK con niveles TTL SI O SI. Acá un par de ejemplos http://www.hamradioindia.org/circuits/dds.php?sid=339473256352b2ef58ee5aaa2e35f819 
http://www.njqrp.org/dds/

Ric.


----------



## gabriel77sur (Nov 27, 2011)

ok Ric creo que no me queda otra alternativa que amplificar la señal de 100 mVpp hasta un nivel TTL, mi consulta estaba vista del punto que lei en un articulo en donde conectaban una resistencia de 22k entre masa y el pin 9 y la otra del mismo valor entre Vcc (5 volt) y el pin  nro 9 no entendí a que se debia, solo se que el circuito usaba un oscilador de 100 Mhz y de ese punto tomaban para una señal externa también en fin creo que habra que experimentar y esperar que no se dañe el ad9851 gracias por tus respuesta y aclararme un poco el tema, saludos


----------

