Millis () entra em conflito com os pinos do PWM associados ao timer 0?

9

Eu li que a millis()função usa o mesmo timer de dois pinos PWM.

Se você estiver usando esses pinos PWM, millis()ainda retornará o valor correto?

Aurast
fonte

Respostas:

6

Eles não entram em conflito, pois millis()lê estritamente o valor imediato, TCNT0enquanto o PWM via timer 0 usa a capacidade do hardware para comparar o valor TCNT0com os valores OCR0xinseridos sem afetar o valor de nenhum deles.

Ignacio Vazquez-Abrams
fonte
millis()apenas usa contagens de estouro do timer 0. micros()lê o valor imediato em TCNT0.
Nick Gammon
5

Apenas para adicionar à resposta de @ Ignacio, que respondeu diretamente à sua pergunta. O "conflito" de que você fala está em relação ao Timer0pré-calibrador.

Na maioria das vezes, você pode usar esses pinos (aliás os pinos 5 e 6 no UNO) com o PWM sem problemas e ler o valor correto de millis()(além de obter o atraso esperado delay)

Onde você encontra problemas é se deseja alterar o pré-calibrador (geralmente para modificar a frequência do sinal PWM). Se você alterar isso, você afetará diretamente o cálculo, os relatórios millis()e o comprimento de delay(x).

Madivad
fonte
Você pode ler o prescaler do seu timer pelos bits inferiores de Serial.println (TCCR0A, BIN); Se eles são '11', seu pré-calibrador é clk / 64. Você pode então calcular o fator para modificar millis () e delay ().
Dave X
Esse é um ponto muito bom e eu sempre evitei modificá-lo, mas não há motivo para você realmente querer / precisar. O outro ponto é que, se você modificou você já conhece o novo prescaler e poderia, por sua vez invólucros de gravação para millis ()ou delay ()de qualquer maneira
Madivad