Índice:

Gerador de forma de onda Arduino: 5 etapas (com imagens)
Gerador de forma de onda Arduino: 5 etapas (com imagens)

Vídeo: Gerador de forma de onda Arduino: 5 etapas (com imagens)

Vídeo: Gerador de forma de onda Arduino: 5 etapas (com imagens)
Vídeo: GERADOR DE ONDA TRIANGULAR PARA PWM e SPWM 2024, Julho
Anonim
Gerador de forma de onda Arduino
Gerador de forma de onda Arduino

Atualização de fevereiro de 2021: confira a nova versão com 300x a taxa de amostragem, baseada no Raspberry Pi Pico

No laboratório, muitas vezes é necessário um sinal repetitivo de certa frequência, formato e amplitude. Pode ser para testar um amplificador, verificar um circuito, um componente ou um atuador. Potentes geradores de formas de onda estão disponíveis comercialmente, mas é relativamente fácil fazer um deles útil com um Arduino Uno ou Arduino Nano, consulte por exemplo:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Aqui está a descrição de outro com as seguintes características:

* Formas de onda precisas: saída de 8 bits usando R2R DAC, formato de 256 amostras

* Rápido: taxa de amostragem de 381 kHz

* Preciso: faixa de frequência de passos de 1 MHz. Tão preciso quanto o cristal Arduino.

* Fácil operação: forma de onda e frequência configuráveis com codificador rotativo único

* Grande variedade de amplitudes: milivolts a 20V

* 20 formas de onda predefinidas. Simples para adicionar mais.

* Fácil de fazer: Arduino Uno ou Nano mais componentes padrão

Etapa 1: Considerações técnicas

Fazendo um sinal analógico

Uma deficiência do Arduino Uno e do Nano é que ele não tem um conversor digital para analógico (DAC), portanto, não é possível fazer com que ele produza uma tensão analógica diretamente nos pinos. Uma solução é a escada R2R: 8 pinos digitais são conectados a uma rede de resistores para que 256 níveis de saída possam ser alcançados. Por meio do acesso direto à porta, o Arduino pode definir 8 pinos simultaneamente com um único comando. Para a rede de resistores, são necessários 9 resistores com valor R e 8 com valor 2R. Usei 10kOhm como valor para R, que mantém a corrente dos pinos em 0,5mA ou menos. Acho que R = 1kOhm também pode funcionar, já que o Arduino pode fornecer facilmente 5mA por pino, 40mA por porta. É importante que a relação entre os resistores R e 2R seja realmente 2. Isso é mais facilmente alcançado colocando 2 resistores de valor R em série, para um total de 25 resistores.

Acumulador de fase

A geração de uma forma de onda se resume a enviar repetidamente uma sequência de números de 8 bits aos pinos do Arduino. A forma de onda é armazenada em uma matriz de 256 bytes e essa matriz é amostrada e enviada aos pinos. A frequência do sinal de saída é determinada pela rapidez com que avançamos pela matriz. Uma maneira robusta, precisa e elegante de fazer isso é com um acumulador de fase: um número de 32 bits é incrementado em intervalos regulares e usamos os 8 bits mais significativos como o índice do array.

Amostragem rápida

As interrupções permitem amostrar em tempos bem definidos, mas a sobrecarga das interrupções limita a frequência de amostragem a ~ 100 kHz. Um loop infinito para atualizar a fase, amostrar a forma de onda e definir os pinos leva 42 ciclos de clock, alcançando assim uma taxa de amostragem de 16 MHz / 42 = 381 kHz. Girar ou empurrar o codificador rotativo causa uma mudança de pino e uma interrupção que sai do loop para alterar a configuração (forma de onda ou frequência). Nesse estágio, os 256 números na matriz são recalculados, de forma que nenhum cálculo real da forma de onda precise ser executado no loop principal. A frequência máxima absoluta que pode ser gerada é 190kHz (metade da taxa de amostragem), mas existem apenas duas amostras por período, portanto, não há muito controle da forma. A interface, portanto, não permite definir a frequência acima de 100kHz. A 50kHz, existem 7 a 8 amostras por período e a 1,5 kHz e abaixo, todos os 256 números armazenados na matriz são amostrados a cada período. Para formas de onda em que o sinal muda suavemente, por exemplo a onda senoidal, pular amostras não é problema. Mas para formas de onda com picos estreitos, por exemplo, uma onda quadrada com um pequeno ciclo de trabalho, existe o perigo de que para frequências acima de 1,5 kHz, faltando uma única amostra, pode resultar em uma forma de onda não se comportando como esperado

Precisão da frequência

O número pelo qual a fase é incrementada em cada amostra é proporcional à frequência. A frequência pode, portanto, ser definida para uma precisão de 381kHz / 2 ^ 32 = 0,089mHz. Na prática, essa precisão quase nunca é necessária, por isso a interface limita o ajuste da frequência em passos de 1mHz. A precisão absoluta da frequência é determinada pela precisão da frequência do relógio do Arduino. Isso depende do tipo de Arduino, mas a maioria especifica uma frequência de 16.000 MHz, portanto, uma precisão de ~ 10 ^ -4. O código permite modificar a razão da frequência e o incremento de fase para corrigir pequenos desvios da suposição de 16 MHz.

Buffer e amplificação

