Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte.
Si escribes en español debes usar el foro Arduino en español.
Este mensaje lo envío porque tu hilo fue movido del foro en inglés.
Cuando quieres hacer algo como lo que propones, no puedes estar haciendo cuentas.
Las cuentas insumen tiempo y no dispones de tiempo habitualmente.
Lo que se haces es poner todo en una planilla de calculo, llevar los valores a enteros, crear una tabla 0 a 255 si esa es la resolución de PWM como es tu caso y entonces solo te mueves dentro de dicha tabla cambiando el indice del vector que tiene la lookup table.
La frecuencia se la das con el TIMER, estableciendo cuantas muestras presentaras y lo haces a intervalos que te den el período de tu señal de 440hz.
Período T = 1/F = 1/440Hz = 2.27mseg = 2272 useg
Si tienes 256 valores o muestras que presentar entonces
Tu Timer debe tener una rutina de interrupción o tick cada 2272useg/256 = 8.875useg u 8875 nseg
Cada vez que se invoque dicha rutina devuelve un valor correspondiente a la tabla
y mueves el indice a la posicion siguiente y si llega a 255 entonces el siguiente será 0 o sea
modulo 256
Es muy fácil cuando entiendes esto.
Aca no hay calculos de ningún tipo.
El micro trabaja aliviado y en el loop solo muestra el comando analogWrite(valor) siendo valor un dato que se extrae de la tabla comprendido entre 0 y 255.
A esto se le deben incorporar algunas cuestiones extra microprocesador.
Tu senoide esta desplazada o sea tiene un offset de 2.5V (si usas un micro de 5V) por lo que tendras que agregar un operacional con filtro pasabajos que garantice algo suave. Y tambien quitarle los 2.5 para tener una senoide mas o menos prolija.
Es mejorable? Claro.
Un DAC de 12bits minimo o mejor.