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:
=1/(1+EXP(((A2/21)-6)*-1))*255
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:
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0A, 0x0A, 0x0B, 0x0B,
0x0C, 0x0C, 0x0D, 0x0D, 0x0E, 0x0F, 0x0F, 0x10, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1F, 0x20, 0x21, 0x23, 0x24, 0x26, 0x27, 0x29, 0x2B, 0x2C,
0x2E, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3A, 0x3C, 0x3E, 0x40, 0x43, 0x45, 0x47, 0x4A, 0x4C, 0x4F,
0x51, 0x54, 0x57, 0x59, 0x5C, 0x5F, 0x62, 0x64, 0x67, 0x6A, 0x6D, 0x70, 0x73, 0x76, 0x79, 0x7C,
0x7F, 0x82, 0x85, 0x88, 0x8B, 0x8E, 0x91, 0x94, 0x97, 0x9A, 0x9C, 0x9F, 0xA2, 0xA5, 0xA7, 0xAA,
0xAD, 0xAF, 0xB2, 0xB4, 0xB7, 0xB9, 0xBB, 0xBE, 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE,
0xD0, 0xD2, 0xD3, 0xD5, 0xD7, 0xD8, 0xDA, 0xDB, 0xDD, 0xDE, 0xDF, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5,
0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xED, 0xEE, 0xEF, 0xEF, 0xF0, 0xF1, 0xF1, 0xF2,
0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF6, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8,
0xF9, 0xF9, 0xF9, 0xF9, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFC,
0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF