spiderpoison:
Bubulindo - Excelente pergunta. "o que significa o estado do meio? tu tens pwm on, pwm off e a linha para no meio... como defines isso? e como adaptas isso a um sistema que só tem dois estados? ", acho que eu sei te explicar o que ocorre.A subida e descida da linha simbolizam a amplitude, que nós não temos controle no Arduino com pulsos PWM, correto? Mas a linha do meio significa que a Amplitude é 0. A linha do meio então pode ser simulada com PWM off, já que não tem amplitude e não gera som, um problema fácil de solucionar.
Mas, se notar no gráfico de somatória de 3 notas (outro post), irá ver que aparecem degraus acima da linha do meio, teoricamente deve haver uma variação na amplitude para obter o efeito desejado. Neste caso além de gerar os pulsos eu acredito que deva ser controlada a voltagem para simular um aumento e a diminuição da amplitude do pulso, a grosso modo o volume do som, o que acredito não ser possível no Arduino utilizando apenas o hardware da placa.
A amplitude é precisamente o que tu controlas com o PWM. Variando o PWM consegues amplitudes entre 0 e 5 (a tua linha do meio seria 2,5V). Mas depois precisarias de mais lógica para criar a tua onda quadrada ou sinusóidal (como expliquei no post atrás). Se não quiseres controlar amplitude, podes usar o código que postei lá atrás.
Estás a compreender agora o PWM? A sua principal utilizacão é normalmente simular amplitudes diferentes usando apenas sinais digitais.
spiderpoison:
Pelo que notei a grande diferença da onda senoidal é que para atingir o estado On/Off do PWM a amplitude é diminuída gradualmente até o ponto Off e retorna da mesma forma, isso produz um som mais limpo, como um "tuuuuuuuu" e não os "trutrutrutrutru" de uma onda quadrada."O problema é que 1/440 dá uns 2 milissegundos... e o arduino talvez não seja tão potente assim. É caso de ver se consegues gerar uma nota com este método. "
Sobre o texto acima é justamente o que eu imaginei, não sei se o hardware é tão rápido para conseguir executar o pulso, pois ele seria extremamente rápido. Mas o outro desafio é alterar a voltagem do pulso e não liberar sempre os 5V.
O microcontrolador corre a 16MHz... isso dá 6,25 * 10^-8. Eu acho que o chip do Arduino consegue cumprir os 2ms, mas o código não deve usar bibliotecas do Arduino (porque são feitas para o pior caso e normalmente duplicam o tempo de ciclo) e tem de ser feito com cuidado... usar registos se possível para algumas tarefas, etc, etc...
Poder variar a amplitude, por exemplo, iria ser um programa complexo de fazer devido a alguma da matemática e ciclos envolvidos... claro que com algumas práticas de programacão a coisa chegava lá.
Qual é o interesse em fazer isto?