A rede de resistores tem uma impedância de saída alta, então sua tensão de saída cai rapidamente se uma carga for conectada. Isso pode ser resolvido armazenando em buffer ou amplificando a saída. Aqui, o buffer e a amplificação são feitos com um opamp. Usei o LM358 porque tinha alguns. É um opamp lento (taxa de variação de 0,5 V por microssegundo), portanto, em alta frequência e alta amplitude, o sinal fica distorcido. Uma boa coisa é que ele pode lidar com tensões muito próximas de 0V. A tensão de saída é, entretanto, limitada a ~ 2 V abaixo do trilho, portanto, usar a alimentação de + 5 V limita a tensão de saída a 3 V. Os módulos Step-up são compactos e baratos. Alimentando + 20V para o opamp, ele pode gerar sinais com tensão de até 18V. (NB, o esquema diz LTC3105 porque foi o único step-up que encontrei no Fritzing. Na realidade usei um módulo MT3608, veja as fotos nos próximos passos). Eu escolho aplicar uma atenuação variável à saída do R2R DAC e, em seguida, usar um dos opamps para armazenar o sinal sem amplificação e o outro para amplificar em 5,7, de modo que o sinal possa atingir uma saída máxima de cerca de 20V. A corrente de saída é bastante limitada, ~ 10mA, portanto, um amplificador mais forte pode ser necessário se o sinal for para acionar um grande alto-falante ou eletroímã.

Etapa 2: componentes necessários

Para o gerador de forma de onda principal

Arduino Uno ou Nano

Visor LCD 16x2 + aparador 20kOhm e resistor série 100Ohm para luz de fundo

Codificador rotativo de 5 pinos (com botão integrado)

25 resistores de 10kOhm

Para o buffer / amplificador

LM358 ou outro opamp duplo

módulo avançado baseado no MT3608

Resistor variável de 50kOhm

Resistor de 10kOhm

Resistor 47kOhm

Capacitor 1muF

Etapa 3: construção

Construção
Construção
Construção
Construção

Soldei tudo em um protótipo de placa de 7x9cm, como mostra a foto. Já que ficou um pouco bagunçado com todos os fios, tentei colorir os fios que carregam a tensão positiva de vermelho e os que carregam o aterramento de preto.

O codificador que usei tem 5 pinos, 3 de um lado e 2 do outro. O lado com 3 pinos é o codificador real, o lado com 2 pinos é o botão integrado. No lado de 3 pinos, o pino central deve ser conectado ao aterramento, os outros dois pinos ao D10 e D11. No lado de 2 pinos, um pino deve ser conectado ao aterramento e o outro ao D12.

É a coisa mais feia que já fiz, mas funciona. Seria bom colocar um gabinete, mas por enquanto o trabalho extra e o custo não justificam isso. O Nano e a tela são presos com cabeçotes de pinos. Eu não faria isso de novo se construísse um novo. Não coloquei conectores na placa para captar os sinais. Em vez disso, eu os pego com fios de crocodilo de pedaços salientes de fio de cobre, rotulados como segue:

R - sinal bruto do R2R DAC

B - sinal com buffer

A - sinal amplificado

T - sinal do temporizador do pino 9

G - terreno

+ - tensão 'alta' positiva do módulo elevador

Etapa 4: O Código

O código, um esboço do Arduino, está anexado e deve ser carregado no Arduino.

20 formas de onda foram predefinidas. Deve ser simples adicionar qualquer outra onda. Observe que as ondas aleatórias preenchem a matriz de 256 valores com valores aleatórios, mas o mesmo padrão se repete a cada período. Os verdadeiros sinais aleatórios soam como ruído, mas essa forma de onda soa muito mais como um apito.

O código define um sinal de 1kHz no pino D9 com TIMER1. Isso é útil para verificar o tempo do sinal analógico. Foi assim que descobri que o número de ciclos de clock é 42: se eu assumir 41 ou 43 e gerar um sinal de 1kHz, ele claramente tem uma frequência diferente do sinal no pino D9. Com o valor 42, eles combinam perfeitamente.

Normalmente, o Arduino interrompe a cada milissegundo para controlar o tempo com a função millis (). Isso perturbaria a geração precisa do sinal, portanto, a interrupção específica é desabilitada.

O compilador diz: "Sketch usa 7254 bytes (23%) de espaço de armazenamento do programa. O máximo é 30720 bytes. Variáveis globais usam 483 bytes (23%) de memória dinâmica, deixando 1565 bytes para variáveis locais. O máximo é 2048 bytes." Portanto, há amplo espaço para códigos mais sofisticados. Esteja ciente de que você pode ter que escolher "ATmega328P (antigo bootloader)" para fazer o upload para o Nano com sucesso.

Etapa 5: Uso

O gerador de sinal pode ser alimentado simplesmente através do cabo mini-USB do Arduino Nano. É melhor feito com um banco de potência, de modo que não haja nenhum loop de aterramento acidental com o aparelho ao qual ele pode ser conectado.

Quando ligado, ele irá gerar uma onda senoidal de 100Hz. Girando o botão, um dos outros 20 tipos de onda pode ser escolhido. Girando enquanto pressionado, o cursor pode ser definido para qualquer um dos dígitos da frequência, que pode então ser alterado para o valor desejado.

A amplitude pode ser regulada com o potenciômetro e tanto o sinal com buffer quanto o sinal amplificado podem ser usados.

É muito útil usar um osciloscópio para verificar a amplitude do sinal, em particular quando o sinal fornece corrente para outro dispositivo. Se muita corrente for consumida, o sinal irá cortar e o sinal será fortemente distorcido

Para frequências muito baixas, a saída pode ser visualizada com um LED em série com um resistor de 10kOhm. As frequências de áudio podem ser ouvidas com um alto-falante. Certifique-se de definir o sinal muito pequeno ~ 0,5 V, caso contrário, a corrente ficará muito alta e o sinal começará a ser cortado.

Recomendado: