top of page

[PT-BR] Gerador de sinais AD9850 + Arduino (Itens básicos e baratos para laboratório maker)

Neste post tratarei do elemento gerador de funções/sinais e no próximo post falarei sobre osciloscópio/analisador lógico de baixo custo (osciloscópio o qual já estou usando neste post).

Tudo que está descrito neste post é demonstrado no vídeo abaixo:

Gerador de funções/sinais (wikipedia)

O gerador de funções é um dos mais importantes equipamentos para se ter em um laboratório de eletrônica. O principal motivo: a maioria dos circuitos eletrônicos necessitam sinais de excitação com diferentes frequências (de alguns Hertz até dezenas de MHz), diferentes amplitudes (não abordado neste circuito no momento), e diferentes funções de onda (abordaremos neste post apenas a onda quadrada e senoide).

Gerador de sinais Maker de baixo custo

O gerador de sinais maker será feito baseado no chip AD9850 embarcado no módulo HC-SR08. O módulo com o chip pode ser facilmente encontrado no deal extreme por $12,99/R$43,23 (tem que ter paciência para receber), ou pode ser encontrado mais rapidamente no Brasil no Mercado Livre de R$60 até R$ 90. As figuras abaixo ilustram de duas formas diferentes os pinos/componentes do módulo, assim como o topo e fundo da PCB.

O módulo HC-SR08 possui um chip sintetizador direto digital completo AD9850 (Direct Digital Synthesizer - DDS), um tipo de sintetizador de frequência usado para criar formas de onda arbitrárias a partir de uma única referência fixa de frequência. O módulo pode ser alimentado tanto com 3.3 quanto com 5V (usei 5 volts neste post).

O núcleo do AD9850 contém uma palavra de configuração de frequência digital de 32-bit, que resulta em um ajuste de frequência com resolução de 0,0291 Hz para um relógio de referência de 125 MHz. A arquitetura do circuito AD9850 permite a geração de uma frequência de entrada de até metade do relógio de referência (62,5 MHz), e a frequência de saída pode ser modificada assíncronamente de forma digital em uma taxa de até 23M frequências por segundo (considerando o critério de Nyquist, isso permite uma modulação de dados em até 16M símbolos por segundo).

O dispositivo prevê cinco bits de controle para controle da fase do sinal, permitindo incrementos de fase (modulação) de 180°, 90°, 45°, 22.5°, 11.25°, e qualquer combinação destes.

O AD9850 contém um comparador de alta velocidade que pode ser configurado para aceitar a saída externa filtrada do DAC para gerar uma onda quadrada com baixo jitter, facilitando o uso do dispositivo como um gerador de relógio ágil.

A palavra de sintonia de frequência, controle e modulação de fase são carregados no AD9850 por meio de byte em interface paralela ou bit interface serial (usaremos somente a última neste post).

Assim com o módulo HC-SR08 podemos extrair do mesmo módulo duas formas de onda quadradas complementares (3.3-5V de pico-a-pico) e duas formas de onda senoidais complementares (1V de pico-a-pico), com frequências de 0,02 Hertz até 40 MHz.

3) Hardware

HC-SR08 AD9850 with ARDUINO circuit connections

Usei cabinhos jumper macho-fêmea para realizar as conexões do AD9850 para o arduino. Você acha facilmente esses cabos no mercado livre por menos de 15 reais (conjunto com vários macho-macho, fêmea-fêmea e macho-fêmea).

4) Firmware

