Diagrama esquemático de um gerador dds em um microcontrolador atmel. Gerador dds funcional no plc. Teste dos modos de operação do gerador após montagem

Diagrama esquemático de um gerador dds em um microcontrolador atmel.  Gerador dds funcional no plc.  Teste dos modos de operação do gerador após montagem
Diagrama esquemático de um gerador dds em um microcontrolador atmel. Gerador dds funcional no plc. Teste dos modos de operação do gerador após montagem

Frequência máxima - 65534 Hz ​​​​(e saída HS de até 8 MHz com onda quadrada). E então pensei que um gerador é uma excelente tarefa onde o FPGA pode se mostrar no seu melhor. Por uma questão de esporte, resolvi repetir o projeto em FPGA, cumprindo os prazos em dois finais de semana, e conseguindo os parâmetros não estritamente definidos, mas os máximos possíveis. Você pode descobrir o que resultou disso sob o corte.

Dia zero

Antes de chegar o fim de semana, tive algum tempo para pensar na implementação. Para simplificar minha tarefa, decidi fazer o gerador não como um dispositivo separado com botões e tela LCD, mas como um dispositivo que se conecta a um PC via USB. Para isso tenho uma placa USB2RS232. A placa não necessita de drivers (CDC), portanto acho que funcionará no Linux (para alguns isso é importante). Além disso, não vou esconder que já trabalhei com recebimento de mensagens via RS232. Vou pegar módulos prontos para trabalhar com RS232 em opencores.com.

Para gerar um sinal de onda senoidal, você precisará de um DAC. Escolhi o tipo DAC, como no projeto original - R2R 8 bits. Isso permitirá operar em altas frequências, da ordem de megahertz. Estou convencido de que o FPGA deveria lidar com isso

Eu estava pensando em como escrever um programa para transmissão de dados através de uma porta COM. Por um lado, você pode escrever em Delphi7; você já tem experiência em escrever tal programa e, além disso, o tamanho do arquivo executável não será grande. Também tentei esboçar algo para funcionar com Serial na forma de um script java em uma página html, mas funcionou mais ou menos apenas através da API serial do Chrome, mas para isso é necessário instalar um plugin... em geral , também está fora de questão. Eu tentei o PyQt5 como uma inovação para mim, mas ao distribuir tal projeto, você precisa arrastar um monte de bibliotecas. Depois de tentar compilar um projeto PyQt em um arquivo exe, ele tinha mais de 10 MB. Ou seja, não será melhor que uma aplicação escrita em C++\Qt5. Também vale a pena considerar que não tenho experiência em desenvolvimento em python, mas tenho experiência em Qt5. Portanto, a escolha recaiu sobre o Qt5. Desde a quinta versão apareceu um módulo para trabalhar com serial e já trabalhei com ele. E um aplicativo baseado em Qt5 pode ser transferido para Linux e Mac (para alguns isso é importante), e a partir da versão 5.2, aplicativos baseados em QWidgets podem até ser transferidos para um smartphone!

O que mais é necessário? Naturalmente, a placa possui um FPGA. Eu tenho dois deles (Cyclone iv EP4CE10E22C8N para 10 mil células e Cyclone ii EP2C5 para 5 mil células). Escolherei o da esquerda apenas por causa do conector mais conveniente. Em termos de volume, o projeto não pretende ser grande, portanto caberá em qualquer um dos dois. Eles não diferem na velocidade de operação. Ambas as placas possuem osciladores de 50 MHz integrados, e dentro do FPGA existe um PLL, com o qual posso aumentar a frequência para os 200 MHz planejados.

O primeiro dia

Por já ter feito o módulo DDS no meu projeto de sintetizador, peguei imediatamente o ferro de soldar e comecei a soldar o DAC com resistores. Peguei uma placa protótipo. A instalação foi feita em embalagem. A única mudança que afetou a tecnologia foi que abandonei o ácido F38N para estanhar as arquibancadas em favor do gel de fluxo indicador TT. A essência da tecnologia é simples: eu soldo racks em uma placa de circuito impresso e soldo resistores neles do lado da placa de circuito impresso. Eu faço as conexões que faltam torcendo. Além disso, os racks são convenientes porque posso inseri-los diretamente na placa FPGA.

Infelizmente, não havia resistores de 1 e 2 quilo-ohms disponíveis em casa. Não houve tempo para ir à loja. Tive que desistir de uma das minhas regras e remover resistores da antiga placa desnecessária. Resistores de 15K e 30K foram usados ​​lá. O resultado é este Frankenstein:


