DDS – “Direct digital synthesis”, geração de funções arbitrárias por software

Este artigo descreve um pouco sobre a técnica de geração digital de sinais arbitrários através da síntese digital direta.
síntese digital direta

Neste artigo iremos descrever um pouco sobre a técnica de geração digital de sinais arbitrários através da síntese digital direta, esse método pode ser de grande utilidade para gerar alguma forma de onda complexa para testes  utilizando o processador alvo (FPGAS são muito comuns nessa aplicação) quando um gerador de funções não se faz presente, ou mesmo quando o projeto exige a geração de de algum sinal que não se limita a uma onda quadrada periódica (por exemplo: Inversores com saída senoidal real, PLL digitais para demodulação de sinais FM).

Introdução:

É comum recorrer a um gerador de funções arbitrárias quando estamos testando algum sistema eletrônico que necessite de um estímulo complexo em sua entrada (entenda – se por aqui estímulo complexo, qualquer sinal gerado na entrada de um sistema que nao se limite apenas a uma borda de descida ou subida), como por exemplo um amplificador de áudio digital onde para testar diversos parâmetros, inclusive distorção. O que acontece é que nem sempre o gerador de funções irá oferecer a gama de forma de ondas necessárias para teste de uma aplicação, como o caso de um demodulador de FM onde precisamos propriamente de um sinal de FM contendo alguma informação, ou mesmo o próprio aparelho gerador de sinais pode não estar disponível para uso, para contorno desses casos a técnica de síntese direta digital permite a geração de uma ou mais formas de onda de diversos aspectos. Essa técnica trabalha partindo do princípio que qualquer sinal gerado, mesmo que não linear, possui a sua variação de fase obedecendo uma função de aspecto linear, assim bastando um conversor de fase para amplitude para que a cada tempo de amostragem “t” um valor numérico seja disponibilizado na saída desse sistema bastando efetuar sua conversão para o domínio analógico através de um conversor D/A.

Teoria de funcionamento:

Em sua forma mais simples um sistema de síntese digital de sinais tem seu diagrama de blocos como o da figura 1.

O sistema em si é bem simples, o principal componente é o acumulador de fase (referido na figura como phase accumulator) tem por função como o nome sugere de ir somando os saltos de fase vindos da palavra de frequência (Frequency Tunning Word) com o valor previamente acumulado (sua largura é tipicamente de 24 a 48 bits), onde seu valor é devidamente escalado e enviado ao conversor de fase para amplitude (referido na figura como phase-to-amplitude converter) esse componente tem por função mapear o valor de natureza linear vinda do acumulador de fase para a função (geralmente) não linear, esse conversor costuma tomar a forma de uma tabela que fica armazenada em uma memória não volátil, ainda esse componente armazena exatamente um período completo da forma de onda que se deseja reproduzir, o valor de saída desse componente por fim alimenta o conversor de dados (um conversor D/A por exemplo) reproduzindo amostra a amostra o sinal desejado.

síntese digital direta


Figura 1 – Diagrama de blocos de um sintetizador digital (ANALOG DEVICES, 1999).

Assim, a frequência do sinal obtido na saída obedece a seguinte relação:

fo =(M x fclock) /2N                    Eq.(1.1)

Onde:

                   fo: Frequência do sinal na saída do sistema DDS [Hz];

                   M: Valor da palavra de frequência (Tunning Word);

                   fclock: Frequência do clock que alimenta o sistema (System Clock) [Hz];

                   N:  Largura em bits do acumulador de fase.

Como todo sistema baseado em amostragem, a síntese direta possui algumas particularidades que devem ser levadas em conta durante a construção do sistema, uma delas é quanto a escolha da frequência de clock do sistema, para um sinal senoidal obedece-se o clássico teorema de Nyquist-Shannon que determina que a frequência de amostragem de um sinal deve ser maior ou igual a duas vezes a máxima frequência que aquele sinal atinge, logo:

