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..
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 ~).
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..
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