Após criar o projeto, você precisa definir o dispositivo alvo: Menu Atribuições -> Dispositivo


No projeto, codifiquei o módulo DDS principal incontrolável para uma frequência fixa.

Módulo Gerador de 1000 Hz

módulo signal_generator(clk50M, signal_out); fio de entrada clk50M; sinal de saída do fio_out; fio clk200M; acumulador osc osc_200M reg; atribuir signal_out = acumulador; //tenta gerar 1000 Hz //50.000.000 Hz - frequência de clock do gerador externo //2^32 = 4.294.967.296 - profundidade de bits DDS - 32 bits //divide 1000Hz / 50.000.000 Hz / 2 * 4294967296 => 42949, 67296 sempre @ (posege clk50M) iniciar acumulador<= accumulator + 32"d42949; end endmodule


Depois disso, cliquei em “Iniciar Compilação” para que o ambiente de desenvolvimento perguntasse quais linhas de entrada/saída temos no módulo principal do projeto e a quais PINs físicos elas estão conectadas. atribua as linhas que aparecem aos PINs reais do chip FPGA:

Item de menu Atribuições -> Pin Planner

Por enquanto, ignore as linhas HS_OUT, key0 e key1, elas aparecem no projeto mais tarde, mas não tive tempo de fazer uma captura de tela logo no início.

Em princípio, basta “cadastrar” apenas PIN_nn na coluna Localização, e os demais parâmetros (padrão I/O, Strench atual e taxa de variação) podem ser deixados como padrão, ou você pode selecionar os mesmos que são oferecidos por default (padrão) para que não haja nenhum aviso "ov.

Como posso saber qual PIN corresponde ao número do conector na placa?

Os números dos pinos do conector estão marcados na placa


E os pinos FPGA aos quais os contatos do conector estão conectados estão descritos na documentação que acompanha a placa FPGA.




Depois que os pinos são atribuídos, compilo o projeto novamente e o atualizo usando um programador USB. Se você não possui drivers instalados para o programador USB Byte blaster, informe ao Windows que eles estão localizados na pasta onde o Quartus está instalado. Então ela mesma encontrará.

O programador deve estar conectado ao conector JTAG. E o item de menu para programação é “Ferramentas -> Programador” (ou clique no ícone na barra de ferramentas). O botão “Iniciar”, o alegre “Sucesso” e o firmware já estão dentro do FPGA e já funcionam. Só não desligue o FPGA, senão ele vai esquecer tudo.

Ferramentas -> Programador


O DAC está conectado ao conector da placa FPGA. Eu conecto o osciloscópio S1-112A à saída DAC. O resultado deve ser uma “serra” porque a parte superior da palavra DDS do acumulador de fase é enviada para a saída de 8 bits. E sempre aumenta até transbordar.

Cerca de 1,5 horas e para uma frequência de 1000 Hz vejo o seguinte oscilograma:

Gostaria de ressaltar que a “serra” apresenta uma pequena fratura no meio. Isso se deve ao fato de os resistores possuírem uma faixa de valores.

Outro ponto importante que precisa ser esclarecido é a frequência máxima possível com que o gerador DDS irá operar. Com os parâmetros TimeQuest configurados corretamente, após a compilação no “Relatório de Compilação” você pode perceber que a velocidade do circuito está acima de 200 MHz com uma margem. Isso significa que multiplicarei a frequência do gerador de 50 MHz por 4 usando PLL. Aumentarei o valor do acumulador de fase DDS com frequência de 200 MHz. A faixa de frequência final que pode ser obtida em nossas condições é de 0 a 100 MHz. Precisão de configuração de frequência:

200.000.000 Hz (clk) / 2 ^ 32 (DDS) = 0,047 Hz
Ou seja, é melhor que ~0,05 Hz. Considero a precisão de uma fração de hertz suficiente para um gerador com essa faixa de frequências de operação (0...100 MHz). Se alguém precisar aumentar a precisão, então para fazer isso você pode aumentar a profundidade de bits DDS (lembre-se de verificar no TimeQuest Timing Analyzer se a velocidade de operação do circuito lógico estava dentro de CLK = 200 MHz, porque este é um somador), ou simplesmente reduza a frequência do clock, se uma faixa de frequência tão ampla não for necessária.

Analisador de tempo TimeQuest


Depois que vi “vi” na tela, assuntos familiares me obrigaram a ir para o campo (era meu dia de folga). Lá cortei, cozinhei, fiz churrasco e não tinha ideia da surpresa que me esperava à noite. Mais perto da noite, antes de ir para a cama, decidi observar o formato do sinal para outras frequências.

Para frequência 100 kHz

Para frequência 250 kHz

Para frequência 500 kHz

Para frequência de 1 MHz

Segundo dia

Por ser interessante como o DAC funcionaria em resistores de 100 e 200 Ohms, peguei imediatamente o ferro de soldar. Desta vez o DAC revelou-se mais preciso e demorou menos para instalá-lo.

Colocamos o DAC na placa FPGA e conectamos ao osciloscópio

Verificando 1 MHz - VO! É uma questão completamente diferente!

Vi 10 MHz

Vi 25 MHz


O formato da serra de 10 MHz ainda é semelhante ao correto. Mas em 25 MHz não é mais “bonito”. Porém, o C1-112a tem largura de banda de 10 MHz, então neste caso o motivo já pode estar no osciloscópio.

Em princípio, esta questão com o DAC pode ser considerada encerrada. Agora vamos pegar as formas de onda da saída de alta velocidade. Para fazer isso, enviaremos o bit mais significativo para um PIN separado do FPGA. Pegaremos os dados desta linha do bit mais significativo do acumulador DDS.

Atribuir hs_out = acumulador;

Onda quadrada 1 MHz

Onda quadrada 5 MHz

Onda quadrada 25 MHz

A onda quadrada de 50 MHz é quase invisível agora


Mas acho que a saída do FPGA deveria ser carregada com resistência. Talvez as frentes fossem mais íngremes.

O seno é feito conforme tabela. O tamanho da tabela é de 256 valores de 8 bits. Seria possível levar mais, mas eu já tinha um arquivo mif pronto. Usando o assistente, criamos um elemento ROM com dados da tabela senoidal do arquivo mif.

Criando uma ROM - Ferramentas -> Gerenciador de plugins do Mega Wizard


Selecione 1 porta ROM e dê um nome ao módulo

Nós concordamos

Nós concordamos aqui também

Usando o navegador, encontramos nosso arquivo mif com a tabela senoidal

Também não mudamos nada aqui.

Desmarque o módulo sine_rom_bb.v - não é necessário. Próximo acabamento. Quartus pedirá para adicionar um módulo ao projeto - nós concordamos. Depois disso, o módulo pode ser usado como qualquer outro módulo do Verilog.


Os 8 bits superiores da palavra do acumulador DDS serão usados ​​como endereço ROM e a saída de dados será o valor senoidal.

Código

//fio rom senoidal sine_out; seno_rom seno1(.clock(clk200M), .address(acumulador), .q(sine_out));


O oscilograma de uma onda senoidal em frequências diferentes parece... igual.

Se desejar, você pode considerar os problemas do DAC associados à propagação do resistor:

Bem, esse é o fim do fim de semana. Mas o software para controle a partir de um PC ainda não foi escrito. Sou obrigado a admitir que não cumpri os prazos previstos.

Dia três

O tempo é muito curto, por isso escrevemos o programa às pressas (nas melhores tradições). Em alguns locais, para reduzir o número de letras e facilitar a inserção de informações pelo teclado, é utilizado um filtro de eventos por nome do widget. Por favor, entenda e perdoe.

Interface

Links com análogos

Não é uma lista completa
Gerador DDS funcional. Criado com base em AVR. Frequências 0...65534 Hz.
Revisão do gerador DDS GK101. Criado usando Altera MAX240 FPGA. Frequências até 10 MHz.
Gerador multifuncional no PIC16F870. Faixa de frequência: 11 Hz - 60 kHz.
geradores Adicionar tags

Frequência máxima - 65534 Hz ​​​​(e saída HS de até 8 MHz com onda quadrada). E então pensei que um gerador é uma excelente tarefa onde o FPGA pode se mostrar no seu melhor. Por uma questão de esporte, resolvi repetir o projeto em FPGA, cumprindo os prazos em dois finais de semana, e conseguindo os parâmetros não estritamente definidos, mas os máximos possíveis. Você pode descobrir o que resultou disso sob o corte.

Dia zero

Antes de chegar o fim de semana, tive algum tempo para pensar na implementação. Para simplificar minha tarefa, decidi fazer o gerador não como um dispositivo separado com botões e tela LCD, mas como um dispositivo que se conecta a um PC via USB. Para isso tenho uma placa USB2RS232. A placa não necessita de drivers (CDC), portanto acho que funcionará no Linux (para alguns isso é importante). Além disso, não vou esconder que já trabalhei com recebimento de mensagens via RS232. Vou pegar módulos prontos para trabalhar com RS232 em opencores.com.

