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
- A desinformação vem do playground .arduino.cc / Code / PwmFrequency . Tenho certeza de que não sou o único usuário a ter sido enganado. A outra resposta acaba de publicar um trecho da documentação enganosa.
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? 🙂