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.

Exibições: 546

Responder esta

Respostas a este tópico

Felipe o arduino já possui entradas analogicas, mas caso você precise mesmo assim fazer uma saida digital, pesquise sobre conversores A/D, você pode fazer um com uma boa precisão. Talvez isso supra sua necessidade.

Mas é necessário passar para digital? Pois o Arduino consegue ler de 1 a 5V.

Não é necessário, a porta analógica também le de 0 a 5v.
Caso seu gerador tenha um pico maior que 5v basta adicionar um divisor de tensão e ler a tensão encima de um resistor. Também por segurança pode usar um zener 5,1v em paralelo com o pino analogico

A tensão que estou usando é 5, mas na aplicação a tensão máxima será de 4.2, algo assim.

Estou usando esse código, mas aparentemente não estou tendo o resultado que esperava olhando no serial monitor.

Vou usar o mesmo arduino para gerar a funcao de onda atraves de uma placa DDS, que vai passar por um circuito de amplificacao e pra tirar o offset, e depois ler. Tentei juntar o codigo que esta funcionando da geracao de onda com o codigo (aparentemente simples) da leitura, e nao entendo porque nao funciona. 

O primeiro codigo eh o da leitura e o segundo da geracao com a leitura.

CODIGO PARA RECEBER O SINAL ANALOGICO E TORNAR DIGITAL:

void setup () {
Serial.begin(9600);
}

void loop () {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0/1230.0);
Serial.println(voltage); 
}

CODIGO PARA A GERACAO DA ONDA:

/*
* 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
* 9850 datasheet at http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf
* 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
Serial.begin(96000); // initiate the port
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
}

void loop() {
sendFrequency(20e3); // freq
while(1);
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0/1230.0);
Serial.println(voltage);
}

Pessoal, aparentemente errei nas ultimas linhas, nao estava fazendo o for de maneira certa, pra quem quiser o codigo:

/*
* 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
* 9850 datasheet at http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf
* 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(100) ;
}
}

Agora aparentemente esta funcionando como eu desejava.

Quando leio a partir do arduino, eu recebo esse tipo de sinal, que eh o esperado:

Que tipo de circuito eu preciso fazer pra tirar o noise, offset e deixar a onda mais forte a fim de conseguir a mesma onda que estava mandando, ou seja, a de um seno?

Obrigado

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço