quarta-feira, 7 de maio de 2014

Controlando módulo DDS AD9850 com Raspberry Pi

AD9850 Raspberry Pi

Um DDS( Direct digital synthesizer ) é um sintetizador de frequências controlado digitalmente utilizando uma frequência de referência, geralmente um cristal.

O AD9850 é um chip DDS da Analog Devices bem famoso por ser possível encontrar um módulo de baixo custo(5-8 dólares) que o utiliza, digo isso pois o chip diretamente na Analog Devices saí por $12.14 cada quando comprado em quantidades de 1000 peças. O milagre desse valor ainda é incerto e apesar de algumas teorias de que são chips defeituosos com erros de produção, muitos usuários que o compram comentam que não vieram com problemas.

O módulo utiliza um cristal de 125Mhz como referência podendo gerar uma onda senoidal de até 40Mhz ou uma onda quadrada de até 1Mhz. Na realidade é possível gerar mais do que os 40Mhz especificados, mas cada vez mais que se aumenta a frequência a distorção e harmônicos aumenta, no caso da onda quadrada ela se torna cada vez menos quadrada. Além disso o chip conta com a função power-down controlada digitalmente para colocar o chip em sleep mode, modo de baixo consumo e é possível controlar o deslocamento de fase, com uma precisão de 11,61°, que é um tanto baixa, são somente 5 bits para controlar a fase.

O controle de frequência/fase/power é feito por um valor de 40 bits em um registrador interno. O envio desses bits pode ser feito por comunicação paralela enviando 8 bits por vez, ou serial enviando diretamente os 40 bits, um a cada pulso de clock no pino W_CLK, é o tipo de comunicação que usaremos.

Primeiramente precisaremos conectar os pinos do módulo no Raspberry Pi.

AD9850 Raspberry Pi
Legenda dos pinos

Os pinos vão ser conectados do seguinte modo:

VCC = 3.3V
GND = GND
W_CLK = GPIO11
FQ_UD = GPIO25
DATA = GPIO9
RESET = GPIO8
Pinos ZOUT e QOUT são respectivamente as saídas do sinal senoidal e quadrado.

Ilustração
Ilustração

É possível utilizar em outros GPIOs caso necessite, para isso será preciso alterar no código fonte para os valores que desejar.

#define W_CLK "11"
#define FU_UD "25"
#define DATA "9"
#define RESET "8"

No meu caso utilizei uma protoboard para ligação, caso a utilize, tome cuidado para colocar o módulo DDS, pois por causa dos vários pinos o encaixe se torna difícil.

Protoboard
Protoboard

Na parte de programação iremos utilizar o seguinte código fonte.



Compile com gcc dds.c -o dds

Ao executarmos sem argumentos temos as seguintes opções:

#./dds

  DDS AD9850 Controller for Raspberry Pi by blog.everpi.net

    Usage:  [option] [frequency in HZ] [phase]
             -o    chip shutdown

    Phase is optional, 31 Max.



A frequência é passada em Hertz, então se queremos por exemplo 1Khz:

./dds 1000

É necessário executar como usuário root.

1Khz Senoidal
1Khz Senoidal

Ou na saída quadrada ( QOUT ):

1Khz quadrada
1Khz quadrada

A opção -o é utilizada sozinha e faz com que o chip entre no modo power-down falado no início do post. Essa opção é útil em projetos que dependam de uma bateria e possam desligar o DDS em certos momentos.

Como meu osciloscópio vai somente até 20Mhz, à 40Mhz posso testar utilizando o dongle SDR que já comentei sobre em posts passados.

AD9850 gerando 40Mhz
AD9850 gerando 40Mhz

Como último teste do DDS, utilizei ele para gerar o clock para um Atmel Atmega 328P retirado do meu Arduino.


Clock gerado para Atmega
Clock gerado para Atmega

Abaixo podemos ver o vídeo de um simples led piscando e ao alterar a frequência de clock de 16Mhz para 8Mhz e 20Mhz, o intervalo que ele pisca vai ser diferente.



Controlar o DDS AD9850 pelo Raspberry Pi não é uma tarefa tão difícil e seu baixo custo torna ele talvez o mais acessível sintetizador de frequências de 40Mhz da atualidade.

Está gostando do blog? Ajude-nos a divulgar e curta nossa página no Facebook ou siga-nos no Twitter.

Nenhum comentário:

Postar um comentário