Apakah millis () bertentangan dengan pin PWM yang terkait dengan timer 0?

9

Saya pernah membaca bahwa millis()fungsinya menggunakan timer yang sama dengan beberapa pin PWM.

Jika Anda menggunakan pin PWM itu, apakah millis()masih akan mengembalikan nilai yang benar?

Aurast
sumber

Jawaban:

6

Mereka tidak bertentangan karena millis()secara ketat membaca nilai langsung di mana TCNT0PWM melalui timer 0 menggunakan kemampuan perangkat keras untuk membandingkan nilai TCNT0dengan nilai-nilai OCR0xtanpa mempengaruhi nilai dari mereka.

Ignacio Vazquez-Abrams
sumber
millis()hanya menggunakan Timer 0 jumlah limpahan. micros()membaca nilai langsung di TCNT0.
Nick Gammon
5

Hanya dengan menambahkan jawaban @ Ignacio yang langsung menjawab pertanyaan Anda. "Konflik" yang Anda bicarakan terkait dengan Timer0prescaler.

Untuk sebagian besar, Anda dapat menggunakan pin tersebut (kebetulan pin 5 dan 6 pada UNO) dengan PWM tanpa masalah, dan membaca nilai yang benar dari millis()(serta mendapatkan penundaan yang diharapkan dari delay)

Di mana Anda mengalami masalah adalah jika Anda ingin mengubah prescaler (biasanya untuk mengubah frekuensi sinyal PWM). Jika Anda mengubah ini, maka Anda secara langsung mempengaruhi perhitungan dan pelaporan millis()dan panjangnya delay(x).

Madivad
sumber
Anda dapat membaca prescaler timer Anda dengan bit bawah Serial.println (TCCR0A, BIN); Jika mereka '11' maka prescaler Anda adalah clk / 64. Anda kemudian dapat menghitung faktor untuk memodifikasi millis () dan delay ().
Dave X
Itu poin yang sangat bagus dan saya selalu menghindari mengubahnya, tetapi tidak ada alasan jika Anda benar-benar ingin / perlu. Poin lainnya adalah bahwa jika Anda telah memodifikasinya Anda sudah tahu prescaler baru dan pada gilirannya bisa menulis pembungkus untuk millis ()atau delay ()tetap
Madivad