Você pode achar todo o firmware usado neste post no meu repositório no GitHub (https://github.com/jrfoliveira/signal_generator).

O firmware foi desenvolvido em C++ no ambiente eclipse configurado para trabalhar com o Arduino via plugin Sloeber (veja como configurar o ambiente neste post).

O firmware utiliza a porta serial como porta de comunicação (via serial monitor do Arduino ou terminal que envie toda a informação de uma só vez, não use TeraTerm ou hyperterminal pois precisamos enviar os caracteres da frequência de uma vez só e sem caracteres CR+LF) para receber a frequência a qual o usuário deseja setar ao sinal do gerador. Segue abaixo o cabeçalho que você visualizará na porta serial após carregar o firmware compilado no arduino.

Signal Generator - jrfo Please enter frequency in Hz:

Para comunicação com o módulo HC-SR08 (AD9850) foi feita uma classe para o mesmo (usei o código do seguinte link). Nessa classe é possível chamar vários métodos (funções quando instanciamos um objeto AD9850), porém os mais importantes que fazemos uso no firmware são: begin (para inicialização do objeto), calibrate (opcional, usado para calibração fina do AD9850) e setfreq (este é o principal método pois atualiza a frequência e fase pedida no DDS).

As figuras acima ilustra tanto o diagrama lógico de seleção de comunicação serial (chamado na inicialização do AD9850, método begin_priv chamado dentro de begin), quanto o diagrama lógico de comunicação para atualização da frequência e fase do gerador de sinais (chamado pelo método setFreq após adquirir a frequência enviada pelo usuário pela porta serial).

De forma geral o fluxo do firmware é o seguinte:

a) Antes da função setup instanciamos um objeto DDS global por meio da linha "static hc_sr08::ad9850 dds;" dentro do arquivo signal_generator.cpp.

b) Na função setup (signal_generator.cpp), realizamos a inicialização do led do arduino (para indicar que o microcontrolador não travou ao usuário), realizamos a inicialização da porta serial (9600, 8bits, sem paridade, 1 bit de stop = 9600 8N1), e chamamos as funções begin(W_CLK_PIN, FQ_UD_PIN, DATA_PIN, RESET_PIN) que configura todos os pinos do AD9850 (respectivamente pinos 8, 9, 10, 11 do arduino uno), inicializa o AD9850 e calibra a frequência via a função calibrate (opcional).

c) Na função loop imprimimos o prompt via serial perguntando pela frequência que o usuário deseja ajustar no AD9850, e ficamos realizando duas ações: 1 - piscando o led do arduino para mostrar que o firmwar está ativo (não travado), 2 - aguardando a frequência na porta serial, que quando chega é convertida para um valor double que por meio da função setFreq ajusta a frequência do AD9850.

5) Integração/Testes

Nesta seção venho integrar tudo que foi mencionado anteriormente e procuro validar o funcionamento por meio de analise do sinal gerado via osciloscópio e da comunicação realizada com o AD9850 via analisador lógico digital.

Para realizar a integração e teste do gerador, usei um osciloscópio + analisador lógico bem barato (Hantek 6022BL). O mesmo custou $89 dólares na Amazon (algo em torno de R$ 280), no Brasil já conseguimos comprar o mesmo no mercado livre, porém o preço ainda é um pouco salgado (em torno de R$700).

Recomendo esse osciloscópio para atividades maker ou atividades de eletrônica que não necessitem monitoração de sinais acima de 5MHz. Digo isso porque a taxa de amostragem é de 48M amostras e uma regra de mercado indica que a frequência máxima é um décimo da taxa de amostragem (4,8 MHz, mas dá para arredondar para 5 MHz).

Adicionalmente esse osciloscópio é muito interessante pois vem com um analisador lógico digital que pode decodificar até 16 sinais em paralelo. O software da hantek ainda está muito fraquinho, mas como na china nada se cria tudo se copia, esse analisador lógico é compatível com um excelente analisador da saleae que possui um ótimo software que pode ser usado com o analisador da hantek. Desta forma usei este software para ver os diagramas lógicos que mostrarei mais adiante.

