Índice:

Tensões analógicas super rápidas do Arduino: 10 etapas (com imagens)
Tensões analógicas super rápidas do Arduino: 10 etapas (com imagens)

Vídeo: Tensões analógicas super rápidas do Arduino: 10 etapas (com imagens)

Vídeo: Tensões analógicas super rápidas do Arduino: 10 etapas (com imagens)
Vídeo: O que é Arduino, afinal de contas? #ManualMaker Aula 4, Vídeo 1 2024, Julho
Anonim
Image
Image

Este Instructable mostra como gerar mudanças de tensão analógicas super rápidas a partir de um Arduino e um par simples de resistor e capacitor. Uma aplicação em que isso é útil é na geração de gráficos em um osciloscópio. Existem vários outros projetos que fizeram isso. Johngineer mostra uma árvore de Natal simples usando modulação por largura de pulso (PWM). Outros aprimoraram esse projeto usando uma escada de resistor ou um chip conversor digital para analógico dedicado.

Usar PWM causa muita cintilação, enquanto usar uma escada de resistor ou um conversor digital para analógico requer mais pinos de saída e componentes que podem não estar prontamente disponíveis. O circuito que uso é o mesmo par de resistor simples morto e capacitor usado na demonstração da árvore de Natal, mas opera com significativamente menos cintilação.

Primeiro, vou guiá-lo pelo processo de construção do circuito. Então vou te ensinar como adicionar sua própria imagem. Finalmente, vou apresentar a teoria sobre o que o torna mais rápido.

Se você gostou deste Instructable, por favor, considere votar nele!:)

Etapa 1: Construindo o Circuito

Construindo o Circuito
Construindo o Circuito

Para construir o circuito, você precisará do seguinte:

a) Um Arduino baseado no Atmel 16MHz ATmega328P, como um Arduino Uno ou Arduino Nano.

b) Dois resistores de valor R que é de pelo menos 150Ω.

c) Dois capacitores de valor C tais que C = 0,0015 / R, exemplos:

  • R = 150Ω e C = 10µ
  • R = 1,5kΩ e C = 1µ
  • R = 15kΩ e C = 100nF
  • R = 150kΩ e C = 10nF

As razões para escolher esses valores são duas. Primeiramente, queremos manter a corrente nos pinos do Arduino abaixo da corrente nominal máxima de 40mA. Usar um valor de 150Ω limita a corrente a 30mA quando usado com a tensão de alimentação do Arduino de 5V. Valores maiores de R diminuirão a corrente e são, portanto, aceitáveis.

A segunda restrição é que queremos manter o tempo constante, que é o produto de R e C, igual a cerca de 1,5 ms. O software foi ajustado especificamente para esta constante de tempo. Embora seja possível ajustar os valores de R e C no software, há uma faixa estreita em torno da qual ele funcionará, portanto, escolha os componentes o mais próximo possível da proporção sugerida.

Uma explicação mais completa sobre por que a constante RC é importante será dada na seção de teoria, após eu ter mostrado a você como montar o circuito de demonstração.

Etapa 2: Configurando o Osciloscópio

Configurando o Osciloscópio
Configurando o Osciloscópio

A demonstração requer um osciloscópio definido para o modo X / Y. Os cabos de teste precisam ser conectados conforme mostrado nos esquemas. Seu osciloscópio será diferente do meu, mas seguirei pelas etapas necessárias para configurar o modo X / Y em minha unidade:

a) Defina a varredura horizontal a ser controlada pelo Canal B (o eixo X).

b) Configure o osciloscópio para o modo de canal duplo.

c) Defina os volts / div em ambos os canais para que possam exibir tensões de 0 V a 5 V. Defino o meu para 0,5 V / div.

d) Defina o modo de acoplamento para DC em ambos os canais.

e) Ajuste a posição de X e Y para que o ponto fique no canto esquerdo inferior da tela quando o Arduino for desligado.

Etapa 3: Baixe e execute o software

Image
Image

Baixe o software do repositório Fast Vector Display For Arduino. O software é licenciado pela GNU Affero Public License v3 e pode ser usado e modificado livremente de acordo com os termos dessa licença.

Abra o arquivo "fast-vector-display-arduino.ino" no IDE do Arduino e faça o upload para o seu Arduino. Momentaneamente, você verá uma animação de "Feliz Ano Novo" na tela do seu osciloscópio.

Desenvolvi este projeto como um hackaton pessoal nas semanas que antecederam o Natal, portanto, há uma mensagem com o tema Natal e Ano Novo que você pode ver modificando a variável PATTERN no código.

Etapa 4: crie seu próprio desenho personalizado

Entenda por que o PWM é tão lento
Entenda por que o PWM é tão lento

Se você deseja criar seu próprio desenho, pode colar as coordenadas do ponto no esboço do Arduino na linha que define USER_PATTERN.

