Boa tarde garagistas, estou tentando fazer um trabalho com que o arduino gere pra mim um sinal senoidal. Pesquisei sobre o assunto e vi que o ideal seria trabalhar com filtro RC passa baixa. Fiz o circuito de RC passa baixa e testei no osciloscopio mas não deu muito certo. O código peguei do wagner rambo, do canal wr kits para teste:

#define pwm 11

float sine;
int sine_i;


void setup()
{
pinMode(pwm, OUTPUT);
Serial.begin(9600);

}

void loop()
{
for(int i=-180;i<=180;i+=1)
{
sine = sin(i*(3.1415/180.0)
sine_i = 127+int(sine*255.0/2.0);

analogWrite(pwm, sine_i);
Serial.println(sine_i);
delay(5);

} //end for

}

minha duvidas são, se eu quiser um sinal senoidal com frequencia de 40hz, a frequencia de corte seria esses 40hz? ou seja para isso eu poderia adotar um capacitor de 100nf, e um resistor em torno de 40k. Sobre o código algo mudaria?

Exibições: 795

Responder esta

Respostas a este tópico

Olá.

   Para entender, vc precisa mostrar pra alguem que consegue ou simplesmente gerar ? 

   Se precisa mostrar pra alguem (trabalho escolar) recomendo continuar no seu caminho, com as considerações:

   40Hz senoidais, se vc fizer uma atualização de grandeza a cada grau são 360 atualizações. Assim vc precisa atuar sobre o pwm 360x40=14400 vezes por segundo. É muita atualização.

   Nesse loop é impossivel enviar coisas pela serial, impossivel calcular um seno (talvez ate de tempo, mas não precisa).

   A ideia seria vc pular alguns graus... Por ex contar de 3 em 3.

   Um jeito de agilizar seria usar tabela. Mesmo equipamentos antigos anteriores aos microcontroladores usavam eproms para guardar tabelas de acionamento em nobreaks, gerando senoidais. Era bem legal. Os endereços altos definiam qual tabela usar e os baixos a grandeza dentro da tabela. Se a tensão estivesse alta ou baixa ele trocava a tabela (mas é história. Agora existem microcontroladores).

   Enfim, como vc tem RAM acredito que um jeito simples seria vc pré gerar a tabela em RAM. Fazer um loop só pra gerar os 360 valores. Com um cuidado maior vc pode gerar inclusive só 180 pq sabe que metade é 128+valor e metade 128-valor.

   Enfim, considere tudo isso, tire o print do loop (impossivel mandar pela serial a 9600 strings e gerar) e calcule corretamente o delay(). Saiba que o delay exclui o tempo para calculo, então será distorcido. Apenas uma interrupção de timer conseguiria gerar com tempo correto.

   Caso precise apenas gerar, saiba que existem caminhos mais curtos:

https://www.arduino.cc/en/Tutorial/DueSimpleWaveformGenerator

Eh para o Due, mas para 40Hz daria pra usar qq coisa.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço