Fala galera, beleza? 

Sou novo por aqui e acabei de conseguir uma pesquisa na FIU (Florida International University) pelo programa Ciências Sem Fronteiras (só durante o summer).

Bom, nessa pesquisa eu fui informado que vou brincar com Arduino e suas propriedades de um modo geral. Dei uma boa olhada no site, fiquei brincando com uns exemplos de código e tudo está tomando sentido, mas ainda estou meio confuso. 

Primeiramente tenho como objetivo gerar frequências a partir do Arduino, e o problema é que só estou conseguindo gerar essas frequências a partir de ondas quadradas (segue o código):

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

#define Q 5000
#define F1 20000
#define F2 25000
#define F3 30000
#define F4 35000
#define F5 40000
#define F6 45000
#define F7 50000

void setup() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(9,LOW);

}

// the loop routine runs over and over again forever:
void loop() {
//tone(pin, note, duration)
tone(8,F1,Q);
delay(1+Q); //delay duration should always be 1 ms more than the note in order to separate them.
tone(8,F2,Q);
delay(1+Q);
tone(8,F3,Q);
delay(1+Q);
tone(8,F4,Q);
delay(1+Q);
tone(8,F5,Q);
delay(1+Q);
tone(8,F6,Q);
delay(1+Q);
tone(8,F7,Q);
delay(1+Q);

}

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

Meu maior objetivo era criar frequências puras variando entre 20khz até 50khz, e usar um for para isso, mas de uma forma que eu possa escolher o tempo entre a varição (por exemplo, deixar cada frequência por 5s e trocar). Muito obrigado desde já pela ajuda.

Exibições: 11528

Responder esta

Respostas a este tópico

Tenho disponível pra trabalhar aqui um Arduino UNO, um Arduino MEGA ADK e Shields de Wifi e Ethernet pois pretendo mandar as ondas pra um receptor.

Eh o tone() gera ondas quadradas:

http://arduino.cc/en/reference/tone

Para gerar audio vc precisa de algo como um "arduino sound player" <- procure via google.

Em geral são soluções com PWM, mas existem hardwares especificos, depende da qualidade que vc precisa.

Legal o ciencias sem fronteira. Quase me candidatei, mas esbarrei no fato de ter nota minima em ingles (TOEFL), nem tentei e agora pq a familia cresceu... (A Helô ta agora com 1,3 anos) nem vou pensar mais. 

A qualidade a princípio não é o que mais interessa, conseguindo criar essas ondas de maneira eficiente já é interessante. 

O problema é que o tone() só gera ondas quadradas, e eu preciso de ondas como de seno com frequências entre 20KHz e 50KHz. Depois disso, vou tentar intensificar e melhorar a qualidade.

O programa é bem interessante, a gente pode fazer um ano do curso que você atualmente faz no Brasil e depois tem alguns meses pra conseguir um Academic Training. Acho um proposta bem interessante para os estudantes que querem ter experiências fora do Brasil. As notas requiridas pelo TOEFL têm mudada uma vez que muitas pessoas não estavam atingindo-as.

Olá Felipe.

Basicamente para criar um gerador de funções os limitantes são: precisão, range de valores (frequência, tensão, offset), e formato da onda.

Existem muitas técnicas, desde você utilizar o microcontrolador para fazer o processamento necessário para se criar a forma de onda, ou o mais simples que é fazer ele controlar algum circuito ou módulo externo responsável por gerar o sinal dentro do que necessita.

Pensando apenas no microcontrolador como quem fará todo o trabalho, você pode usar a técnica PWM vinculada com alguns filtros ou integradores, assim conseguindo o que necessita. Poderia também usar um conversor Digital-Analógico com filtros. Nesse caso, a velocidade do microcontrolador e valor dos filtros serão seus limitadores na frequência do sinal gerado.

Deixarei alguns links com alguns projetos. São ótimos como base de estudos.

http://interface.khm.de/index.php/lab/experiments/arduino-dds-sinew...

http://www.auctoris.co.uk/2011/05/25/arduino-function-generator-part-2

http://arduino.cc/en/Tutorial/DueSimpleWaveformGenerator

http://www.instructables.com/id/Arduino-Waveform-Generator

Espero ter ajudado. ^^

T++.

Estou construindo o filter low pass pra ver se as ondas ficam mais suaves. 

A única coisa que eu ainda não entendi, foi a parte de relacionar a velocidade do processador, com os valores do filtro, timer e tudo mais. Não consigo achar uma relação entre eles pra atingir a frequência que eu desejo. Tentei pegar umas teorias, mas mesmo assim está complicado para entender essa parte. Você poderia ser um pouco mais claro nessa parte?

Obrigado!

Esse é código que estou usando.

int sine[255];

void setup()
{
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);

float x;
float y;
for(int i=0;i<255;i++)
{
x=(float)i;
y=sin((x/255)*2*PI);
sine[i]=int(y*128)+128;
}
}

void loop()
{
for (int i=0;i<255;i++)
{
PORTD=sine[i];
delayMicroseconds(10);
}
}

  Olá Felipe.

  Gostaria de te responder com números e cálculos, mas vou pegar um tempo tranquilo para fazer isto. Agora respondendo rapido.... creio que os Arduinos comuns trabalham com 16MHz, por exemplo. E vamos supor que com esta velocidade de processamento a frequência máxima que teremos de leitura em um pino seja de uns 2MHz....então pela teoria de Nyquist que diz que devemos no mínimo fazer a leitura de um sinal em pelo menos duas vezes sua frequência...então daria para medir apenas um sinal com 1MHz.

 Calma, não quero te assustar. Vamos por partes. rs

 Olhando seu programa, gostei que você criou um buffer para os valores de senos, que é a variável sine[].

 Depois no loop você está varrendo estes valores e jogando no PORTD, mas...dai você precisaria ter um CI DAC para fazer a conversão do valor digital em valor analógico para você ter a senoide.  Só que existe uma técnica de PWM para fazer isto.

 Usando esta técnica você faria por exemplo:

 1) no lugar da linha:  

           PORTD = sine[i];

     troque por:

           analogWrite(3,sine[i]);

Com isto você estará fazendo um PWM com pino 3. E usando um filtro RC (um resistor em série e um capacitor para terra) você consegue ver um sinal "semelhante" com um seno.

 Eu simulei...veja o resultado:

 Espero ter ajudado.

 T++. ^^

Ajudou sim, me baseando no seu projeto consegui aprender um pouco mais sobre Proteus e tambem comecei a arriscar outros codigos pra ver qual era o resultado final.

To usando um outro codigo:

unsigned long t0;


void setup() {
pinMode(9, OUTPUT);
t0 = millis();

TCCR1B = 0x01;
}


void loop() {
analogWrite(9, (int) (255.0 * 0.5 *(1.0 + sin( (float) ((millis()-t0) % 1000) * 2.0 * 3.14 * 5.0 / 1000))));
}

O meu maior objetivo eh conseguir a frequencia gerada pelo codigo, e a partir disso poder escolher a frequencia que eu gostaria de obter baseado num potenciometro (que mudaria o valor do resistor e daria uma nova frequencia).

Nao to conseguindo obter a frequencia a partir do contador, algm tem alguma ideia do que eu faco?  

 Olá Felipe.

 A melhor maneira de medir é ir diretamente neste osciloscópio, amplie a escala para ver um período inteiro da onda, e clique no box "Cursors", e use os cursores para medir o período.

Para o contador de frequência, acho que você iria precisar retificar o sinal, ou colocar uma porta lógica ou transistor para fazer um shmitt trigger para você.

Até mais.

^^

valeu, o ultimo artigo (instructables) é excelente  :)

senhores bom dia,estou desenvolvendo uma aplicação semelhante, gostaria de saber se alguem pode me ajudar, preciso gerar um sinal de frequencia de 1Khz quadrado, ja tentei com pwm, mas sem sucesso.

desde ja agradeço a atenção de todos e fico no aguardo.

O comando tone() gera. Não te atende ?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço