Ir ao conteúdo
  • Cadastre-se
Felipe Arcaro

Input analogico em um arduino

Recommended Posts

Fala pessoal, eu não comecei a trabalhar em um código, principalmente porque eu realmente não sei como fazê-iniciá-lo. 
Eu gostaria de algumas direções, pra conseguir achar as respostas que preciso

Eu estou trabalhando em um projeto, em que eu gero ondas senoidais para serem usadas em uma comunicação entre piezos. Eu usei uma placa DDS AD9850 e com alguns capacitores, amplificadores operacionais e resistores eu consegui um bom output (ondas senoidais com 4V, 30-50KHz). 
Como eu aprendi, minha saída é analógica, e agora eu tenho que fazê-la digital para que ela possa ser lida pelo arduino. 
Meu principal objetivo é ser capaz de ler a frequência da onda. 
Vocês podem me dar alguma direção?


Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Eu usei uma placa DDS AD9850 e com alguns capacitores, amplificadores operacionais e resistores eu consegui um bom output (ondas senoidais com 4V, 30-50KHz).

Puxa, usar um AD9850 para gerar uma senoide de 50KHz máximos é quase como matar uma formiga com uma bazuca... o Próprio Arduino poderia fazer isso.

 

 

 

 

Como eu aprendi, minha saída é analógica, e agora eu tenho que fazê-la digital para que ela possa ser lida pelo arduino. 

Meu principal objetivo é ser capaz de ler a frequência da onda. 

Aqui vejo duas formas para voce resolver seu problema, de forma digital, basta passar essa senoide por um comparador de tensão (no caso um comparador de zero já resolve) e você obterá um sinal quadrado.

Para ler a frequência dessa forma, você simplesmente mede o intervalo entre duas bordas de subida, a inversa desse periodo é a frequencia da tua senoide. Em termos de código vou deixar como exercicio e pros fans de arduino, como se usa timer nesse caso. 

De forma analógica, voce pode utilizar o conversor A/D do Arduino, usando a função AnalogRead(Canal), porém não faço ideia da taxa de amostragem usada no conversor, que teoricamente deveria ser de pelo menos 100 mil amostras por segundo, enfim se optar por essa abordagem basta implementar o comparador de zero por software e medir quanto tempo o sinal leva para passar por dois zeros consecutivos, novamente a inversa desse periodo é o valor da frequencia da senoide.

Só Lembrando que:

Frequencia(Inversa do Periodo) =               1                                       --------------------                                            Periodo

Abs.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Felipe_Eletronic, eu fiz mais ou menos o que você falou e com a ajuda de um outro pessoal eu consegui ler a tensão de volta no sinal analógico, pra constatar que meu código estava funcionando. Muito obrigado.

Agora, como vou mandar essa função de onda para um piezo na ponta de uma placa, e vou receber no outro piezo na outra ponta da placa, vou recebê-lo bem mais fraco, com noise e offset, correto?

Para tirar o offset, eu imagino que devo colocar um capacitor em série, mas como faço pra tirar o noise?

Meu objetivo é comparar a onda enviada com a onda recebida num osciloscópio, então tenho que criar um circuito (filtro, imagino) para que a onda continue sendo um seno no segundo piezo.

 

Obrigado desde já, 

Felipe.


Essas fotos são da entrada, da resposta e do sistema.

 

photo1.jpg

photo2.jpg

photo3.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Felipe Arcaro,

Não sei se é possível, mas esse seu pulso poderia ter uma duração maior ??? Vejo um pouco de oscilação na amplitude, e ela deveria estar mais estabilizada.

Primeiro lugar, voce tem de fazer um filtro para tornar o receptor mais imune às outras frequências. Mas se tentar fazer um filtro de alto Q, vai ter ainda mais oscilação de amplitude na saída... acho melhor partir para um passa-altas e um passa-baixas.

@, que que voce acha ?

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples!

Pode usar a entrada do amplificador operacional do arduino, usando interrupção dele para contagem,

2014-06-06_071920.jpg

Esquema interno do operacional do ATmega88, 168, 328.

 

ou usar um amplificador operacional externo com sua saída entrando num contador do arduino: ex: contador 0.

Este operacional teria a entrada inversora (-) uma tensão de 2V e a entrada não inversora (+) seria a entrada da onda senoidal.

O resultado é que na saída teria uma onda quadrada na frequência do sinal da onda senoidal de entrada.

O contador 1 seria programado para a cada 1 seg. gerar uma interrupção que faz a leitura  do contador 0 e o zera.

Pronto: está aí a frequência.

