Página 1 de 1

Gerar frequencias com o modulo PWM

MensagemEnviado: 19 Fev 2010 22:42
por Vonnilmam
Meus amigos!

Eu estou fervendo a minha cabeça tentando entender como eu poderia gerar frequencias (mais especificamente as notas musicais) com precisão utilizando o módulo PWM.

Seria tipo assim:

Teria uma tabela com uma amostra de uma senoide com 256 passos (8bits), pensei em utilizar uma frequencia de 19,5 khs no modulo PWM:

A minha dúvida e é o que esta me deixando de cabeça quente é que não consegui entender como eu poderia gerar as frequencias que necessito (escala musical) com precisão através do PWM...

Alguém de vcs já conseguiu ou sabe como funciona o processo?

Eu sei que é possivel sim gerar frequencias com precisão através deste processo de amostragem, só não entendi como funciona o processo, não consegue captar....

Muito obrigado,

MensagemEnviado: 20 Fev 2010 04:38
por msamsoniuk
vc jah viu como funciona um amplificador classe D nao eh?

http://www.maxim-ic.com/app-notes/index.mvp/id/3977

eh mais ou menos a mesma coisa, com a diferenca que no lugar de um gerador de rampa e comparador, vc vai usar um contador de timer para gerar o sinal pwm. a grossissimo modo, para um valor 1, o timer vai contar n ciclos com a saida em nivel x e depois 256-n ciclos com nivel 0, de modo que a largura do ciclo fique 256 clocks, com n variando de 0 a 255. entao, de saida, para enviar a amostra n vc jah precisa de 256x mais clock no timer! assim, para um audio de 8KHz a 8 bits, vc precisaria de um clock no timer de pelo menos 2048KHz.

resolvido o problema de que vc vai ter um timer com clock fixo e taxa de amostragem fixa, resta apenas o trabalho de sintetizar a frequencia que vc quer de acordo com a tabela de amostragem. e neste caso nao eh muito complexo. supondo que vc vai ter uma tabela de 256 entradas (no fundo apenas 64 entrada bastariam, visto que os outros quadrantes sao espelhos do primeiro), vc soh precisa relacionar sua taxa de amostragem com a quantidade de elementos.

no caso de 8KHz, vc sabe q se varrer a tabela a 8KHz e gerar uma saida de 1Hz vc precisaria fazer algo como:

interrupt_8KHz:
n = table[(i*256/8000)%256];
i++;

por outro lado, a relacao de 8000/256 eh 31.25, que podemos arredondar para 31, de modo que:

interrupt_8KHz:
n = table[i%256];
i++;

geraria uma frequencia de 31KHz, o que corresponde a fazer 31*256/8000. entao para uma frequencia qualquer vc poderia simplesmente utilizar:

interrupt_*KHz:
n = table[(i*f*256/8000)%256];
i++;

e claro, pensar numa forma de otimizar estas contas ae! :)

tem um post similar aqui:

http://www.asm51.eng.br/phpbb/viewtopic ... sc&start=0

MensagemEnviado: 20 Fev 2010 16:19
por jorgeluiz
nao da'. Num sinal PWM voce so' muda o ciclo ativo, a frequencia se mantem constante. Imagine um sinal de 1ms de duraçao. Voce pode alterar o ciclo ativo, da parte alta e baixa, mas a duraçao vai ser a mesma, e consequentemente a frequencia que e' o inverso do periodo. (Neste caso 1KHz.)

MensagemEnviado: 20 Fev 2010 16:47
por _blackmore_
um colega da faculdade foi "intimado" a fazer um amplificador de audio utilizando PWM, porém ... ele o fará analógico ...
Agora para desenvolver isso digital ... utilizando o PWM de um microcontrolador PIC ou mesmo dsPIC ... é possível? se a frequencia do PWM é fixa ... e o duty variável .. como isso deve ser implementado no microcontrolador?

http://i.cmpnet.com/planetanalog/featur ... e/Fig4.gif

abrax!

MensagemEnviado: 20 Fev 2010 18:20
por proex
PWM para áudio não é a mesma coisa que PWM para motor.

Se vc quer uma resposta em frequencia até 20Khz, a portadora do pwm deve ser de no minimo 200Khz, eu disse NO MINIMO.

Se vc quer um nivel de ruido bem baixo, não audivel, deve usar uma resolução de 16 bits NO MINIMO, o ideial é 24 bits.

Além da frequencia da portadora do pwm e da resolução do pwm vc tem que tomar cuidado com um troço chamado JITTER.

Mas se vc fizer com PIC, com a frequencia da portadora bem baixa e com resolução de 8 bits, vc só estará aprendendo como não se deve fazer essas coisas e ainda mais com PIC. :lol:

Vonnilmam, acho que vc ja esta no ponto pra usar processadores mais poderosos para esse tipo de aplicação, com PIC vc só irá perder tempo e não cehgara a lugar algum.

.

