Son birkaç gündür bu konuya bakıyordum çünkü aynı problemim var ... PWM kullanarak LED'leri görünür şekilde doğrusal bir şekilde azaltmaya çalışıyorum ama 256 adımlık tam çözünürlük istiyorum. El ile bir eğri oluşturmak için 256 sayı tahmin etmeye çalışmak kolay bir iş değil!
Uzman bir matematikçi değilim, ancak gerçekten nasıl çalıştıklarını bilmeden birkaç işlevi ve formülü birleştirerek bazı temel eğriler oluşturacak kadar bilgim var. Bir elektronik tablo kullanarak (Excel kullandım) 0 ile 255 arasında bir sayı kümesiyle oynayabilir, bir sonraki hücreye birkaç formül koyabilir ve bunları grafik haline getirebilirim.
Solma yapmak için pic assembler kullanıyorum ve böylece bir formül ( ="retlw 0x" & DEC2HEX(A2)
) ile assembler kodunu oluşturmak için elektronik tabloyu bile alabilirsiniz . Bu, yeni bir eğri denemeyi çok hızlı ve kolaydır.
LOG ve SIN işlevleriyle biraz uğraştıktan sonra, ikisinin ortalaması ve diğer bazı şeylerden sonra doğru eğriyi alamadım. Olan şey, solgunluğun orta kısmının daha düşük ve daha yüksek seviyelerden daha yavaş gerçekleşmesiydi. Ayrıca, hemen solmaya bir solmanın ardından solmaya bağlı olarak, yoğunlukta keskin bir şekilde gözle görülür bir yükselme oldu. Gerekli olan (benim görüşüme göre) bir S eğrisi.
Vikipedi'de hızlı bir arama, bir S eğrisi için gereken formülü buldu. Bunu elektronik tabloma ekledim ve değer aralığımla çarpmak için birkaç ayar yaptım ve şunu gördüm:
Teçhizatımda test ettim ve çok iyi çalıştı.
Kullandığım Excel formülü şuydu:
=1/(1+EXP(((A2/21)-6)*-1))*255
buradaki A2, her değer için A3, A4, ..., A256'yı artıran A sütunundaki ilk değerdir.
Bunun matematiksel olarak doğru olup olmadığı hakkında hiçbir fikrim yok, ancak istenen sonuçları veriyor.
İşte kullandığım 256 seviye kümesi:
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