Gerar frequencias com o modulo PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Gerar frequencias com o modulo PWM

Mensagempor Vonnilmam » 19 Fev 2010 22:42

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,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor msamsoniuk » 20 Fev 2010 04:38

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
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor jorgeluiz » 20 Fev 2010 16:19

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.)
Avatar do usuário
jorgeluiz
Byte
 
Mensagens: 448
Registrado em: 26 Mar 2007 02:26

Mensagempor _blackmore_ » 20 Fev 2010 16:47

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!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor proex » 20 Fev 2010 18:20

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.

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor MOR_AL » 20 Fev 2010 18:23

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x