Não sei se me expressei direito, mas na dúvida, estou aqui.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu apenas mudei o capacitor de saida, coloquei um maior, e fui direto disso pra entrada analogica do arduino (A0). 

O resultado que obtive foi satisfatorio, uma onda senoidal variando de acordo com a onda de entrada, mas nao identica. 

Eu nao sei exatamente porque nao precisei de filtros pra isso, mas de qualquer forma funcionou. 

De qualquer forma, caso alguem esteja na mesma situacao, estou usando a placa DDS AD9850 para gerar as funcoes de seno.

O codigo que usei pra fazer com que ele funcionasse foi:

 

 

--------------

/*
 * A simple single freq AD9850 Arduino test script
 * Original AD9851 DDS sketch by Andrew Smallbone at www.rocketnumbernine.com
 * Modified for testing the inexpensive AD9850 ebay DDS modules
 * Pictures and pinouts at nr8o.dhlpilotcentral.com
 * Use freely
 */
 
 #define W_CLK 8       // Pin 8 - connect to AD9850 module word load clock pin (CLK)
 #define FQ_UD 9       // Pin 9 - connect to freq update pin (FQ)
 #define DATA 10       // Pin 10 - connect to serial data load pin (DATA)
 #define RESET 11      // Pin 11 - connect to reset pin (RST).
 
 #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
 
 // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
  for (int i=0; i<8; i++, data>>=1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK);   //after each bit sent, CLK is pulsed high
  }
}
 
 // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
  int32_t freq = frequency * 4294967295/125000000;  // note 125 MHz clock on 9850
  for (int b=0; b<4; b++, freq>>=8) {
    tfr_byte(freq & 0xFF);
  }
  tfr_byte(0x000);   // Final control byte, all 0 for 9850 chip
  pulseHigh(FQ_UD);  // Done!  Should see output
}
 
void setup() {
 // configure arduino data pins for output
  pinMode(FQ_UD, OUTPUT);
  pinMode(W_CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(RESET, OUTPUT);
 
  pulseHigh(RESET);
  pulseHigh(W_CLK);
  pulseHigh(FQ_UD);  // this pulse enables serial mode - Datasheet page 12 figure 10
  Serial.begin(9600);
}
 
void loop() {
  for (unsigned long fq = 30000; fq<= 50000; fq+=50) {
  sendFrequency(fq);  // freq
  //while(1);
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5/1023.0);
  Serial.print(voltage);
  Serial.print(",");
  Serial.print(fq); 
  Serial.println();
 delay(1);
}
//while (1) {}
}

--------------

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@aphawk e @Felipe Arcaro,
 

 

 

Primeiro lugar, voce tem de fazer um filtro para tornar o receptor mais imune às outras frequências. Mas se tentar fazer um filtro de alto Q, vai ter ainda mais oscilação de amplitude na saída... acho melhor partir para um passa-altas e um passa-baixas.

@Felipe_Eletronic, que que voce acha ?

Paulo

 

Como ele vai mapear essa função seno, ou seja nao só a frequência, acho sua solução plausível, pode ser um simples passa baixas, e do lado do software pode se fazer um filtro digital de media móvel, só lembrarmos, que esse tipo de filtro tende a manter seu sinal dentro da janela de amostragem que está a usar. 

 

@,

 

 

ou usar um amplificador operacional externo com sua saída entrando num contador do arduino: ex: contador 0.

Este operacional teria a entrada inversora (-) uma tensão de 2V e a entrada não inversora (+) seria a entrada da onda senoidal.

O resultado é que na saída teria uma onda quadrada na frequência do sinal da onda senoidal de entrada.

contador 1 seria programado para a cada 1 seg. gerar uma interrupção que faz a leitura  do contador 0 e o zera.

Pronto: está aí a frequência.

Não sei se me expressei direito, mas na dúvida, estou aqui.

A sua ideia me parece ainda melhor do que sair colocando apenas o capacitor de bloqueio DC, pelo que entendi a ideia é adicionar um offste ao sinal de entrada de forma a "rebater" a parte negativa da senoide pra cima do 0V certo?
A única coisa que se deve estar atento é se o produto ganho x faixa passante do operacional é adequado a banda do sinal que esta a receber, pelo que ele disse a coisa esta centrado em 50KHz, eu não usaria qualquer LM358 pra fazer isso ai, talvez um OPA350 ou 2350 em que esse parametro é de 38MHz (e fora que é baratin e da pra pedir amostra na TI). 

Observando o sistema, Felipe, isso é um modelo de sistema de controle? se for isso mesmo, as soluções apresentadas, podem ser fundamentais.

Está a usar que tipo de compensador? PID, lead/lag? filtro_PI digital?

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×