Libreria WaveCraft : dubbi sull'uso

ciao a tutti ,

sono incappato in questa libreria che mi sembra serva per generare sinusoidi con arduino

cosi' ho voluto fare un test copiando da uno degli esempi....
Dovrebbe generare una sinusoide su pin 13

#include <WaveCraft.h>  //carico libreria

WaveCraft wave1(1, 100);

// inizializzo la seriale e setto i baud di trasmissione
void setup() {
  Serial.begin(500000);
  pinMode(13, OUTPUT);  // setto il pin di uscita
}

void loop() {

  wave1.setFrequency(71.9);  //carico la frequenza in Hz
  wave1.setLow(0);           // carico il valore minimo
  wave1.setPhase(0);         // carico la fase
  wave1.setHigh(255);        // carico il valore massimo

  Serial.print(wave1.getValue());  //plotto su seriale l'uscita per test
  Serial.print(" ");
  Serial.print(255);
  Serial.print(" ");
  Serial.print(0);
  Serial.print(" ");
  Serial.println(" ");
  int wave = wave1.getIntValue();
  analogWrite(13, wave);
}

se si avvia dopo programmato arduino il plotter seriale si vede la sinusoide.. ma sul pin 13 c'e una bella oonda quadra.
Ho sbagliato in qualche punto oppure lo scopo di questa libreria e' quello di PLOTTARE solo le sinusoidi , non di generarle su di un pin?
Ho cercato di contattare l'autore ma non ho avuto risposta..

Cosa ne pensate ?

E' una libreria che calcola serie sinusoidali:
https://github.com/Electronics-Workshawp/WaveCraft/blob/main/WaveCraft.cpp/
Comunque, non puoi uscire in PWM sul 13.

Come ti ha indicato Datman, visto che usi una analogWrite() DEVI usare SOLO i pin che supportano il PWM (normalmente Arduino li marca con il simbolo ~).

Guglielmo

Ecco qui su PIN 6 ...devo capire che filtro farex ripulire

Naturalmente, la frequenza del PWM deve essere molto più alta di quella del segnale da generare, ma a questo dovrebbe pensarci la libreria... :wink:

L immagine mostra il pwm sul PIN 6 dopo essere stato filtrato con un filtro RC calcolato sulla frequenza generata.
Credo che vada attenuata la frequenza di pwm che e intorno a 1 kHz..

Questa prova l'avevi vista?
https://forum.arduino.cc/t/generare-una-sinusoide-50-hz-con-arduino/1082656/18

Si
Voglio fare un filtro simile...non so se con la libreria che uso la frequenza di pwm sia la stessa ma potrebbe andare...

esperimenti fatti .

con la libreria wavecraft la frequenza di pwm e' troppo bassa per approssimare fedelmente un onda sinusoidale .Il filtro a -3db r/c non riesce a "arrotondare" la sinusoide.
Peccato perche' una libreria dedicata a creare onde sinsoidali sarebbe stat utile a semplificare molti lavori (vedi i post su internet al riguardo)
Ho allora cercato e trovato altro scketch con una frequenza piu' alta

#include <TimerOne.h>

#define outPin  10
#define delayPin  11    // this pin is just used to test the compute time

const float pi = 3.14159 ;
const float T = 100 ;    // sample time in microseconds
const float freq = 1000 ;  // frequency of tone in hertz
const float omega = 2*pi*freq ;
const float A = 490 ;  // amplitude
// next line initializes oscillation with amplitude A
float a[]={0.0, A*sin(omega*T/1000000.0),0.0}; 
// c1 is the difference equation coefficient
const float c1 = (8.0 - 2.0*pow(omega*T/1000000.0,2))/(4.0+pow(omega*T/1000000.0,2));


void setup()                 
{
  Timer1.initialize(T);  // set sample time for discrete tone signal
  Timer1.pwm(outPin, 0,T);
  Timer1.attachInterrupt(compute);
  pinMode(delayPin, OUTPUT);
}

void loop()                   
{
  
}

void compute()
{
  digitalWrite(delayPin, HIGH);
  a[2] = c1*a[1] - a[0] ;  // recursion equation
  a[0] = a[1] ;
  a[1] = a[2] ; 
  Timer1.setPwmDuty(outPin, int(a[2])+512);
  digitalWrite(delayPin, LOW); 
}

con questa e lo stesso filtro r/c la ricostruzione e' perfetta

Installato arduino nano pro nell'apparecchiatura che dovevo modificare : funzionamento perfetto !
Grazie per il supporto a tutti !!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.