Qual frequência os Arduinos usam para PWM normal quando você usa analogWrite ()?
E é diferente para diferentes modelos de Arduino? Estou interessado especificamente no Mega 2560, mas também quero saber se ele é consistente entre os modelos.
Eu vi algumas referências ao Arduino usando 500 Hz, o que parece muito lento.
Comentários
- Isso também depende do pino que você está usando.
Resposta
O sinal PWM é gerado por temporizadores nos chips AVR. Cada temporizador 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 clock 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 as coisas, existem dois modos PWM diferentes: PWM rápido e PWM com correção de fase. No PWM rápido, o cronômetro conta até 255 e, em seguida, transborda e reinicia do 0 (256 estados diferentes). No PWM de fase correta, o cronômetro conta até 255, então muda a direção e conta regressivamente até zero, muda a direção e assim por diante (510 estados diferentes).
O Arduino Mega tem 5 cronômetros, 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 correto de fase. Isso resulta em frequências diferentes em pinos diferentes:
-
Pinos 4 e 13, controlados pelo timer0:
16 Mhz / 64/256 = 976,56 Hz -
Outros pinos PWM, controlados por timer1-4:
16 Mhz / 64/510 = 490,20 Hz
O cálculo é: Relógio / Número de estados do modo Prescaler / PWM
A situação é a mesma para todas as outras placas Arduino que conheço, exceto que têm menos temporizadores que se conectam a pinos diferentes.
Você pode alterar o Frequência PWM mudando o prescaler do temporizador. Veja esta página: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Também é possível fazer os cronômetros contarem para 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, então você provavelmente não perderá isso.
As bibliotecas do Arduino permitem que você use apenas a resolução de 8 bits, mesmo em temporizadores de 16 bits. deseja a resolução mais alta, você terá que escrever seu próprio analogWrite, ou usar uma biblioteca feita para esse propósito. No Arduino Mega, o timer0 e o timer2 são de 8 bits, enquanto o resto é de 16 bits.
Alterando o modo dos temporizadores de 16 bits para fazer uso da resolução total, em combinação com a alteração do prescaler e do valor TOP, você pode atingir uma ampla faixa de frequências PWM.
A frequência máxima que você pode alcançar é clock / 4, definindo o prescaler para 1 e TOP para 3 no modo PWM rápido – um valor mais baixo não é permitido. Isso lhe dará um PWM de 4 MHz com resolução de 2 bits. Pode ser 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 o folha de dados .
Alterar o prescaler, o modo PWM ou o valor TOP para timer0 bagunçará com millis()
e micros()
.
Comentários
- Concluo, então, que a frequência mais rápida que você pode obter para PWM é 16Mhz / 256 (prescaler = 1), ou 62,5Khz?
- E além disso que a frequência PWM tem que ser um fator par de 62,5KHz? 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.
- Eu atualizei a resposta para elaborar mais sobre as possibilidades de alcançar frequências específicas,
- Na extremidade de baixa frequência, você poderia pré-dimensione um temporizador de 16 bits no modo de correção de fase por um pré-dimensionador 1024 para obter 16e6 / 1024/2 ^ 16/2 = 0,119 Hz, ou 7,1 ciclos / minuto. Para valores inferiores a isso, seria necessário alternar os bits com base em algo como millis (). Ou talvez acione o contador no pino de entrada externa T ?.