Para gerar um sinal de onda senoidal, você precisará de um DAC. Escolhi o tipo DAC, como no projeto original - R2R 8 bits. Isso permitirá operar em altas frequências, da ordem de megahertz. Estou convencido de que o FPGA deveria lidar com isso

Eu estava pensando em como escrever um programa para transmissão de dados através de uma porta COM. Por um lado, você pode escrever em Delphi7; você já tem experiência em escrever tal programa e, além disso, o tamanho do arquivo executável não será grande. Também tentei esboçar algo para funcionar com Serial na forma de um script java em uma página html, mas funcionou mais ou menos apenas através da API serial do Chrome, mas para isso é necessário instalar um plugin... em geral , também está fora de questão. Eu tentei o PyQt5 como uma inovação para mim, mas ao distribuir tal projeto, você precisa arrastar um monte de bibliotecas. Depois de tentar compilar um projeto PyQt em um arquivo exe, ele tinha mais de 10 MB. Ou seja, não será melhor que uma aplicação escrita em C++\Qt5. Também vale a pena considerar que não tenho experiência em desenvolvimento em python, mas tenho experiência em Qt5. Portanto, a escolha recaiu sobre o Qt5. Desde a quinta versão apareceu um módulo para trabalhar com serial e já trabalhei com ele. E um aplicativo baseado em Qt5 pode ser transferido para Linux e Mac (para alguns isso é importante), e a partir da versão 5.2, aplicativos baseados em QWidgets podem até ser transferidos para um smartphone!

O que mais é necessário? Naturalmente, a placa possui um FPGA. Eu tenho dois deles (Cyclone iv EP4CE10E22C8N para 10 mil células e Cyclone ii EP2C5 para 5 mil células). Escolherei o da esquerda apenas por causa do conector mais conveniente. Em termos de volume, o projeto não pretende ser grande, portanto caberá em qualquer um dos dois. Eles não diferem na velocidade de operação. Ambas as placas possuem osciladores de 50 MHz integrados, e dentro do FPGA existe um PLL, com o qual posso aumentar a frequência para os 200 MHz planejados.

O primeiro dia

Por já ter feito o módulo DDS no meu projeto de sintetizador, peguei imediatamente o ferro de soldar e comecei a soldar o DAC com resistores. Peguei uma placa protótipo. A instalação foi feita usando . A única mudança que afetou a tecnologia foi que abandonei o ácido F38N para estanhar as arquibancadas em favor do gel de fluxo indicador TT. A essência da tecnologia é simples: eu soldo racks em uma placa de circuito impresso e soldo resistores neles do lado da placa de circuito impresso. Eu faço as conexões que faltam torcendo. Além disso, os racks são convenientes porque posso inseri-los diretamente na placa FPGA.

Infelizmente, não havia resistores de 1 e 2 quilo-ohms disponíveis em casa. Não houve tempo para ir à loja. Tive que desistir de uma das minhas regras e remover resistores da antiga placa desnecessária. Resistores de 15K e 30K foram usados ​​lá. O resultado é este Frankenstein:


Após criar o projeto, você precisa definir o dispositivo alvo: Menu Atribuições -> Dispositivo


No projeto, codifiquei o módulo DDS principal incontrolável para uma frequência fixa.

Módulo Gerador de 1000 Hz

módulo signal_generator(clk50M, signal_out); fio de entrada clk50M; sinal de saída do fio_out; fio clk200M; acumulador osc osc_200M reg; atribuir signal_out = acumulador; //tenta gerar 1000 Hz //50.000.000 Hz - frequência de clock do gerador externo //2^32 = 4.294.967.296 - profundidade de bits DDS - 32 bits //divide 1000Hz / 50.000.000 Hz / 2 * 4294967296 => 42949, 67296 sempre @ (posege clk50M) iniciar acumulador<= accumulator + 32"d42949; end endmodule


Depois disso, cliquei em “Iniciar Compilação” para que o ambiente de desenvolvimento perguntasse quais linhas de entrada/saída temos no módulo principal do projeto e a quais PINs físicos elas estão conectadas. atribua as linhas que aparecem aos PINs reais do chip FPGA:

Item de menu Atribuições -> Pin Planner