fclock ≥ 2 x fo                    Eq.(1.2)

Obviamente essa adoção só é válida caso o sinal a ser gerado seja uma senóide, para outras funções essa relação pode aumentar bastante. Um valor prático para escolha da amostragem fica em:

fclock ≥ 10 x fo                    Eq.(1.3)

Além da escolha do valor da frequência de clock, vale observar que o número de amostras disponibilizadas na saída do sistema diminui com o aumento da frequência, isso ocorre pois a medida em que aumenta-se a palavra de frequência, os saltos de fase provocados pelo acumulador de fase serão maiores de modo que a retirada de valores de amplitude do conversor fase-para-amplitude serão mais curtos, estando esse fato também intimamente ligado a escolha da frequências máxima e de clock.

A figura 2 abaixo demonstra os domínios em que se encontram cada componente do sistema de síntese direta, bem como o fluxo dos sinais envolvidos.

síntese digital direta

Figura 2 : Fluxo de sinal e domínios do sistema de síntese direta (ANALOG DEVICES, 1999).

Exceto o conversor D/A, todos os componentes do sistema DDS estão no domínio digital e trabalham com valores númericos e discretos, permitindo a construção de um software ou mesmo uma descrição em VHDL para implementar essa função, até mesmo o conversor D/A costuma ser construído dentro de microcontroladores de uso geral facilitando ainda mais tal tarefa.

Vantagens:

O sistema de síntese direta digital apresenta algumas vantagens para seu uso em relação a outras formas de geração de sinais (baseadas em circuitos osciladores por exemplo), são algumas delas:

  • Resolução elevada, esses sistemas podem gerar diversos valores de frequência, com saltos variando em unidades de micro-Hertz;

  • Flexibilidade, uma vez que mais formas de onda podem ser adicionas ou mesmo modificadas apenas reprogramando o processador ou FPGA;

  • Maior imunidade às variações do ambiente que poderiam afetar circuitos de natureza analógica (temperatura, tensão de alimentação);

  • Inerentemente estável, sua função de transferência possui apenas zeros, o que o deixa com comportamento estável para toda faixa de frequência que foi projetado;

  • Troca de frequência rápida, diferente de circuitos de natureza analógica que precisam esperar o estado estacionário da malha de controle, ainda não produz overshoot na troca da frequência desejada.

Essas são apenas algumas vantagens para o uso de síntese direta digital em relação a circuitos analógico, ou mesmo quando um gerador de funções não está a disposição.

Soluções existentes no mercado:

Por ser uma técnica não necessariamente nova, ja existem no mercado soluções prontas baseadas nessa técnica, a própria Analog Devices fabrica em um unico chip todos os circuitos necessários para implementação de um gerador de sinais, vejamos abaixo o diagrama em blocos da referência AD9833.

síntese digital direta

Figura 3 : Diagrama de blocos AD9833 (ANALOG DEVICES).

Observando a figura acima, retirando-se o bloco de comunicação e algumas opções extras, a essência do sistema DDS está presente nesse chip , nesse caso o conversor de fase-para-amplitude é uma memória ROM que contém armazenado um período completo da função seno, esse chip é um dos mais simples que se pode encontrar, mas vale observar que ele consegue gerar sinais dente de serra e quadrado apenas passando colocando o valor do acumulador direto ao D/A ou o bit mais significativo deste.

Implementação em um processador de uso geral (microcontrolador?)

O circuito integrado mostrado no tópico anterior, é compacto e pode ser encontrado por menos de 5 dólares, porém para geração de formas de ondas mais complexas (por exemplo sinal modulado FM, um período de um sinal ECG) não podem ser concebidos com essa aplicação, assim a implementação em um microcontrolador de uso geral pode ser tornar interessante.

Freescale-Freedom-KE02Z.png síntese digital direta

Figura 4 : Kit Freedom Board

