Widerspricht millis () den PWM-Pins, die dem Timer 0 zugeordnet sind?

9

Ich habe gelesen, dass die millis()Funktion denselben Timer wie einige PWM-Pins verwendet.

Wenn Sie diese PWM-Pins verwenden, wird millis()trotzdem der richtige Wert zurückgegeben?

Aurast
quelle

Antworten:

6

Sie stehen nicht in Konflikt, da millis()der unmittelbare Wert strikt eingelesen wird, TCNT0während PWM über Timer 0 die Fähigkeit der Hardware nutzt, den Wert von TCNT0mit den Werten in zu vergleichen, OCR0xohne den Wert eines von ihnen zu beeinflussen.

Ignacio Vazquez-Abrams
quelle
millis()Verwendet nur Timer 0 Überlaufzählungen. micros()liest den unmittelbaren Wert in TCNT0.
Nick Gammon
5

Nur um die Antwort von @ Ignacio zu ergänzen, die Ihre Frage direkt beantwortet hat. Der "Konflikt", von dem Sie sprechen Timer0, bezieht sich auf den Vorteiler.

Zum größten Teil können Sie diese Pins (im Übrigen die Pins 5 und 6 der UNO) problemlos mit PWM verwenden und den korrekten Wert von lesen millis()(sowie die erwartete Verzögerung von erhalten delay).

Probleme treten auf, wenn Sie den Vorteiler ändern möchten (normalerweise, um die Frequenz des PWM-Signals zu ändern). Wenn Sie dies ändern, wirken Sie sich direkt auf die Berechnung und Berichterstellung millis()sowie auf die Länge von aus delay(x).

Madivad
quelle
Sie können den Prescaler Ihres Timers an den unteren Bits von Serial.println (TCCR0A, BIN) ablesen. Wenn sie '11' sind, ist Ihr Vorteiler clk / 64. Sie können dann den Faktor zum Ändern von millis () und delay () berechnen.
Dave X
Das ist ein sehr guter Punkt, und ich habe es immer vermieden, ihn zu ändern, aber es gibt keinen Grund, ob Sie wirklich wollen / müssen. Der andere Punkt ist, dass, wenn Sie es geändert haben, Sie den neuen Prescaler bereits kennen und wiederum Wrapper für millis ()oder delay ()sowieso schreiben könnten
Madivad