MensagemEnviado: 20 Fev 2010 18:23
por MOR_AL
Bom.
Você pode implementar um PWM em um pino.
1 - Primeiro você tem que saber a relação entre a largura de um pulso e a tensão. Na realidade é a relação Ton / T (delta). É algo assim:
v = Vmáx * delta. Vmáx = Vcc = 5V --> delta = v / 5
Para delta máx --> Ton = T --> delta máx = T / T = 1 --> v = 5V
Para delta mín --> Ton = 0 --> delta mín = 0 / T = 0 --> v = 0V
2 - Considere a equação de uma senóide. v_sen = A * sen (teta). No nosso caso (em um uC com alimentação entre 0 e 5V), a senóide NÃO tem valores negativos, então, deve-se acrescentar um valor positivo à equação. Este valor vai fazer com que a senóide não tenha valores negativos:
v_sen = A * sen(teta) + A --> v_sen = A[1 + sen(teta)]
3 - Agora basta saber que o valor mínimo é zero e o máximo é 5 volts.
v_sen_mín = 0 = A[1 + sen(teta)]. O valor de A Não pode ser zero, logo, quando a equação der zero volts, significa que o ângulo teta vale 270º, ou 3pi / 4.
O valor máximo vale 5V, quando teta vale 90º, ou pi / 4. Logo:
v_sen = 5 = A[1 + sen(90º)] = A[1 + 1] = 2A ---> A = 5 / 2--> A = 2,5V
A equação fica então:
v_sen = 2,5 * [1 + sen(teta)]

4 - Agora que você conhece a equação do seno (v_sen), crie uma tabela com n valores. Esta tabela relaciona o delta com o ângulo teta.
Como delta = v / 5, substituindo o v por v_sen, a nova relação fica:
delta = v_sen / 5 --> delta = A[1 + sen(teta)] / 5
Dê valores de teta e calcule o delta correspondente.
Por exemplo: (Aí vai depender da sua precisão) Se você escolher valores de teta espaçados de apenas um grau, vai ter mais precisão, mas também vai ter mais valores de delta, o que leva a muitos pontos que vão formar a sua senóide. Logo, para criar um ciclo, então vai ter que fazer 360 deltas, o que implica em mais processamento. Isso leva inevitavelmente a maiores períodos, ou menores freqüências. Escolha variações de teta de 5º. Acho que é bom. Depois você pode alterar.
Com isso você terá [(360 - 0) / 5] + 1 valores, ou 73 valores.
5 - Note que ainda não falamos da frequência. Vamos falar agora.
Você cria uma senóide, gerando os 73 pulsos que variam no tempo. Estas larguras de pulsos estão relacionadas com a relação Ton / T, ou delta. Repare que o seu delta varia de 0 a 1. Mas quantos valores de delta existirão? Resposta 73. Porquê? Porque vai ter um valor de teta para cada valor de ângulo escolhido por você!
Bom. Se você tem 73 valores, e o maior deles (o um) vai corresponder ao período T, então você tem que relacionar o período com o seu tempo de processamento. Explico melhor! Imagina que você quer fazer uma senóide com 1MHz. O período seria 1us. Como construir um monte (73) de pulsos, e com largura variável, que esteja contido em 1us? Seu processador teria que ter um clock de, chutando, 1GHz. Imagine que estes pulsos fossem fixos, com delta valendo 0,5. Isso daria um período de uns e zeros de T(1 ou 0) = 1us / (2 * 73) = 6,9ns!!! Agora, como os seus pulsos variam no tempo, estes 6,9ns seriam ainda reduzidos. Pense ainda que são necessárias algumas instruções para buscar estes valores da tabela. Então o seu uC precisaria ser mais rápido ainda!!!
Conclusão: Este processo só é válido se você precisar construir senóides de baixas freqüências.
Você teria ainda que, na saída destes pulsos incluir um filtro, que não é simples, pois depois de tudo isso, este filtro teria que deixar passar a senóide com pouca atenuação, mas bloquear (e muito) as outras freqüências que estão presentes nesse trem. E essas freqüências não estão longe (no espectro de freqüências) da frequência de sua senóide. Caso contrário, sua senóide teria uma série de picos.

Mas não se desespere. A eletrônica analógica está mais relacionada com a natureza que a digital.
Você pode construir uma senóide com amplificadores operacionais e diodos. A precisão chega normalmente a 1%. E tem mais. Alterando apenas o valor de um potenciômetro, eu já fiz a frequência variar mais de 1000 vezes. Mas para isso foi necessário aceitar uma distorção maior. A menos que fosse incluído um circuito de correção de off set.
A outra opção é fazer um contador em anel e os valores acessam a memória não volátil. Nos 8 bits de saída coloque um conversor digital analógico. Escolha o simples. O tal da malha R-2R. O filtro na saída deste conversor seria bem simples. Mas em todos os casos de solução com uso de eletrônica digital, você teria que implementar um filtro analógico. Se sua senóide tiver frequência variável, então este filtro também teria.
Bom.
Boa sorte.
MOR_AL