A figura 4 nos mostra a plataforma de  implementação do nosso sintetizador digital de sinais, utilizaremos o kit freedom fabricado pela Freescale, esse kit comporta um microcontrolador da família Kinetis – e tem a referência KE02Z64VQH2, esse micro possui um núcleo ARM Cortex – M0 e possui uma velocidade de clock máxima de 20MHz, a escolha desse micro se deve ao baixo custo do kit (em torno de U$ 12). Não entraremos em detalhes do kit ou do processador, que podem ser encontrados nos links ao final desse artigo.

Utilizaremos a máxima velocidade de relógio (visto que esse projeto não tem a intenção de ser de baixo consumo) que é 16 MHz para possibilitar o uso de diversas frequências de saída.

Para exemplificar bem onde um DDS implementado por software (ou VHDL) pode ser útil, optou-se pelo uso da banda de áudio e um sinal senoidal com amplitude igual a tensão de referência do D/A externo do microcontrolador, vamos ao projeto relembrando a equação 1.1:

fo =(M x fclock) /2N 

Nosso gerador irá trabalhar na banda de áudio, em teoria esse valor varia de 20 a 20KHz, logo á máxima frequência que desejamos sera:

fo = 20.000Hz

Sabemos a máxima frequência que nosso sistema irá operar, agora devemos especificar a quantidade de amostras que serão fornecidas na máxima frequência, sabemos que para um sinal senoidal podemos obedecer o teorema de Nyquist-Shannon e fornecer duas amostras a essa frequência, para melhor qualidade da senoide optou – se por 4 amostras, logo:

fclock =4 x fo → 4 x 20.000 = 80.000Hz

O último parâmetro a ser determinado é a largura do acumulador de fase, é comum seu valor estar entre 24 e 48bits, aproveitando que o processador escolhido é de 32bits, então esse será o valor da largura do acumulador de fase, logo::

N = 32

Sabemos a taxa de amostragem, a máxima frequência, porem precisamos limitar a palavra de frequência para que ela não provoque um salto maior que o suportado no acumulador de fase e que o valor não seja reconhecido pelo conversor fase-para-amplitude produzindo um valor indesejável de saída.
Nas condições já calculadas, relembremos a equação 1.1 novamente:

fo =(M x fclock) /2N

fo =(M x fclock) /2N  →  M x fclock = fo x 2N

.’.  M =(fo x 2N) / fclock                    Eq.(1.5)

Substituindo os valores na equação acima temos:

M= (20.000 x 232)/ 80.000 ≈ 1.073109

Em hexadecimal teremos:

MHEX =3FFFF8E0

Assim, conhecemos os principais parâmetros do nosso gerador digital de sinais, podemos proceder então com a implementação no microcontrolador, o fluxograma da figura abaixo mostra a simplicidade do código (melhorias podem ficar a cargo do leitor):

síntese digital direta

Figura 5 : Fluxograma do gerador exemplo

Observando em detalhes a figura acima, veremos que no arquivo principal teremos os triviais ajustes do microcontrolador, em seguida uma frequência exemplo sera configurada para o gerador e então o programa entrará em loop aguardando a ocorrência de uma interrupção, essa rotina por sua vez contém a parte interessante da aplicação, conforme foi especificado anteriormente, esta interrupção ocorre com a frequência de amostragem desejada (em nosso caso 80KHz), alí, o acumulador de fase será atualizado e em seguida escalado para 10 bits, esse valor é passado para o conversor fase-para-amplitude, que nada mais é do que uma tabela armazenada na memória de programa, possui 1024 posições com valores de 8 bits (variando no intervalo de 0 a 256), o valor retirado dessa tabela então é passado para o barramento de dados do GPIOA, esse então pode ser enviado a um conversor D/A paralelo como o DAC0808 (que pode ser fácilmente encontrado), e o processo ocorre de forma contínua.

O programa foi desenvolvido utilizando a IDE da própria Freescale, o Code Warrior versão 10, que pode ser obtido no site da própria fabricante, a IDE é bem flexível e intuitiva, além de oferecer suporte para o debugger da placa (OpenSDA), optou – se pelo desenvolvimento bare – metal , sem a interferência do processor expert de modo a facilitar a portabilidade e reduzir o número de arquivos utilizados.

O código é perfeitamente portável entre plataformas desde que as devidas adaptações dependentes do microcontrolador sejam reescritas, os arquivos estão na sessão de links ao final desse artigo. Em tempo, uma opção interessante é o uso da freedom board que tem o microcontrolador da sub-família KL25, estes possuem dois canais D/A internos dispensando o uso de um circuito integrado extra.

Resultados:

As fotos abaixo são da minha mesa, onde estou utilizando uma Analog Discovery da Digilent mais o uso do software Waveforms para efetuar as medidas e verificar o aspecto do sinal de saída, observamos um resultado bem satisfatório para um micro de pequeno porte como esse e dada a simplicidade do exemplo desenvolvido.

DDS_1K.png síntese digital direta

Figura 6 : Sinal de saída no D/A a 1KHz

Esse é o sinal de saida a 1KHz, observem que quase não há distorção do sinal de saída, resultados ainda melhores podem ser obtidos  com um filtro de primeira ordem (RC) logo na saída do D/A.
Vejamos agora o sinal de saída a 20KHz a máxima frequência:

DDS_20K.png síntese digital direta

Figura 7 : Sinal de saída do DDS a 20KHz.

Assim temos o sinal com máxima frequência, aqui observamos os “ressaltos” entre as amostras de uma forma mais visível, porém com pouco prejuízo da qualidade final do sinal gerado.
Além da qualidade de sinal, a resolução em Hertz é um outro fator vantajoso do uso de um DDS podendo se gerar frequências da ordem de micro-Hertz, assim para o nosso gerador digital, podemos calcular a resolução retomando a equação 1.1:

fo =(M x fclock) /2N  

Nesse caso colocaremos as condições de operação em menor frequência possível, ou seja quando a palavra de frequência M igual a unidade, assim a frequência adicionada a cada incremento de M será:

fo =(1 x 80.000) /232 = 18.62 uHz   

é possível então gerar estimulos para sistemas eletrônicos que tenha uma largura de banda – ultra baixa e com grande precisao, ou mesmo modular sinais em FM que exijam um desvio máximo de frequência bem baixo mantendo também a precisão. Assim podemos dizer que o resultado correspondeu bem as expectativas.

Conclusão, é mesmo viável implementar em software?

A resposta para a pergunta do título é: depende. Implementar o gerador digital de sinais em software pode ser uma boa alternativa para gerar estímulos complexos quando o gerador de bancada não pode fornecer ou mesmo quando não há um desses a disposição, contudo essa técnica torna – se inviável quando necessita – se de sinais de elevada frequência (por exemplo um sinal de teste modulado por fase) uma vez que o sinal ficará limitado a máxima taxa de amostragem e não só isso, ficará limitado a quanto da CPU podemos liberar para que tome conta apenas dessa tarefa.

Entretanto implementar essa técnica por software  pode ser útil para gerar o dado bruto que será tratado pelo sistema em teste, por exemplo um sinal de baixa frequência como ECG a ser usado por um equipamento médico, a reprodução da tensão da rede elétrica só que em menor amplitude para testar um inversor de tensão ou mesmo um gerador de áudio para teste de amplificadores por exemplo são casos onde essa técnica pode trazer beneficios de ter um equipamento de teste customizável e de baixo custo (uma vez que o pequeno Kinetis da freedom board deu conta do recado tranquilamente).

Quer aprender mais?

Abaixo deixamos alguns links interessantes que utilizam microcontroladores e fpgas para geração de funções usando técnicas numéricas como o DDS.

Repositório no GitHub com os arquivos para uso com a freedom board

Interessante demodulador de sinais FM digital onde uma PLL é implementada em  hardware em um FPGA, o VCO é implementado baseado na técnica apresentada desse artigo.

Biblioteca para Arduino utilizando a mesma técnica

Referências

ANALOG DEVICES, Fundamentals of Direct Digital Synthesis(DDS)

NATIONAL INSTRUMENTS, DDS Waveform Generation Reference Design for LabVIEW FPGA

PAPANIKOLAOU, Vassilis, AVR DDS Signal generator

YOUNGBLOOD, Gerald, Software defined radio for masses

http://www.ni.com/cms/images/devzone/tut/dhall_dds_image2.JPG

Engenheiro de sistemas embarcados apaixonado pelo que faz, tendo experiencia, nos últimos 15 anos, em áreas de alta tecnologia como: Defesa, Automotiva, Agricultura, Robótica e Semicondutores. Possui paixão por compartilhar e desmistificar tópicos de engenharia tidos como complexos ou misteriosos demais. Atualmente trabalha na Espressif Systems levando seus chips para projetos Open-Source. No tempo livre constroi e programa seus próprios robôs e controladores de motor.

10 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Eduardo Scherrer
Eduardo C. Scherrer
25/08/2014 20:34

Boa noite Felipe, Fábio.

Estou tentanto a muito tempo botar a freedom FRDM-KL25Z pra rodar no linux com eclipse.

Procurei em diversos lugares, mas até agora não consegui fazer rodar.

Achei até um post que explicava passo a passo, mas ainda não tive sucesso.

http://karibe.co.ke/2013/08/setting-up-linux-opensource-build-and-debug-tools-for-freescale-freedom-board-frdm-kl25z/

Se tiverem como fazer um post, ou me indicar algum link seria muito bem vindo.

Abraço

Eduardo Scherrer

Diego Sueiro
Diego Sueiro
Reply to  Eduardo C. Scherrer
28/08/2014 16:45

Eduardo,

Consultei uma FAE da Freescale e ele me respondeu o seguinte:

“A solução mais simples é utilizar o KDShttp://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=KDS_IDE&fpsp=1&tab=Design_Tools_Tab

Ele já vem com tudo que é necessário, e é baseado em Eclipse.”

Espero que te ajude.
Nos conte se deu certo.

Abraços

Eduardo Scherrer
Eduardo C. Scherrer
Reply to  Diego Sueiro
28/08/2014 17:23

Diego,

Hoje pela manhã eu consegui fazer rodar. Usei o post do Henrique em algumas partes.
Eu ia tentar mais um pouco antes de usar o Kds.

Vou fazer uns testes com o Kds no Linux.

Obrigado pela ajuda.

Eduardo.

Cristiano Bento
CDB
22/05/2014 11:45

Parabéns Felipe! Qual o melhor caminho para adquirir um Kit Freedom Board?

Fabio_Souza_Embarcados
Fabio_Souza_Embarcados
Reply to  CDB
22/05/2014 16:44
Cristiano Bento
CDB
Reply to  Fabio_Souza_Embarcados
22/05/2014 17:32

Vlw cara gostei do link … parece ser bem direto vou encomendar um Muito obrigado!!

Fabio_Souza_Embarcados
Fabio_Souza_Embarcados
Reply to  CDB
22/05/2014 18:01

Por nada! Pode comprar tranquilo com eles!!

Cristiano Bento
CDB
Reply to  Fabio_Souza_Embarcados
30/05/2014 16:41

Chegou aqui cara vlw pela dica… logo mais vou brincar com a belezinha …

Fabio_Souza_Embarcados
Fabio_Souza_Embarcados
Reply to  CDB
30/05/2014 18:38

Maravilha cara!! Amanhã eu vou ganhar uma Freedom tbm!! Abraços

André Castelan
06/05/2014 18:05

Sensacional este post! Muito completo, valeu Felipe.

WEBINAR

Imagens de Ultrassom: Princípios e Aplicações

DATA: 26/10 ÀS 19:30 H