Descobri que o Inkscape é uma ferramenta muito boa para fazer um desenho personalizado:

  1. Crie texto usando uma fonte grande e em negrito, como Impact.
  2. Selecione o objeto de texto e selecione "Objeto para caminho" no menu "Caminho".
  3. Selecione letras individuais e sobreponha-as para fazer uma forma conectada
  4. Selecione "União" no menu "Caminho" para combiná-los em uma única curva.
  5. Se houver furos em alguma letra, corte um pequeno entalhe desenhando um retângulo com a ferramenta retângulo e subtraia do contorno usando a ferramenta "Diferença".
  6. Clique duas vezes no caminho para mostrar os nós.
  7. Retângulo selecione todos os nós e clique na ferramenta "Criar canto dos nós selecionados".
  8. Salve o arquivo SVG.

O importante é que seu desenho tenha um único caminho fechado e sem buracos. Certifique-se de que seu projeto tenha menos de 130 pontos.

Etapa 5: colar as coordenadas do arquivo SVG no IDE do Arduino

  1. Abra o arquivo SVG e copie as coordenadas. Eles serão incorporados ao elemento "path". O primeiro par de coordenadas pode ser ignorado; substitua-os por 0, 0.
  2. Cole as coordenadas no esboço do Arduino dentro dos colchetes logo após "#define USER_PATTERN".
  3. Substitua todos os espaços por vírgulas, caso contrário, você obterá um erro de compilação. A ferramenta "Substituir e Localizar" pode ser útil.
  4. Compile e execute!
  5. Se você tiver problemas, verifique se há erros no console serial. Em particular, você verá mensagens se seu padrão tiver muitos pontos para o buffer interno. Nesses casos, a imagem exibirá tremulação excessiva.

Etapa 6: entender por que o PWM é tão lento

Para começar, vamos revisar o comportamento de um capacitor durante o carregamento.

Um capacitor conectado a uma fonte de tensão Vcc aumentará sua tensão de acordo com uma curva exponencial. Esta curva é assintótica, o que significa que vai desacelerar à medida que se aproxima da voltagem alvo. Para todos os efeitos práticos, a tensão está "perto o suficiente" após 5 RC segundos. O RC é denominado "constante de tempo". Como vimos anteriormente, é o produto dos valores do resistor e do capacitor em seu circuito. O problema é que 5 RC é um tempo bastante longo para atualizar cada ponto em um display gráfico. Isso leva a muita cintilação!

Quando usamos modulação por largura de pulso (PWM) para carregar um capacitor, não estamos em melhor situação. Com o PWM, a tensão muda rapidamente entre 0V e 5V. Na prática, isso significa que alternamos rapidamente entre empurrar a carga para o capacitor e puxar um pouco dela novamente - esse empurrar e puxar é como tentar correr uma maratona dando um grande passo para frente e, em seguida, um pequeno passo para trás uma e outra vez.

Quando você faz a média de tudo, o comportamento de carregar um capacitor usando PWM é exatamente o mesmo como se você tivesse usado uma voltagem constante de Vpwm para carregar o capacitor. Ainda leva cerca de 5 segundos RC para chegarmos "perto o suficiente" da voltagem desejada.

Etapa 7: vá de a para B, um pouco mais rápido

Vá de a para B, um pouco mais rápido
Vá de a para B, um pouco mais rápido

Suponha que temos um capacitor que já está carregado até Va. Suponha que usamos analogWrite () para escrever o novo valor de b. Qual é o tempo mínimo que você tem que esperar para que a tensão Vb seja atingida?

Se você adivinhou 5 segundos RC, isso é ótimo! Esperando 5 segundos RC, o capacitor será carregado quase a Vb. Mas se quisermos, podemos esperar um pouco menos.

Observe a curva de carga. Veja, o capacitor já estava em Va quando começamos. Isso significa que não temos que esperar o tempo t_a. Só precisaríamos se estivéssemos carregando o capacitor do zero.

Então, por não esperar esse tempo, vemos uma melhora. O tempo t_ab é na verdade um pouco menor que 5 RC.

Mas espere, podemos fazer muito melhor! Olhe todo aquele espaço acima de v_b. Essa é a diferença entre Vcc, a tensão máxima disponível para nós, e a Vb que pretendemos atingir. Você pode ver como essa voltagem extra pode nos ajudar a chegar onde queremos muito mais rápido?

Etapa 8: Vá de a para B, com um Turbo Charger

Vá de a para B, com um Turbo Charger!
Vá de a para B, com um Turbo Charger!

Isso mesmo. Em vez de usar o PWM na tensão alvo V_b, o mantemos em um Vcc constante por um período de tempo muito, muito mais curto. Eu chamo isso de método Turbo Charger e ele nos leva aonde queremos ir muito, muito rápido! Após o atraso de tempo (que devemos calcular), pisamos no freio, mudando para PWM em V_b. Isso evita que a tensão ultrapasse o alvo.

Com este método, é possível alterar a tensão no capacitor de V_a para V_b em uma fração de tempo do que usando apenas PWM. É assim que você chega a lugares, baby!

Etapa 9: entenda o código

Entenda o Código
Entenda o Código

Uma imagem vale mais que mil palavras, então o diagrama mostra os dados e as operações que são realizadas no código. Da esquerda para a direita:

  • Os dados gráficos são armazenados no PROGMEM (ou seja, memória flash) como uma lista de pontos.
  • Qualquer combinação de translação, escala e operações de rotação são combinadas em uma matriz de transformação afim. Isso é feito uma vez no início de cada quadro de animação.
  • Os pontos são lidos um a um nos dados gráficos e cada um é multiplicado pela matriz de transformação armazenada.
  • Os pontos transformados são alimentados por um algoritmo de tesoura que recorta quaisquer pontos fora da área visível.
  • Usando uma tabela de pesquisa de atraso RC, os pontos são convertidos em tensões de acionamento e atrasos de tempo. A tabela de pesquisa de atraso RC é armazenada na EEPROM e pode ser reutilizada para várias execuções do código. Na inicialização, a precisão da tabela de pesquisa RC é verificada e quaisquer valores incorretos são atualizados. O uso de EEPROM economiza valiosa memória RAM.
  • As tensões de condução e atrasos são gravados no quadro inativo no buffer de quadro. O buffer de quadros contém espaço para um quadro ativo e um quadro inativo. Depois que um quadro completo é escrito, o quadro inativo torna-se ativo.
  • Uma rotina de serviço de interrupção continuamente redesenha a imagem lendo os valores de tensão e atrasos do buffer de quadro ativo. Com base nesses valores, ele ajusta os ciclos de trabalho dos pinos de saída. O temporizador 1 é usado para medir o atraso de tempo até alguns nanossegundos de precisão, enquanto o temporizador 2 é usado para controlar o ciclo de trabalho dos pinos.
  • O pino com a maior variação de tensão é sempre "turboalimentado" com um ciclo de trabalho de zero ou 100%, proporcionando o tempo de carga ou descarga mais rápido. O pino com menor alteração na tensão é acionado com um ciclo de trabalho escolhido para corresponder ao tempo de transição do primeiro pino - desta vez, a correspondência é importante para garantir que as linhas sejam traçadas diretamente no osciloscópio.

Etapa 10: Com grande velocidade, vem uma grande responsabilidade

Já que esse método é muito mais rápido que o PWM, por que analogWrite () não o usa? Bem, porque usar apenas o PWM é bom o suficiente para a maioria dos programas e é muito mais tolerante. O método "Turbo Charger", no entanto, requer uma codificação cuidadosa e só é adequado para casos específicos:

  1. É extremamente sensível ao tempo. Assim que atingirmos o nível de tensão alvo, o pino condutor deve ser imediatamente colocado no modo PWM normal para evitar ultrapassagem da tensão alvo.
  2. Requer conhecimento da constante RC, portanto, esses valores devem ser inseridos com antecedência. Com valores incorretos, a temporização estará errada e as tensões estarão incorretas. Com o PWM regular, há uma garantia de que você estabelecerá a tensão correta após algum tempo, mesmo se a constante RC não for conhecida.
  3. Calcular o intervalo de tempo preciso para carregar o capacitor requer equações logarítmicas que são muito lentas para cálculos em tempo real no Arduino. Eles devem ser pré-calculados antes de cada quadro de animação e armazenados em cache na memória em algum lugar.
  4. Os programas que lidam com este método devem lutar com o fato de que os atrasos são muito não lineares (eles são, de fato, exponenciais). As tensões-alvo próximas a Vcc ou GND levarão muitas ordens de magnitude mais para atingir do que as tensões próximas ao ponto médio.

Para superar essas limitações, meu código de gráficos vetoriais faz o seguinte:

  1. Ele usa o Timer 1 a 16kHz e uma rotina de serviço de interrupção para manipulação e temporização de saída precisa.
  2. Requer um valor específico de constante de tempo RC a ser usado, limitando as escolhas dos valores do capacitor e do resistor.
  3. Ele armazena os atrasos de tempo para todos os pontos em um quadro de animação em um buffer de memória. Isso significa que a rotina que calcula os atrasos de tempo é executada a uma taxa muito mais lenta do que a rotina de serviço de interrupção que atualiza os pinos de saída. Qualquer quadro pode ser pintado várias dezenas de vezes antes que um novo conjunto de atrasos para o próximo quadro esteja pronto para ser usado.
  4. O uso de um buffer de memória restringe o número de pontos que podem ser desenhados por quadro. Eu emprego uma codificação com espaço eficiente para obter o máximo da RAM disponível, mas ainda é limitada a cerca de 150 pontos. Além de cerca de cem pontos ou mais, a tela começaria a piscar de qualquer maneira, então é um ponto discutível!

Recomendado: