quinta-feira, 14 de maio de 2015

Ajustando a frequência dos PWMs do arduino Leonardo

Usando o PWM dos pinos de arduino, podemos modular o duty cicle de um sinal de saída, mas, para algumas aplicações, também se torna necessária a mudança da frequência do sinal de saída (e.g. acionamento de um motor com uma frequência inaudível).

Para isso, precisamos mudar alguns parâmetros dos timers para conseguir mudar o valor da frequência de saída da porta desejada. No arduino Leonardo, temos as seguintes linhas de código e as frequências obtidas para cada pino com saída PWM.

Timer Configurado Código de programação Pino 13 Pino 11 Pino 10 Pino 9 Pino 6 Pino 5 Pino 3
Default - 490 Hz 980 Hz 490 Hz 490 Hz 490 Hz 490 Hz 980 Hz
Timer 0 TCCR0B = TCCR0B & 0xF8 | 0x01 490 Hz 625000 Hz 490 Hz 490 Hz 490 Hz 490 Hz 62500 Hz
Timer 1 TCCR1B = TCCR1B & 0xF8 | 0x01 490 Hz 980 Hz 31400 Hz 31400 Hz 490 Hz 490 Hz 980 Hz
Timer 3 TCCR3B = TCCR3B & 0xF8 | 0x01 490 Hz 980 Hz 490 Hz 490 Hz 490 Hz 31300 Hz 980 Hz
Timer 4 TCCR4B = TCCR4B & 0xF8 | 0x01 31400 Hz 980 Hz 490 Hz 490 Hz 31400 Hz 490 Hz 980 Hz
* valores aproximados obtidos por um osciloscópio.

Com isso conseguimos verificar qual timer é responsável pela frequência de cada pino.

Podemos conseguir outros valores de frequência para cada  pino alterando a parte final do código para cada timer (e.g. TCCRXB = TCCRXB & 0xF8 | 0x0N, onde X é o número do respectivo timer e N é o valor de divisão do prescaler do respectivo timer).


Valores 0x0N Pinos 5, 6, 9, 10 e 13 Pinos 3 e 11
0x01 31400 Hz 62500 Hz
0x02 15600 Hz 7810 Hz
0x03 7810 Hz 980 Hz
0x04 3910 Hz 245 Hz
0x05 1950 Hz 61,3 Hz
0x06 980 Hz 1,91 Hz
0x07 490 Hz 1,92 Hz
0x08 245 Hz -
0x09 123 Hz -
0x0A 61,7 Hz -
0x0B 30,5 Hz -
0x0C 15,3 Hz -
0x0D 7,63 Hz -
0x0E 3,81 Hz -
0x0F 1,92 Hz -
*valores aproximados obtidos por um osciloscópio.

Lembrando que os pinos citados são todos em relação ao arduino Leonardo, outros arduinos podem ter tabelas diferentes. 

Nenhum comentário:

Postar um comentário