a solucao direta seria usar um pwm fixo de 16 bits e, assim, o periodo completo de cada ciclo seria de 65536 clocks. mas multiplicando 22050Hz por 65536 vc teria um total de 1.4GHz de clock no pwm para poder reproduzir 22050 amostras com precisao de 16 bits e isso eh elevado demais.
daih disso partem tres solucoes diferentes.
uma solucao simples seria diminuir o tamanho do contador pwm. assim, para um contador de 8 bits vc precisaria de uns 5MHz, para 9 bits uns 11MHz, para 10 bits uns 22MHz e assim por diante. supondo que vc fosse operar a 22MHz, vc descartaria 6 bits de cada amostra.
a solucao complicada seria usar taxa de amostragem variavel e tamanho do contador pwm variavel. supondo um clock de 22MHz, vc poderia variar o comprimento do contador pwm para cobrir diferentes bandas com diferentes tamanhos de contador, variando de 16 a 8 bits por exemplo.
neste caso, vc teria a seguinte divisao:
16 bits: ateh 344.531 Hz
15 bits: ateh 689.062 Hz
14 bits: ateh 1378.12 Hz
13 bits: ateh 2756.25 Hz
12 bits: ateh 5512.5 Hz
11 bits: ateh 11025 Hz
10 bits: ateh 22050 Hz
9 bits: ateh 44100 Hz
8 bits: ateh 88200 Hz
e uma solucao nao muito complicada nem muito simples seria usar o pwm fixo em 8 bits com 88200Hz de taxa de amostragem e compensar a diferenca atraves de difusao de erro. trata-se de um processo de quantizacao, onde vc parte de uma amostra de 16 bits, trunca para 8 bits e entao armazena o resto da truncagem em um contador de erro, q eh somado a proxima amostra. se o erro acumulado for muito grande, a quantizacao da proxima amostra sera modificada de modo que a media entre sucessivas amostras fica mais proximo ao valor original.
por isso eh interessante usar uma taxa de amostragem maior, mas nao precisa efetivamente trabalhar com um volume maior de dados. ao inves disso, pode usar 22050Hz e quadriplicar as amostras. mesmo usando amostras repetidas, o desvio em funcao do erro acumulado ira fazer as amostras terem valores diferentes.
por exemplo, se vc tem varias amostras com valor 256, a truncagem de 16 para 8 bits vai resultar em 1 sempre e nenhum residuo. mas se vc tiver um valor de, digamos, 384, a truncagem tb sera de 1, porem sobra um residuo de 128. assim no proximo ciclo, digamos que seja de 384 tb, sera somado o valor 384 mais o residuo de 128, o que totaliza 512. soh que nesse caso a truncagem tera valor 2 e o residuo sera zero.
o que vai ocorrer eh que a saida ficara variando entre 1 e 2 continuamente, o que sera efetivamente percebido como um valor 1.5. de certa forma, essa tecnica de difusao de erro equivale ao metodo complicado e efetivamente vai simular uma precisao pwm variavel para diferentes bandas, porem sem complicar o hardware.
Guri escreveu:Olá a todos,
É o seguinte:
Estou com uma dúvida em relação a frequencia ideal para um PWM que estou fazendo via software.
Então eu fiz uma amostragem com as seguintes caracteristicas:
Sample rate = 22.050hz
Resolução do sampled = 16 bits
Mono
Eu estou enviando para um DAC de 8 bits do tipo paralelo r2r e funciona corretamente a reprodução da wave.
Agora eu queria enviar os dados para o PWM, porém qual seria a frequencia que o PWM deveria ser sintonizado?
Obrigado,