Saat mengendarai LED dengan PWM, kecerahan (seperti yang saya pahami) tidak berskala linier dengan siklus kerja. Kecerahan lambat untuk meningkat, kemudian meningkat secara eksponensial dengan siklus tugas.
Adakah yang bisa menyarankan aturan praktis untuk digunakan sebagai faktor koreksi, atau solusi lain?
Jawaban:
Untuk 16 level, mudah untuk membuat tabel pencarian sederhana "dengan tangan" dan mengonversi nilai 4 bit menjadi nilai 8 bit untuk diteruskan ke pengontrol PWM: ini adalah komponen yang saya gunakan dalam driver array yang dipimpin FPGA. Untuk pengontrol level 8 bit, Anda membutuhkan setidaknya 11-12 bit output dari tabel pencarian.
sumber
1
Secara teori itu harus eksponensial, tapi saya punya hasil terbaik untuk memudar dengan menggunakan fungsi kuadratik.
Saya juga berpikir Anda mendapatkannya mundur. Pada siklus rendah, peningkatan kecerahan yang dirasakan jauh lebih besar daripada pada siklus hampir penuh, di mana peningkatan kecerahan hampir tidak dapat digerakkan.
sumber
Saya telah melihat ke dalam subjek ini selama beberapa hari terakhir karena saya memiliki masalah yang sama ... mencoba meredupkan LED menggunakan PWM dalam cara yang terlihat linier, tapi saya ingin resolusi penuh 256 langkah. Mencoba menebak 256 angka untuk membuat kurva secara manual bukanlah tugas yang mudah!
Saya bukan ahli matematika, tapi saya cukup tahu untuk menghasilkan beberapa kurva dasar dengan menggabungkan beberapa fungsi dan formula tanpa benar-benar tahu cara kerjanya. Saya menemukan bahwa menggunakan spreadsheet (saya menggunakan Excel) Anda bisa bermain-main dengan satu set angka dari 0 hingga 255, meletakkan beberapa rumus di sel berikutnya, dan grafik mereka.
Saya menggunakan assembler pic untuk melakukan fading, dan Anda bahkan bisa mendapatkan spreadsheet untuk menghasilkan kode assembler dengan formula (
="retlw 0x" & DEC2HEX(A2)
). Ini membuatnya sangat cepat dan mudah untuk mencoba kurva baru.Setelah sedikit bermain-main dengan fungsi LOG dan SIN, rata-rata keduanya, dan beberapa hal lainnya, saya tidak bisa benar-benar mendapatkan kurva yang tepat. Apa yang terjadi adalah bahwa bagian tengah fade terjadi lebih lambat daripada level yang lebih rendah dan lebih tinggi. Juga, jika fade-up segera diikuti oleh fade-down ada lonjakan tajam yang terlihat dalam intensitas. Apa yang dibutuhkan (menurut saya) adalah kurva S.
Pencarian cepat di Wikipedia muncul dengan rumus yang diperlukan untuk kurva S. Saya menyambungkan ini ke spreadsheet saya, dan membuat beberapa penyesuaian untuk membuatnya melipatgandakan rentang nilai saya, dan muncul dengan ini:
Saya mengujinya di rig saya, dan itu bekerja dengan indah.
Rumus Excel yang saya gunakan adalah ini:
di mana A2 adalah nilai pertama dalam kolom A, yang meningkatkan A3, A4, ..., A256 untuk setiap nilai.
Saya tidak tahu apakah ini benar secara matematis atau tidak, tetapi menghasilkan hasil yang diinginkan.
Berikut adalah set lengkap 256 level yang saya gunakan:
sumber
Saya menemukan orang ini yang menggunakan metode yang ia sebut "Anti-Log Drive". Berikut ini tautan unduhan langsung untuk infonya.
sumber
Saya menggunakan ATtiny untuk menyalakan dek saya. Kecerahan dikontrol menggunakan pot yang terhubung ke pin ADC.
Mencoba fungsi eksponensial dan output PWM berdasarkan yang tampaknya memberikan peningkatan linear dalam kecerahan yang dirasakan.
Saya menggunakan rumus ini:
Attiny85 @ 8MHz membutuhkan sekitar 210us untuk melakukan perhitungan di atas. Untuk meningkatkan kinerja, buat tabel pencarian. Karena input dari ADC 10-bit dan memori ATtiny terbatas, saya ingin membuat tabel yang lebih pendek juga.
Alih-alih membuat tabel pencarian dengan 1024 entri, buat tabel pencarian terbalik dengan 256 entri (512 byte) dalam memori program (PGMEM). Fungsi ditulis untuk melakukan pencarian biner pada tabel itu. Metode ini hanya membutuhkan 28uS untuk setiap pencarian. Jika saya menggunakan tabel pencarian langsung, itu akan membutuhkan memori 2kb, tetapi pencarian hanya membutuhkan sekitar 4uS.
Nilai yang dihitung dalam tabel pencarian hanya menggunakan rentang input 32-991, membuang kisaran ADC yang lebih rendah / atas, jika ada masalah dengan rangkaian.
Di bawah ini yang saya miliki sekarang.
sumber
PDF ini menjelaskan kurva yang diperlukan, tampaknya yang logaritmik. Jika Anda memiliki linear dimmer (nilai PWM Anda) maka fungsinya harus logaritmik.
Di sini Anda dapat menemukan tabel pencarian untuk 32 langkah kecerahan untuk 8 bit PWM.
Di sini untuk 16 langkah.
sumber
Inilah yang saya lakukan berdasarkan respon forum arduino . Saya telah menghitung nilai dari 0 hingga 255 sehingga mudah digunakan dengan PWM di Arduino
Kemudian untuk digunakan pada Arduino lakukan saja seperti itu:
Semoga bermanfaat bagi sebagian orang;)
sumber
Saya berurusan dengan ini sekarang, dan saya mengambil pendekatan yang sedikit berbeda. Saya ingin 256 tingkat kecerahan, tetapi memetakan rentang 0-255 linier ke rentang 0-255 non-linear berakhir, seperti yang dapat Anda lihat di beberapa jawaban lain, dengan banyak entri duplikat. (Yaitu, beberapa nilai input Anda menghasilkan tingkat kecerahan yang sama.)
Saya mencoba memodifikasi algoritme untuk memetakan rentang input 0-256 ke rentang output 0-1023, tetapi bahkan memiliki beberapa pemetaan nilai hingga 0. Jadi saya mencoba sesuatu yang sedikit berbeda - Saya menggunakan level 0-255 untuk menghasilkan nilai non-linear dalam rentang 0-769 (yaitu 1023 minus 255) menggunakan
sin()
, kemudian tambahkan itu ke level input untuk mendapatkan output dalam kisaran 0-1023 tanpa duplikat. Saya akan mengkonfigurasi timer untuk menggunakan penghitung 1023, dan mengatur komparator untuk output PWM ke nilai dari tabel pencarian berdasarkan tingkat pencahayaan apa yang saya inginkan (0-255).Inilah program C yang saya gunakan untuk menghasilkan tabel pencarian saya:
Dan inilah tabelnya:
Saya mungkin akan menyelidiki fungsi-fungsi lain (seperti
log()
) setelah saya menjalankan dan menjalankannya.sumber
Bagi saya undang-undang ini tampaknya bekerja dengan cukup baik: http://www.pyroelectro.com/tutorials/fading_led_pwm/theory2.html
sumber