¿Millis () entra en conflicto con los pines PWM asociados con el temporizador 0?

9

He leído que la millis()función usa el mismo temporizador que un par de pines PWM.

Si está utilizando esos pines PWM, ¿ millis()aún devolverá el valor correcto?

Aurast
fuente

Respuestas:

6

No entran en conflicto, ya que millis()lee estrictamente el valor inmediato, TCNT0mientras que PWM a través del temporizador 0 usa la capacidad del hardware para comparar el valor de TCNT0con los valores OCR0xsin afectar el valor de ninguno de ellos.

Ignacio Vazquez-Abrams
fuente
millis()solo usa el conteo de desbordamiento del temporizador 0. micros()lee el valor inmediato en TCNT0.
Nick Gammon
5

Solo para agregar a la respuesta de @ Ignacio que ha respondido directamente a su pregunta. El "conflicto" del que hablas está relacionado con Timer0el preescalador.

En su mayor parte, puede usar esos pines (incidentalmente los pines 5 y 6 en UNO) con PWM sin problemas y leer el valor correcto de millis()(así como obtener el retraso esperado de delay)

Donde tiene problemas es si desea cambiar el preescalador (generalmente para modificar la frecuencia de la señal PWM). Si cambia esto, entonces afecta directamente el cálculo y la presentación de informes millis()y la duración de delay(x).

Madivad
fuente
Puede leer el preescalador de su temporizador en los bits inferiores de Serial.println (TCCR0A, BIN); Si son '11', entonces su preescalador es clk / 64. Luego podría calcular el factor para modificar millis () y delay ().
Dave X
Ese es un muy buen punto y siempre he evitado modificarlo, pero no hay ninguna razón si realmente quieres o necesitas hacerlo. El otro punto es que si lo ha modificado, ya conoce el nuevo preescalador y, a su vez, podría escribir envoltorios para, millis ()o de delay ()todos modos
Madivad