Por enquanto, ignore as linhas HS_OUT, key0 e key1, elas aparecem no projeto mais tarde, mas não tive tempo de fazer uma captura de tela logo no início.

Em princípio, basta “cadastrar” apenas PIN_nn na coluna Localização, e os demais parâmetros (padrão I/O, Strench atual e taxa de variação) podem ser deixados como padrão, ou você pode selecionar os mesmos que são oferecidos por default (padrão) para que não haja nenhum aviso "ov.

Como posso saber qual PIN corresponde ao número do conector na placa?

Os números dos pinos do conector estão marcados na placa


E os pinos FPGA aos quais os contatos do conector estão conectados estão descritos na documentação que acompanha a placa FPGA.




Depois que os pinos são atribuídos, compilo o projeto novamente e o atualizo usando um programador USB. Se você não possui drivers instalados para o programador USB Byte blaster, informe ao Windows que eles estão localizados na pasta onde o Quartus está instalado. Então ela mesma encontrará.

O programador deve estar conectado ao conector JTAG. E o item de menu para programação é “Ferramentas -> Programador” (ou clique no ícone na barra de ferramentas). O botão “Iniciar”, o alegre “Sucesso” e o firmware já estão dentro do FPGA e já funcionam. Só não desligue o FPGA, senão ele vai esquecer tudo.

Ferramentas -> Programador


O DAC está conectado ao conector da placa FPGA. Eu conecto o osciloscópio S1-112A à saída DAC. O resultado deve ser uma “serra” porque a parte superior da palavra DDS do acumulador de fase é enviada para a saída de 8 bits. E sempre aumenta até transbordar.

Cerca de 1,5 horas e para uma frequência de 1000 Hz vejo o seguinte oscilograma:

Gostaria de ressaltar que a “serra” apresenta uma pequena fratura no meio. Isso se deve ao fato de os resistores possuírem uma faixa de valores.

Outro ponto importante que precisa ser esclarecido é a frequência máxima possível com que o gerador DDS irá operar. Com os parâmetros TimeQuest configurados corretamente, após a compilação no “Relatório de Compilação” você pode perceber que a velocidade do circuito está acima de 200 MHz com uma margem. Isso significa que multiplicarei a frequência do gerador de 50 MHz por 4 usando PLL. Aumentarei o valor do acumulador de fase DDS com frequência de 200 MHz. A faixa de frequência final que pode ser obtida em nossas condições é de 0 a 100 MHz. Precisão de configuração de frequência:

200.000.000 Hz (clk) / 2 ^ 32 (DDS) = 0,047 Hz
Ou seja, é melhor que ~0,05 Hz. Considero a precisão de uma fração de hertz suficiente para um gerador com essa faixa de frequências de operação (0...100 MHz). Se alguém precisar aumentar a precisão, então para fazer isso você pode aumentar a profundidade de bits DDS (lembre-se de verificar no TimeQuest Timing Analyzer se a velocidade de operação do circuito lógico estava dentro de CLK = 200 MHz, porque este é um somador), ou simplesmente reduza a frequência do clock, se uma faixa de frequência tão ampla não for necessária.

Analisador de tempo TimeQuest


Depois que vi “vi” na tela, assuntos familiares me obrigaram a ir para o campo (era meu dia de folga). Lá cortei, cozinhei, fiz churrasco e não tinha ideia da surpresa que me esperava à noite. Mais perto da noite, antes de ir para a cama, decidi observar o formato do sinal para outras frequências.

Para frequência 100 kHz

Para frequência 250 kHz

Para frequência 500 kHz

Para frequência de 1 MHz

Segundo dia

Por ser interessante como o DAC funcionaria em resistores de 100 e 200 Ohms, peguei imediatamente o ferro de soldar. Desta vez o DAC revelou-se mais preciso e demorou menos para instalá-lo.

Colocamos o DAC na placa FPGA e conectamos ao osciloscópio

Verificando 1 MHz - VO! É uma questão completamente diferente!

Vi 10 MHz

Vi 25 MHz


O formato da serra de 10 MHz ainda é semelhante ao correto. Mas em 25 MHz não é mais “bonito”. Porém, o C1-112a tem largura de banda de 10 MHz, então neste caso o motivo já pode estar no osciloscópio.

Em princípio, esta questão com o DAC pode ser considerada encerrada. Agora vamos pegar as formas de onda da saída de alta velocidade. Para fazer isso, enviaremos o bit mais significativo para um PIN separado do FPGA. Pegaremos os dados desta linha do bit mais significativo do acumulador DDS.

Atribuir hs_out = acumulador;

Onda quadrada 1 MHz

Onda quadrada 5 MHz

Onda quadrada 25 MHz

A onda quadrada de 50 MHz é quase invisível agora


Mas acho que a saída do FPGA deveria ser carregada com resistência. Talvez as frentes fossem mais íngremes.

O seno é feito conforme tabela. O tamanho da tabela é de 256 valores de 8 bits. Seria possível levar mais, mas eu já tinha um arquivo mif pronto. Usando o assistente, criamos um elemento ROM com dados da tabela senoidal do arquivo mif.

Criando uma ROM - Ferramentas -> Gerenciador de plugins do Mega Wizard


Selecione 1 porta ROM e dê um nome ao módulo

Nós concordamos

Nós concordamos aqui também

Usando o navegador, encontramos nosso arquivo mif com a tabela senoidal

Também não mudamos nada aqui.

Desmarque o módulo sine_rom_bb.v - não é necessário. Próximo acabamento. Quartus pedirá para adicionar um módulo ao projeto - nós concordamos. Depois disso, o módulo pode ser usado como qualquer outro módulo do Verilog.


Os 8 bits superiores da palavra do acumulador DDS serão usados ​​como endereço ROM e a saída de dados será o valor senoidal.

Código

//fio rom senoidal sine_out; seno_rom seno1(.clock(clk200M), .address(acumulador), .q(sine_out));


O oscilograma de uma onda senoidal em frequências diferentes parece... igual.

Se desejar, você pode considerar os problemas do DAC associados à propagação do resistor:

Bem, esse é o fim do fim de semana. Mas o software para controle a partir de um PC ainda não foi escrito. Sou obrigado a admitir que não cumpri os prazos previstos.

Dia três

O tempo é muito curto, por isso escrevemos o programa às pressas (nas melhores tradições). Em alguns locais, para reduzir o número de letras e facilitar a inserção de informações pelo teclado, é utilizado um filtro de eventos por nome do widget. Por favor, entenda e perdoe.

Interface

Links com análogos