Caso você tenha problemas com o driver da hantek (problema de assinatura digital, segue o link para o driver do osciloscópio hantek com assinatura digital para windows 10.

Para utilizar o hantek na função osciloscópio/analisador lógico com os softwares da hantek, é necessário configurar o botão traseiro na posição H (como ilustrado na figura acima). Para utilizar o hantek como analisador lógico com o software da saleae é necessário configurar o botão traseiro na posição P. Lembrando que isso tem que ser feito antes de plugar o osciloscópio na USB, e os softwares tanto da hantek quanto da saleae devem estar previamente instalados.

A figura acima representa o setup de teste dos sinais senoidais e quadrados ao mesmo tempo (considerando apenas a frequência de 1MHz), ou seja, o setup pega ao mesmo tempo os sinais senoidais (normal e complementar) e quadrados (normal e complementar) com os dois canais do osciloscópio.

É possível notar que os sinais realmente são complementares (180º de diferença de fase), que os mesmos cravam em 1MHz como configurado via monitor serial, e que os sinais senoidais realmente apresentam 1 volt de pico-a-pico e os sinais quadrados apresentam 5 volts de pico-a-pico.

As ilustrações acima mostram os diagramas lógicos digitais enviados ao AD9850 durante a inicialização do firmware com o módulo HC-SR08. A primeira figura ilustra a sequencia de seleção do modo de comunicação serial, e a segunda figura ilustra os dois primeiros bytes da comunicação serial de um ajuste de frequência (com o arduino conseguimos atualizar o AD9850 com uma frequência de 60-80k bit por segundo, ou seja, atualizamos os 42 bits do AD9850 via serial em 0,5-0,7ms ou 1,9-1,4KHz).

As figuras acima ilustram o sinal quadrado em diferentes frequências configuradas (1, 2 e 5 MHz), assim como seus respectivos diagramas lógicos com sua palavra de sintonia sendo carregada no AD9850. É notável que atingimos com precisão as frequências com 5 volts de pico-a-pico e duty cycle de aproximadamente 50%.

IMPORTANTE: Caso você não visualize nada no osciloscópio de primeira, pode ser que seja necessário realizar um ajuste do duty cycle (realizado por meio do trimpot R13 disponível no módulo HC-SR08). Use uma pequena chave de fenda para ajustar o trimpot, observando ao mesmo tempo o sinal no osciloscópio.

Agora você pode se perguntar porque não foi testado frequências de 10, 20 e 40 MHz (limite do filtro do módulo HC-SR08) ? Gostaria de dizer que testei, porém devido a limitações do osciloscópio hantek (será mostrado em detalhes no próximo post), frequências acima de 5 MHz começam a ficar distorcidas. Segue abaixo algumas figuras ilustrando tal distorção.

É possível visualizar que a medida que passamos dos 5MHz recomendados para o hantek, a banda limitada do osciloscópio começa a distorcer a leitura do sinal de tal forma, que em 10MHz já visualizamos uma senoide invés da onda quadrada (as altas frequências são cortadas). Para os casos seguintes de 20 e 40MHz o corte é tão profundo, que o valor de pico-a-pico começa a reduzir e o nível DC começa a predominar na leitura do osciloscópio.

O AD9850 continua gerando a onda quadrada porém devido a limitação do osciloscópio hantek (48M sample/s) não vale a pena usá-lo para visualizar frequências acima de 5MHz.

6) Melhorias futuras:

A - Adicionar push-buttons e potenciômetro para ajuste da frequência direta;

B - Adicionar um amplificador ajustável para o sinal gerado com e sem remoção do nível DC (tanto para senoide quanto para o sinal quadrado);

C - Adicionar um LCD/Display;

D - Mudar a comunicação de serial para paralela com o AD9850 (aumento da taxa de atualização)

E - Implementação de outras funções (modulação AM, modulação FM, onda dente de serra e etc);

Após o próximo post, retornarei ao gerador de funções onde implementarei as melhorias futuras comentadas.

Aproveitem!

Featured Posts
Recent Posts
Search By Tags
Nenhum tag.
Follow Us
  • LinkedIn Social Icon
  • Facebook Social Icon
  • Twitter Social Icon
  • Instagram Social Icon
  • YouTube Social  Icon
bottom of page