Saat ini saya dapat mengatur empat pin PWM menjadi sekitar 31 kHz dengan kode berikut:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
Saya menemukan pengaturan ini di suatu tempat, tetapi saya tidak tahu bagaimana saya dapat mengatur empat pin PWM ini menjadi sekitar 25 kHz. Bagaimana mungkin?
Jawaban:
Saya memposting jawaban kedua ini karena saya menyadari mungkin untuk memiliki 4 saluran PWM pada 25 kHz dengan 161 langkah pada satu Arduino Uno. Ini melibatkan mengubah frekuensi clock utama ke 8 MHz , yang memiliki beberapa efek samping karena seluruh program akan berjalan setengah lebih cepat. Hal ini juga melibatkan konfigurasi ulang tiga timer, yang berarti kehilangan Arduino waktu fungsi (
millis()
,micros()
,delay()
dandelayMicroseconds()
). Jika pertukaran ini dapat diterima, berikut adalah caranya:Tidak seperti jawaban yang lain , ini tidak memerlukan versi modifikasi
analogWrite()
: yang standar akan berfungsi dengan baik. Hanya harus diperhatikan bahwa:analogWrite()
pin 6 atau 11 tidak hanya akan gagal memberikan output PWM, itu juga akan mengubah frekuensi masing-masing pada pin 5 atau 3.sumber
Anda dapat mengkonfigurasi Timer 1 untuk siklus pada 25 kHz dalam mode PWM fase yang benar, dan menggunakannya dua output pada pin 9 dan 10 seperti:
Menulis nilai 0 dengan
analogWrite25k()
berarti pin akan selalu RENDAH, sedangkan 320 berarti selalu TINGGI. BiasaanalogWrite()
harus hampir bekerja, tetapi itu akan menafsirkan 255 sama dengan 320 (yaitu selalu TINGGI).Kode ini mengasumsikan Arduino Uno atau papan serupa (ATmega168 atau 328 @ 16 MHz). Metode yang digunakan di sini memerlukan timer 16-bit, dan karenanya menggunakan Timer 1 karena itu hanya satu-satunya yang tersedia di Uno; itu sebabnya hanya dua output yang tersedia. Metode ini dapat disesuaikan dengan papan berbasis AVR lainnya dengan timer 16-bit. Seperti yang dicatat Gerben, timer itu harus memiliki register ICRx yang sesuai. Ada 4 timer seperti itu di Arduino Mega, masing-masing dengan 3 output.
sumber
ICRx
register. Paling banyak, Anda hanya dapat memiliki satu pin PWM per timer, untuk timer 0 dan 2.COM4C1
diTCCR4A
? 2. Jika bukan itu masalahnya, maka baca Bagaimana cara saya mengajukan pertanyaan yang bagus? , kemudian perbarui pertanyaan Anda dengan memasukkan kode sumber lengkap Anda dan dengan jelas menyatakan apa yang Anda harapkan untuk dilakukan oleh program dan apa yang dilakukannya (“Saya tidak melihat keberhasilan apa pun” tidak dianggap sebagai pernyataan masalah yang valid).