DDS – Parte Prática I: Dados do Sintetizador

Frequência de Amostragem

Após uma pequena introdução do sintetizador DDS iremos colocar a mão na massa. Portanto, nós devemos saber qual será a frequência de saída e então levantar os parâmetros do sistema.

Como exemplo, 0 nosso projeto sintetizador DDS deverá ter uma frequência de saída 10kHz (Fmáx). Segundo a Equação de Nyquist a frequência de amostragem dever ser maior ou igual a duas vezes da frequência máxima.

F∝ ≥ 2. Fmáx

F∝ ≥ 2. 10kHz

F∝ ≥ 20kHz

Portanto, a frequência de amostragem deverá ser no mínimo 20kHz. Para o projeto iremos utilizar 50MHz disponível no kit DE1 atendendo o Teorema de Nyquist.

 Acumulador de Fase (ω)

Em seguida calcularemos o valor do Acumulador de Fase (ω). Para isto, é necessário obter algumas informações, tais como número de bits (N) do Acumulador e as frequências de entrada e saída. Neste exemplo utilizaremos 32 bits para o Acumulador.

ω = (Fmáx . 2^N) / F∝

ω = (10kHz . 2^32) / 50MHz

ω = 858993,4592

Após obter o valor ω podemos saber qual será a real frequência de saída substituindo-o na equação acima e o erro de frequência:

ω = (Fmáx’ . 2^N) / F∝

858993 = (Fmáx’ . 2^32) / 50MHz

Fmáx’ = 9999,99465Hz

Logo o erro de frequência será:

ε = Fmáx’ / Fmáx

ε = 9999,99465Hz/ 10000Hz

ε =0,999999465

Portanto, o nosso código em VHDL para o Acumulador de Fase ficará conforme demonstrado abaixo sendo executado em um processo com sensibilidade ao clock de entrada (F∝) de 50MHz: 

Acumulador_de_fase:
process(iCLK)
begin

  if (rising_edge (iCLK)) then
 
    phase_acc <= phase_acc + 858993;

  end if; 

end process;
Conversor D/A e Look-up-Table

O Conversor  D/A foi utilizado do Microcontrolador LPC1768 da NXP com resolução de 10 bits. Sendo assim a LUT (Look-up-Table) obterá 1024 posições (2^10).

A função da LUT converterá os valores entregue pelo Acumulador de Fase em valores de amplitude para o conversor D/A. Abaixo segue um pequeno trecho do código da LUT em VHDL:

process(reset,clk)
begin

  if(reset = '1')then
    sin_data_int <= (others => '0'); 
 
  elsif(rising_edge(clk)) then
 
    if clk_en = '1' then
      sin_data <= sin_data_int; 
 
      case lut is 
        when 0 => sin_data_int <= ("1000000000"); 
        when 1 => sin_data_int <= ("1000000011"); 
        when 2 => sin_data_int <= ("1000000110"); 
        when 3 => sin_data_int <= ("1000001001"); 
        when 4 => sin_data_int <= ("1000001100"); 
        when 5 => sin_data_int <= ("1000001111"); 
        when 6 => sin_data_int <= ("1000010010"); 
        when 7 => sin_data_int <= ("1000010101"); 
        when 8 => sin_data_int <= ("1000011000"); 
        when 9 => sin_data_int <= ("1000011011"); 
        when 10 => sin_data_int <= ("1000011110");
        .
        .
        .
        when 1022 => sin_data_int <= ("0111111101"); 
        when 1023 => sin_data_int <= ("1000000000"); 
        when others => null;
      end case;
    end if; 
  end if; 
end process;

E abaixo o código do conversor D/A:

// Programa Principal
int main(void) 
{
  SystemInit(); // Configura os recursos básicos do microcontrolador. 
  NVIC_SetPriorityGrouping (0b010);
  Config_DAC(); // Chama a rotina de configuração do DAC

  // Ao infinito e além ...
  while(1) 
  {
    LPC_DAC->DACR = ((LPC_DAC->DACR &~(0x3FF<<6)) | (Digital_Input<<6));
  }
  return 0 ;
}

Conforme descrito anteriormente o Acumulador de Fase possui 32 bits e o Conversor D/A possui 10 bits. Então usaremos os 10 bits mais significativos (msb) do Acumulador para serem enviados para endereçar a LUT.

Acumulador_de_fase:
process(iCLK)
begin

  if (rising_edge (iCLK)) then
 
    phase_acc <= phase_acc + 858993;
    value_lut <= phase_acc(31 downto 22);

  end if; 

end process;

Neste momento iremos simular o código em VHDL utilizando o software Modelsim. A Figura 01 apresenta o sinal na saída do Acumulador de Fase (oDATA_SEN) e também podemos analisar a frequência de saída:

Figura01
Figura 01: Sinal na saída do FPGA.

O cursor na vertical em amarelo na Figura 01 verificamos o tempo de 1 ciclo do seno sendo em 100039911ps. Fazendo o inverso do período obtemos uma frequência de 9996,0104Hz.

No próximo tópico mostrarei o resultado no osciloscópio.

Até mais!

<=Anterior

Anúncios

Um comentário sobre “DDS – Parte Prática I: Dados do Sintetizador

  1. Pingback: DDS – Filtro de Reconstrução (Parte 5) | AGE TECHNOLOGY

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s