Não é uma lista completa
Gerador DDS funcional. Criado com base em AVR. Frequências 0...65534 Hz.
Revisão do gerador DDS GK101. Criado usando Altera MAX240 FPGA. Frequências até 10 MHz.
Gerador multifuncional no PIC16F870. Faixa de frequência: 11 Hz - 60 kHz.
geradores
  • Qt5
  • Adicionar tags

    Qualquer oficina doméstica deve ter o conjunto necessário de ferramentas e instrumentos de medição. Para as pessoas envolvidas no rádio amador como hobby, os altos custos monetários de aquisição do equipamento necessário são muitas vezes inaceitáveis.

    Então no meu caso a lista desses equipamentos estava longe de estar completa e faltava gerador de sinal.

    Gerador de sinal Acabou sendo fácil fazer você mesmo com os elementos de rádio disponíveis e, no final, não foi caro. Assim, depois de vasculhar a Internet, encontrei um grande número de circuitos para vários geradores, inclusive modelos mais avançados com DAC, mas já caros de fabricar. Para começar, parei em um simples Gerador de sinal DDS no microcontrolador ATMEGA8 da Atmel. Este, não melhorei nem mudei nada - deixei tudo como está, apenas criei uma cópia e, além disso, não reivindico a autoria deste dispositivo.

    Então, gerador de sinal possui boas características e é adequado para resolver problemas simples.

    Exibindo informações em gerador de sinal produzido em um display LCD de 16x2 caracteres com um controlador HD44780. Vale ressaltar que para economizar portas do microcontrolador, o display LCD é controlado através de apenas três fios; isso foi conseguido usando um registrador de deslocamento - leia sobre como conectar um display através de três fios;

    É necessário salvar portas, 8 portas são usadas para um DAC resistivo, 7 portas para botões. No artigo original, o autor prometia usar modulação PWM, mas aparentemente não a completou, pois começou a desenvolver uma versão mais avançada no ATMEGA16.

    Diagrama esquemático de um gerador de sinal DDS e placa de circuito impresso.

    O circuito e as placas são mostrados no original e também contêm botões para controle PWM não utilizados pelo autor.

    Para o DAC, comprei especificamente resistores de precisão com erro de ±0,05%, mas descobri que resistores simples com erro de ±5% são suficientes. O formato do sinal era bastante aceitável para todos os tipos de sinais.

    Quando gerador montado e o programa carregado no microcontrolador, nenhuma configuração é necessária, a menos que você ajuste o contraste do display.

    Trabalhar com o dispositivo é simples - selecione o formato do sinal, defina a frequência necessária e você pode alterar o passo de configuração de frequência com limites de 1 - 10 - 100 - 1000 Hz por passo. Em seguida, clique em Iniciar e o gerador começa a funcionar. Ressalta-se que ao iniciar o gerador a frequência e o formato do sinal não podem ser alterados, isso se deve ao fato do programa entrar em loop infinito e para aumentar a frequência máxima de geração, o procedimento de polling do botão teve que ser removido. Para interromper a geração, clique em parar/reiniciar, isso reinicia o programa e retorna ao menu de configurações. Aqui está a nuance.

    Separadamente, gostaria de falar sobre a fabricação de uma carcaça para o gerador. Você pode comprar um case pronto em uma loja ou usar um adequado de algum outro aparelho, mas decidi fazer sozinho. Ficou parado um pedaço de fibra de vidro dupla-face, que doei para o corpo.

    Primeiramente é necessário fazer todas as medidas, as dimensões do display LCD e da placa geradora de sinal, fonte de alimentação, conectores e botões, depois colocar em uma folha de papel como ficará dentro do gabinete. Com base nas dimensões obtidas, você pode começar a fabricar.

    Este projeto é um gerador de funções universal e de alta qualidade, que, apesar de alguma complexidade do circuito, pelo menos em comparação com os mais simples, possui funcionalidade muito ampla, o que justifica o custo de sua montagem. É capaz de produzir 9 formas de onda diferentes e também funciona com sincronização de pulso.

    Diagrama esquemático do gerador no MK

    Configurações do dispositivo

    • Faixa de frequência: 10 Hz - 60 kHz
    • Ajuste digital de frequência em 3 etapas diferentes
    • Formas de onda: senoidal, triangular, quadrada, serra, pulso H, pulso L, explosão, varredura, ruído
    • Faixa de saída: 15V para senoidal e triângulo, 0-5V para outros modos
    • Existe uma saída para sincronização de pulso

    O dispositivo é alimentado por 12 volts CA, o que fornece uma tensão CC suficientemente alta (acima de 18 V) necessária para a operação normal do 78L15 e 79L15, que formam um circuito bipolar de 15 V. Isso é feito para que o microcircuito LF353 possa emitir o. gama completa de sinais para a carga 1 kOhm.

    Controlador de nível usado ALPS SRBM1L0800. O circuito deve usar resistores com tolerância de ±1% ou melhor. Limitadores de corrente LED - resistores da série 4306R. O brilho pode ser aumentado dependendo da preferência do artista. O gerador é montado em uma caixa plástica 178x154x36 mm com painéis frontal e traseiro de alumínio.

    Muitos componentes de contato são montados nos painéis frontal e traseiro (botões, knobs, conectores RCA, conjuntos de LED, conector de alimentação). As placas de circuito impresso são fixadas à caixa por meio de parafusos com espaçadores de plástico. Todos os outros elementos do gerador são montados em placas de circuito impresso - a fonte de alimentação é separada. O botão esquerdo no meio serve para alterar o modo, o botão direito serve para selecionar a frequência do modo.

    O gerador produz diversos sinais e opera em três modos, que são selecionados através da tecla “Select” e indicados pelos três LEDs superiores (no diagrama). O controle rotativo altera os parâmetros do sinal de acordo com a tabela a seguir:

    Imediatamente após a configuração no modo 1, ocorre a geração senoidal. No entanto, a frequência inicial é bastante baixa e é necessário pelo menos um clique do codificador para aumentá-la. A placa possui um contato para conexão do dispositivo para programação, que permite alterar rapidamente a funcionalidade do gerador de sinais, se necessário. Todos os arquivos do projeto - firmware PIC16F870, desenhos da placa, estão localizados

    Este gerador de função DDS (versão 2.0) de sinais é montado em um microcontrolador AVR, possui boa funcionalidade, possui controle de amplitude e também é montado em uma placa de circuito impresso unilateral.

    Este gerador é baseado no algoritmo gerador Jesper DDS, o programa foi modernizado para AVR-GCC C com inserções de código assembly. O gerador possui dois sinais de saída: o primeiro são sinais DDS, o segundo é uma saída “retangular” de alta velocidade (1..8 MHz), que pode ser usada para reanimar o MK com fuzzes incorretos e para outros fins.
    O sinal HS (High Speed) de alta velocidade é obtido diretamente do microcontrolador Atmega16 OC1A (PD5).
    Os sinais DDS são gerados a partir de outras saídas MC através de uma matriz resistiva R2R e através do chip LM358N, que permite o ajuste da amplitude e deslocamento do sinal. O deslocamento e a amplitude são ajustados usando dois potenciômetros. O deslocamento pode ser ajustado na faixa de +5V..-5V e a amplitude é de 0...10V. A frequência dos sinais DDS pode ser ajustada na faixa de 0...65534 Hz, o que é mais que suficiente para testar circuitos de áudio e outras tarefas de rádio amador.

    Principais características do gerador DDS V2.0:
    - um circuito simples com radioelementos comuns e baratos;
    - placa de circuito impresso unilateral;
    - fonte de alimentação embutida;
    - saída separada de alta velocidade (HS) até 8 MHz;
    - Sinais DDS com amplitude e offset variáveis;
    - Sinais DDS: senoidal, retângulo, serra e serra reversa, triângulo, sinal de ECG e sinal de ruído;
    - Tela LCD 2×16;
    - teclado intuitivo de 5 botões;
    - passos para ajuste de frequência: 1, 10, 100, 1000, 10000 Hz;
    – lembrando do último estado após ligar a energia.

    O diagrama de blocos abaixo mostra a estrutura lógica de um gerador de função:

    Como você pode ver, o dispositivo requer diversas tensões de alimentação: +5V, -12V, +12V. As tensões +12V e -12V são usadas para regular a amplitude e o deslocamento do sinal. A fonte de alimentação é projetada usando um transformador e vários chips estabilizadores de tensão:

    A fonte de alimentação é montada em uma placa separada:

    Se você não quiser montar a fonte sozinho, você pode usar uma fonte ATX normal de um computador, onde todas as tensões necessárias já estão presentes. Layout do conector ATX.

    Ecrã LCD

    Todas as ações são exibidas através de uma tela LCD. O gerador é controlado por cinco teclas

    As teclas para cima/para baixo são usadas para percorrer o menu, as teclas para a esquerda/direita são usadas para alterar o valor da frequência. Quando a tecla central é pressionada, o sinal selecionado começa a ser gerado. Pressionar a tecla novamente para o gerador.

    Um valor separado é fornecido para definir o passo de mudança de frequência. Isso é conveniente se você precisar alterar a frequência em uma ampla faixa.

    O gerador de ruído não possui nenhuma configuração. Ele usa a função rand() usual, que é alimentada continuamente na saída do gerador DDS.

    A saída de alta velocidade HS possui 4 modos de frequência: 1, 2, 4 e 8 MHz.

    Diagrama esquemático

    O circuito gerador de função é simples e contém elementos de fácil acesso:
    - Microcontrolador AVR Atmega16, com quartzo externo em 16 MHz;
    - tela LCD tipo HD44780 padrão 2×16;
    - Matriz R2R DAC feita de resistores comuns;
    - amplificador operacional LM358N (análogo doméstico do KR1040UD1);
    - dois potenciômetros;
    - cinco chaves;
    - vários conectores.

    Pagar:

    O gerador funcional é montado em uma caixa plástica:


    Programas

    Como disse acima, baseei meu programa no algoritmo gerador Jesper DDS. Adicionei algumas linhas de código assembly para implementar a parada de geração. Agora o algoritmo contém 10 ciclos de CPU, em vez de 9.

    void static embutido Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    asm volátil("eou r18, r18 ;r18<-0″ "\n\t"
    "eor r19, r19;r19<-0″ "\n\t"
    "1:" "\n\t"
    "adicionar r18, %0 ;1 ciclo" "\n\t"
    "adc r19, %1 ;1 ciclo" "\n\t"
    "adc %A3, %2 ;1 ciclo" "\n\t"
    "lpm ;3 ciclos" "\n\t"
    "saída %4, __tmp_reg__ ;1 ciclo" "\n\t"
    "sbis %5, 2 ;1 ciclo se não houver salto" "\n\t"
    "rjmp 1b ;2 ciclos. Total de 10 ciclos" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (sinal),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR ))
    :"r18″, "r19″
    );}

    A tabela de formas de sinal DDS está localizada na memória flash do MK, cujo endereço começa em 0xXX00. Estas seções são definidas no makefile, nos locais de memória apropriados:
    #Define seções onde armazenar tabelas de sinais
    LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-section-start=.MySection6=0x3F00