Eu estive estudando esse assunto nos últimos dias, pois tenho o mesmo problema ... tentando escurecer os LEDs usando o PWM de uma maneira visivelmente linear, mas quero uma resolução completa de 256 etapas. Tentar adivinhar 256 números para criar manualmente uma curva não é uma tarefa fácil!
Não sou um matemático experiente, mas sei o suficiente para gerar algumas curvas básicas combinando algumas funções e fórmulas sem realmente saber como elas funcionam. Acho que, usando uma planilha (usei o Excel), você pode brincar com um conjunto de números de 0 a 255, colocar algumas fórmulas na próxima célula e fazer um gráfico delas.
Estou usando o pic assembler para fazer o desbotamento e, assim, você pode obter a planilha para gerar o código do assembler com uma fórmula (="retlw 0x" & DEC2HEX(A2)
). Isso torna muito rápido e fácil experimentar uma nova curva.
Depois de brincar um pouco com as funções LOG e SIN, a média das duas e algumas outras coisas, eu não conseguia realmente obter a curva certa. O que está acontecendo é que a parte do meio do desbotamento estava acontecendo mais lentamente que os níveis mais baixo e mais alto. Além disso, se um desbotamento for seguido imediatamente por um desbotamento, haverá um aumento acentuado na intensidade. O que é necessário (na minha opinião) é uma curva S.
Uma pesquisa rápida na Wikipedia surgiu com a fórmula necessária para uma curva S. Conectei isso à minha planilha e fiz alguns ajustes para que ele se multiplicasse em meu intervalo de valores e criei o seguinte:
Testei no meu equipamento e funcionou lindamente.
A fórmula do Excel que usei foi esta:
=1/(1+EXP(((A2/21)-6)*-1))*255
onde A2 é o primeiro valor na coluna A, que aumenta A3, A4, ..., A256 para cada valor.
Não tenho ideia se isso é matematicamente correto ou não, mas produz os resultados desejados.
Aqui está o conjunto completo de 256 níveis que eu usei:
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