Frequência PWM do Arduino Nano

Tenho usado um Arduino Nano como controlador PWM para um elemento de aquecimento.

Estou usando D11 (PB3). Eu poderia mudar, embora todos os pinos com PWM estejam em uso e exigiriam uma reescrita e reconfiguração.

Isso produz um sinal em ~ 490 Hz, mas eu gostaria de experimentar alterá-lo para uma frequência mais alta.

Presumo que seja possível variar a frequência alterando o divisor de seu padrão 64.

Meu esboço usa Usos http://playground.arduino.cc/Main/SevenSegmentLibrary e chama millis () – alterar o divisor PWM impactará em qualquer um deles?

NOTA Eu li a setPwmFrequency documentação, mas considero “interrompe a operação normal” inútil – na verdade, estou atrás de alguma explicação sobre o efeito concreto. Eu só uso millis() para cronometrar os pressionamentos de botão e piscar um LED, que não é crítico em tempo

Lembre-se de que alterar a frequência PWM altera o Os timers do Atmega e interrompe a operação normal de muitas funções que dependem do tempo (delay (), millis (), biblioteca Servo).

Tenho feito alguns estudos adicionais. http://playground.arduino.cc/Code/PwmFrequency estados Mudanças nos pinos 3, 5, 6 ou 11 podem causar o atraso () e milis ( ) funções para parar de funcionar.

Outras referências dizem 3, 11 usam timer 2 para fazer eles afetam millis() ou não como outras referências afirmam que timer 0 é usado para estes.

Comentários

  • Sim e não, dependendo do cronômetro pwm usado.

Resposta

Não sei de onde vem essa desinformação … A resposta é no , reconfigurar o Timer 2 não afeta millis() nem delay(), já que essas funções dependem do Timer 0. AFAIK, o núcleo do Arduino não usa o Timer 2 de forma alguma. Mas note que pode haver outras bibliotecas do Arduino ou de terceiros que dependem do Timer 2.

Você pode ver aqui o código-fonte de millis() e delay() .

Como MITU RAJ afirma corretamente em sua resposta, o sinal PWM no pino 11 é fornecido por Timer 2, para que você possa usá-lo com segurança.

Comentários

Resposta

A resposta é NÃO , alterar o divisor PWM para o pino 11 não afetará a função millis() (nem delay()).


Explicação:
O Arduino Nano usa o microcontrolador ATMega328P, igual ao Arduino Uno .

O PWM do pino 11 “é controlado pelo temporizador 2. Por padrão, o temporizador 2 tem uma pré-escala de 64 (ou seja, configuração 0x04). A frequência base do temporizador 2 é 31372,55 Hz resultando em uma frequência de 490,2 Hz (ou seja, 31372.55 / 64 = 490.1961).

Por outro lado, o temporizador de microssegundos (ou seja, aquele usado por millis(), micros(), delay() e delayMicroseconds()) é controlado pelo Timer 0.

Então alterar o prescaler do Timer 2 não afetará millis().

No entanto, mudará a frequência PWM do Pin 3.


De volta à sua pergunta:
As possíveis frequências PWM do pino 11 (acima de 488 Hz) são:

31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz

Onde 32, 8, 1 são o prescaler.
O que equivale para um valor de configuração de 0x03, 0x02 & 0x01 respectivamente.

Adicione esta linha de código:

TCCR2B = TCCR2B & 0b11111000 | setting; 

Onde setting é o valor da configuração do respectivo prescaler.

============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================ 

Código-fonte : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

Comentários

  • Apenas detalhes, mas … a frequência base do temporizador ' s no modo PWM correto de fase é F_CPU / 510 (31373 Hz), não F_CPU / 512: leva 255 ciclos para contar f de 0 a 255, depois mais 255 para contar de volta a zero. C.f. a equação para a frequência PWM na folha de dados.
  • @EdgarBonet Bom argumento. A resposta agora foi corrigida.
  • seria possível descer um degrau mais devagar para 15,31 Hz?

Resposta

Depende do pino que você usou para o PWM.

As especificações do Arduino UNO / NANO dizem as seguintes coisas:

A frequência básica para os pinos 3, 9, 10 e 11 é 31250 Hz.

A frequência básica para os pinos 5 e 6 é 62500 Hz.

Os divisores disponíveis nos pinos 5, 6, 9 e 10 são: 1, 8, 64, 256 e 1024.

Os divisores disponíveis nos pinos 3 e 11 são: 1, 8, 32, 64, 128, 256 e 1024.

As frequências PWM são amarradas em pares de pinos. Se um em um par for alterado, o outro também será alterado para corresponder.

Os pinos 5 e 6 são pareados no timer0.

Os pinos 9 e 10 são pareados no timer1.

Os pinos 3 e 11 são pareados no timer2.

Alterações nos pinos 3, 5, 6 ou 11 podem causar o atraso () e funções millis () para parar de funcionar. Outras funções relacionadas ao tempo também podem ser afetadas.

Comentários

  • Já que você ' citando as especificações, ' seria bom se você também pudesse criar um link para elas? 🙂

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *