He estado estudiando este tema durante los últimos días, ya que tengo el mismo problema ... intentando atenuar los LED utilizando PWM de forma visiblemente lineal, pero quiero una resolución completa de 256 pasos. ¡Tratar de adivinar 256 números para crear una curva manualmente no es una tarea fácil!
No soy un matemático experto, pero sé lo suficiente como para generar algunas curvas básicas combinando algunas funciones y fórmulas sin saber realmente cómo funcionan. Me parece que al usar una hoja de cálculo (yo usé Excel) puedes jugar con un conjunto de números del 0 al 255, poner algunas fórmulas en la siguiente celda y graficarlas.
Estoy usando el ensamblador pic para hacer el desvanecimiento, por lo que incluso puedes obtener la hoja de cálculo para generar el código del ensamblador con una fórmula ( ="retlw 0x" & DEC2HEX(A2)
). Esto hace que sea muy rápido y fácil probar una nueva curva.
Después de jugar un poco con las funciones LOG y SIN, el promedio de las dos y algunas otras cosas, realmente no pude obtener la curva correcta. Lo que está sucediendo es que la parte media del desvanecimiento se produjo más lentamente que los niveles inferiores y superiores. Además, si un desvanecimiento es seguido inmediatamente por un desvanecimiento, hubo un fuerte aumento notable en la intensidad. Lo que se necesita (en mi opinión) es una curva S.
Una búsqueda rápida en Wikipedia produjo la fórmula necesaria para una curva S. Introduje esto en mi hoja de cálculo, e hice algunos ajustes para multiplicarla en mi rango de valores, y encontré esto:
Lo probé en mi plataforma y funcionó a la perfección.
La fórmula de Excel que utilicé fue esta:
=1/(1+EXP(((A2/21)-6)*-1))*255
donde A2 es el primer valor en la columna A, que aumenta A3, A4, ..., A256 para cada valor.
No tengo idea de si esto es matemáticamente correcto o no, pero produce los resultados deseados.
Aquí está el conjunto completo de 256 niveles que utilicé:
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