Qual é a frequência de saída PWM no Arduino

22

Qual frequência o Arduinos usa para o PWM normal quando você usa analogWrite ()?

E é diferente para diferentes modelos do Arduino? Estou interessado especificamente no Mega 2560, mas também quero saber se é consistente entre os modelos.

Eu vi uma referência passageira ao Arduino usando 500 Hz, o que parece muito lento.

Duncan C
fonte
Isso também depende do pino que você está usando.
Gerben

Respostas:

31

O sinal PWM é gerado pelos temporizadores nos chips AVR. Cada timer pode gerar um sinal PWM em dois ou três pinos diferentes. Cada pino pode ter seu próprio ciclo de trabalho, mas eles compartilham a frequência PWM. Você pode alterar a frequência do PWM alterando a fonte do relógio para os temporizadores. Por padrão, eles usam o relógio da CPU dividido por 64, ou seja. eles têm seu prescaler definido como 64 pelo código de inicialização do Arduino. Para confundir ainda mais, existem dois modos PWM diferentes: PWM rápido e PWM com correção de fase. No PWM rápido, o temporizador conta até 255, transborda e inicia novamente a partir de 0 (256 estados diferentes). Na fase correta do PWM, o temporizador conta até 255, depois muda de direção e conta para baixo até zero, muda de direção e assim por diante (510 estados diferentes).

O Arduino Mega possui 5 temporizadores, timer0 - timer4. Como o timer0 também é usado para as funções millis e micros, ele usa o PWM rápido, enquanto os outros temporizadores são configurados para o PWM de fase correta. Isso resulta em diferentes frequências em diferentes pinos:

  • Pino 4 e 13, controlado pelo temporizador0:
    16 Mhz / 64/256 = 976,56 Hz

  • Outros pinos PWM, controlados pelo timer1-4:
    16 Mhz / 64/510 = 490,20 Hz

O cálculo é: número de estados do modo Relógio / Prescaler / PWM

A situação é a mesma para todas as outras placas Arduino que eu conheço, exceto que elas têm menos temporizadores que se conectam a pinos diferentes.

Você pode alterar a frequência PWM alterando o pré-calibrador do timer. Veja esta página: http://playground.arduino.cc/Main/TimerPWMCheatsheet

Também é possível fazer com que os temporizadores sejam contados com um valor diferente de 255. Nos temporizadores de 8 bits, você perderá um pino de saída, mas nos temporizadores de 16 bits, você pode usar o Registro de captura de entrada para definir um valor TOP. A funcionalidade de captura de entrada é um recurso raramente usado na comunidade Arduino, portanto você provavelmente não a perderá.

As bibliotecas do Arduino permitem apenas a resolução de 8 bits, mesmo nos temporizadores de 16 bits. Se você deseja uma resolução mais alta, precisará escrever seu próprio analogWrite ou usar uma biblioteca criada para esse fim. No Arduino Mega timer0 e timer2 são de 8 bits, enquanto o restante é de 16 bits.

Alterando o modo dos temporizadores de 16 bits para usar a resolução total, em combinação com a alteração do pré-calibrador e do valor TOP, você pode obter uma ampla gama de frequências PWM.

A frequência máxima que você pode atingir é clock / 4, configurando o pré-calibrador para 1 e TOP para 3 no modo PWM rápido - um valor mais baixo não é permitido. Isso fornecerá um PWM de 4 MHz com resolução de 2 bits. Pode estar em 0%, 25%, 50% ou 75% do tempo. Um valor TOP mais alto fornecerá uma resolução mais alta em uma frequência mais baixa.

Para uma explicação mais detalhada, leia este artigo ou consulte a folha de dados .

Alterar o prescaler, o modo PWM ou o valor TOP para o timer0 mexerá com millis()e micros().

user2973
fonte
1
Entendo, então, que a frequência mais rápida possível para o PWM é 16Mhz / 256 (prescaler = 1) ou 62.5Khz?
Duncan C
Além disso, a frequência PWM deve ser um fator par de 62,5 KHz? Alguém em outro segmento queria controlar a velocidade do ventilador de um PC de 4 pinos. Aparentemente, ele quer um sinal de controle PWM de 25KHz. 62,5 / 25 é 2,5, que não é um valor inteiro.
Duncan C
Eu atualizei a resposta para elaborar mais sobre as possibilidades de obtenção de frequências específicas,
user2973
Na extremidade de baixa frequência, você pode pré-dimensionar um temporizador de 16 bits no modo de correção de fase por um pré-calibrador 1024 para obter 16e6 / 1024/2 ^ 16/2 = 0,119Hz ou 7,1 ciclos / minuto. Para menos que isso, seria necessário alternar os bits com base em algo como millis (). Ou talvez acione o contador no pino de entrada externo T ?.
Dave X