Ao dirigir um LED com PWM, o brilho (como eu o percebo) não aumenta linearmente com o ciclo de trabalho. O brilho é lento para aumentar, depois aumenta exponencialmente com o ciclo de trabalho.
Alguém pode sugerir uma regra prática a ser usada como fator de correção ou outra solução alternativa?
Respostas:
Para 16 níveis, é fácil fazer uma tabela de consulta simples "à mão" e converter o valor de 4 bits em um valor de 8 bits para passar para o controlador PWM: esse é o componente que eu usei no meu driver de matriz de led FPGA. Para um controlador de nível de 8 bits, você precisará de pelo menos 11 a 12 bits de saída da tabela de consulta.
fonte
1
Em teoria, deveria ser exponencial, mas tenho melhores resultados para o desbotamento usando uma função quadrática.
Eu também acho que você entendeu de trás para a frente. No ciclo de trabalho baixo, o aumento percebido no brilho é muito maior do que no ciclo de trabalho quase completo, onde o aumento no brilho é quase imperceptível.
fonte
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:
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:
fonte
Eu encontrei esse cara que usa um método que ele chama de "Anti-Log Drive". Aqui está o link de download direto para suas informações.
fonte
Eu estava usando um ATtiny para iluminar meu deck. O brilho é controlado usando um pote conectado ao pino ADC.
Tentei a função exponencial e a saída PWM com base nisso parece estar dando um aumento linear no brilho percebido.
Eu estava usando estas fórmulas:
Attiny85 @ 8MHz estava demorando cerca de 210us para executar o cálculo acima. Para melhorar o desempenho, fez uma tabela de pesquisa. Como a entrada era do ADC de 10 bits e a memória ATtiny é limitada, eu também queria criar uma tabela mais curta.
Em vez de criar tabela de pesquisa com 1024 entradas, crie uma tabela de pesquisa inversa com 256 entradas (512 bytes) na memória do programa (PGMEM). Uma função foi escrita para executar a pesquisa binária nessa tabela. Este método leva apenas 28uS para cada pesquisa. Se eu usar uma tabela de pesquisa direta, isso exigiria 2kb de memória, mas a pesquisa levaria apenas 4uS ou mais.
Os valores calculados na tabela de pesquisa usam apenas a faixa de entrada 32-991, descartando a faixa inferior / superior do ADC, caso haja algum problema com o circuito.
Abaixo está o que eu tenho agora.
fonte
This PDF explains the curve needed, apparently a logarithmic one. If you have a linear dimmer (your PWM value) then the function should be logarithmic.
Here you can find a lookup table for 32 steps of brightness for 8 bit PWM.
Here for 16 steps.
fonte
Here is what I have done based on that arduino forum response. I have computed the values from 0 to 255 so it's easy to use with pwm on arduino
Then to use on Arduino just do like that :
Hope it is helpfull for some people ;)
fonte
I'm dealing with this now, and I'm taking a slightly different approach. I want 256 levels of brightness, but mapping a linear 0-255 range to a non-linear 0-255 range winds up, as you can see in some of the other answers, with a lot of duplicate entries. (I.e., several of your input values result in the same brightness level.)
I tried modifying the algorithm to map a 0-256 input range to a 0-1023 output range, but even that had several values mapping to 0. So I'm trying something a bit different - I'm using the 0-255 level to generate non-linear values in the range 0-769 (that's 1023 minus 255) using
sin()
, then add that to the input level to get an output in the range 0-1023 with no duplicates. I'll configure a timer to use a counter of 1023, and set the comparator for the PWM output to values from the lookup table based on what lighting level I want (0-255).Here's the C program I used to generate my lookup table:
And here's the table:
I'll probably investigate other functions (like
log()
) once I've got this up and running.fonte
For me this law seem to work pretty good: http://www.pyroelectro.com/tutorials/fading_led_pwm/theory2.html
fonte