Tôi đã tìm hiểu về chủ đề này trong vài ngày qua vì tôi có cùng một vấn đề ... cố gắng làm mờ đèn LED bằng cách sử dụng PWM theo cách tuyến tính rõ ràng, nhưng tôi muốn độ phân giải 256 bước đầy đủ. Cố gắng đoán 256 số để tự tạo đường cong không phải là một nhiệm vụ dễ dàng!
Tôi không phải là một nhà toán học chuyên gia, nhưng tôi biết đủ để tạo ra một số đường cong cơ bản bằng cách kết hợp một vài hàm và công thức mà không thực sự biết chúng hoạt động như thế nào. Tôi thấy rằng bằng cách sử dụng bảng tính (tôi đã sử dụng Excel), bạn có thể chơi xung quanh với một bộ số từ 0 đến 255, đặt một vài công thức vào ô tiếp theo và vẽ biểu đồ cho chúng.
Tôi đang sử dụng trình biên dịch pic để làm mờ dần và do đó, bạn thậm chí có thể lấy bảng tính để tạo mã trình biên dịch với công thức ( ="retlw 0x" & DEC2HEX(A2)
). Điều này làm cho nó rất nhanh chóng và dễ dàng để thử một đường cong mới.
Sau một chút chơi xung quanh với các hàm LOG và SIN, trung bình của cả hai và một vài thứ khác, tôi thực sự không thể có được đường cong phù hợp. Điều đang xảy ra là phần giữa của sự mờ dần diễn ra chậm hơn so với các cấp thấp hơn và cao hơn. Ngoài ra, nếu một sự mờ dần ngay lập tức theo sau một sự mờ dần, có một sự tăng đột biến rõ rệt về cường độ. Những gì cần thiết (theo tôi) là một đường cong S.
Một tìm kiếm nhanh trên Wikipedia đã đưa ra công thức cần thiết cho một đường cong S. Tôi đã cắm nó vào bảng tính của mình và thực hiện một vài điều chỉnh để làm cho nó nhân lên trên phạm vi giá trị của tôi và đưa ra điều này:
Tôi đã thử nó trên giàn khoan của tôi, và nó hoạt động rất đẹp.
Công thức Excel tôi đã sử dụng là:
=1/(1+EXP(((A2/21)-6)*-1))*255
Trong đó A2 là giá trị đầu tiên trong cột A, làm tăng A3, A4, ..., A256 cho mỗi giá trị.
Tôi không biết điều này có đúng về mặt toán học hay không, nhưng nó tạo ra kết quả mong muốn.
Dưới đây là bộ 256 cấp độ đầy đủ mà tôi đã sử dụng:
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