Ho esaminato questo argomento negli ultimi giorni perché ho lo stesso problema ... cercando di attenuare i LED usando PWM in modo visibilmente lineare, ma voglio una risoluzione completa di 256 passi. Cercare di indovinare 256 numeri per creare manualmente una curva non è un compito facile!
Non sono un matematico esperto, ma conosco abbastanza per generare alcune curve di base combinando alcune funzioni e formule senza sapere davvero come funzionano. Trovo che usando un foglio di calcolo (ho usato Excel) puoi giocare con un set di numeri da 0 a 255, inserire alcune formule nella cella successiva e rappresentarle graficamente.
Sto usando pic assemblatore per eseguire lo sbiadimento, quindi puoi persino ottenere il foglio di calcolo per generare il codice dell'assemblatore con una formula ( ="retlw 0x" & DEC2HEX(A2)
). Questo rende molto semplice e veloce provare una nuova curva.
Dopo aver giocato un po 'con le funzioni LOG e SIN, la media delle due e poche altre cose, non sono riuscito a ottenere la curva giusta. Quello che sta succedendo è che la parte centrale della dissolvenza stava avvenendo più lentamente dei livelli più bassi e più alti. Inoltre, se una dissolvenza è immediatamente seguita da una dissolvenza verso il basso, si è verificato un forte picco evidente nell'intensità. Ciò che è necessario (secondo me) è una curva a S.
Una rapida ricerca su Wikipedia ha prodotto la formula necessaria per una curva a S. Ho inserito questo nel mio foglio di calcolo e ho apportato alcune modifiche per farlo moltiplicare per la mia gamma di valori, e ho trovato questo:
L'ho provato sul mio impianto di perforazione e ha funzionato magnificamente.
La formula di Excel che ho usato era questa:
=1/(1+EXP(((A2/21)-6)*-1))*255
dove A2 è il primo valore nella colonna A, che aumenta A3, A4, ..., A256 per ciascun valore.
Non ho idea se questo sia matematicamente corretto o meno, ma produce i risultati desiderati.
Ecco il set completo di 256 livelli che ho usato:
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