Czy millis () koliduje z pinami PWM związanymi z zegarem 0?

9

Czytałem, że millis()funkcja używa tego samego timera co kilka pinów PWM.

Jeśli używasz tych styków PWM, czy millis()nadal zwróci prawidłową wartość?

Aurast
źródło

Odpowiedzi:

6

Nie powodują konfliktu, ponieważ millis()ściśle odczytuje bezpośrednią wartość, podczas TCNT0gdy PWM przez zegar 0 wykorzystuje zdolność sprzętu do porównania wartości TCNT0z wartościami OCR0xbez wpływu na wartość którejkolwiek z nich.

Ignacio Vazquez-Abrams
źródło
millis()po prostu używa liczników przepełnienia Timera 0. micros()wczytuje bezpośrednią wartość w TCNT0.
Nick Gammon
5

Wystarczy dodać do odpowiedzi @ Ignacio, która bezpośrednio odpowiedziała na twoje pytanie. „Konflikt”, o którym mówisz, odnosi się do Timer0preskalera.

W większości przypadków możesz używać tych pinów (nawiasem mówiąc, pinów 5 i 6 w UNO) z PWM bez problemu i odczytać prawidłową wartość millis()(a także uzyskać oczekiwane opóźnienie od delay)

Występują problemy, jeśli chcesz zmienić preskaler (zwykle w celu modyfikacji częstotliwości sygnału PWM). Jeśli to zmienisz, bezpośrednio wpłyniesz na obliczenia, raportowanie millis()i długość delay(x).

Madivad
źródło
Możesz odczytać prescaler licznika czasu na dolnych bitach Serial.println (TCCR0A, BIN); Jeśli mają one „11”, oznacza to, że Twój prescaler to clk / 64. Następnie można obliczyć współczynnik modyfikacji millis () i delay ().
Dave X
To bardzo dobra uwaga i zawsze starałem się unikać modyfikacji, ale nie ma powodu, jeśli naprawdę chcesz / potrzebujesz. Drugą kwestią jest to, że jeśli go zmodyfikowałeś, znasz już nowy prescaler i możesz z kolei pisać opakowania dla millis ()lub w delay ()każdym razie
Madivad