Podczas jazdy diodą LED z PWM jasność (tak jak ją postrzegam) nie zmienia się liniowo wraz z cyklem roboczym. Jasność powoli rośnie, a następnie rośnie wykładniczo wraz z cyklem roboczym.
Czy ktoś może zasugerować ogólną zasadę jako czynnik korygujący lub inne obejście?
Odpowiedzi:
Dla 16 poziomów łatwo jest zrobić „ręcznie” tablicę przeglądową i przekonwertować 4-bitową wartość na 8-bitową, aby przekazać ją do kontrolera PWM: jest to komponent, którego użyłem w moim sterowniku tablicy LED FPGA. W przypadku 8-bitowego kontrolera poziomu potrzebujesz co najmniej 11-12 bitów z tabeli przeglądowej.
źródło
1
Teoretycznie powinno to być wykładnicze, ale mam najlepsze wyniki dla zanikania za pomocą funkcji kwadratowej.
Myślę też, że masz to wstecz. W niskim cyklu pracy zauważalny wzrost jasności jest znacznie większy niż w prawie pełnym cyklu pracy, w którym wzrost jasności jest prawie nie do pomyślenia.
źródło
W ciągu ostatnich kilku dni przyglądałem się temu tematowi, ponieważ mam ten sam problem ... próbuję przyciemnić diody LED za pomocą PWM w sposób wyraźnie liniowy, ale chcę mieć rozdzielczość 256 kroków. Próba odgadnięcia 256 liczb w celu ręcznego utworzenia krzywej nie jest łatwym zadaniem!
Nie jestem matematykiem-ekspertem, ale wiem wystarczająco dużo, aby wygenerować podstawowe krzywe, łącząc kilka funkcji i formuł, nie wiedząc, jak działają. Uważam, że korzystając z arkusza kalkulacyjnego (korzystałem z programu Excel) możesz bawić się zestawem liczb od 0 do 255, wstawiać kilka formuł w następnej komórce i rysować je.
Używam Pic Asemblera do zanikania, więc możesz nawet pobrać arkusz kalkulacyjny do wygenerowania kodu asemblera za pomocą formuły (
="retlw 0x" & DEC2HEX(A2)
). Dzięki temu wypróbowanie nowej krzywej jest bardzo szybkie i łatwe.Po odrobinie zabawy z funkcjami LOG i SIN, średnią z dwóch i kilku innych rzeczy, nie mogłem naprawdę uzyskać właściwej krzywej. To, co się dzieje, to fakt, że środkowa część przenikania zachodziła wolniej niż niższy i wyższy poziom. Ponadto, jeśli natychmiast po zanikaniu następuje zanikanie, nastąpił wyraźny skok intensywności. Moim zdaniem potrzebna jest krzywa S.
Szybkie wyszukiwanie w Wikipedii przyniosło wzór potrzebny na krzywą S. Podłączyłem to do arkusza kalkulacyjnego i wprowadziłem kilka zmian, aby pomnożyć go w całym zakresie wartości, i wymyśliłem:
Przetestowałem to na moim urządzeniu i działało pięknie.
Użyłem formuły Excel:
gdzie A2 jest pierwszą wartością w kolumnie A, która zwiększa A3, A4, ..., A256 dla każdej wartości.
Nie mam pojęcia, czy jest to poprawne matematycznie, czy nie, ale przynosi pożądane rezultaty.
Oto pełny zestaw 256 poziomów, których użyłem:
źródło
Znalazłem tego faceta, który używa metody, którą nazywa „Anti-Log Drive”. Oto bezpośredni link do pobrania jego informacji.
źródło
Użyłem ATtiny do oświetlenia mojej talii. Jasność jest kontrolowana za pomocą naczynia podłączonego do pinu ADC.
Wypróbowana funkcja wykładnicza i oparty na niej wynik PWM wydają się liniowo zwiększać postrzeganą jasność.
Korzystałem z tych wzorów:
Attiny85 @ 8MHz wykonało powyższe obliczenia około 210us. Aby poprawić wydajność, utworzono tabelę odnośników. Ponieważ dane wejściowe pochodziły z 10-bitowego ADC, a pamięć ATtiny jest ograniczona, chciałem również stworzyć krótszą tabelę.
Zamiast tworzyć tabelę wyszukiwania z 1024 pozycjami, utworzono tabelę wyszukiwania wstecznego z 256 pozycjami (512 bajtów) w pamięci programu (PGMEM). Została napisana funkcja do wykonywania wyszukiwania binarnego na tej tabeli. Ta metoda wymaga tylko 28uS dla każdego wyszukiwania. Jeśli użyję tabeli bezpośredniego wyszukiwania, wymagałoby to pamięci 2kb, ale wyszukiwanie zajmie tylko około 4uS.
Obliczone wartości w tabeli odnośników wykorzystują tylko zakres wejściowy 32-991, odrzucając dolny / górny zakres ADC, w przypadku problemów z obwodem.
Poniżej mam to, co mam teraz.
źródło
Ten plik PDF wyjaśnia wymaganą krzywą, najwyraźniej logarytmiczną. Jeśli masz ściemniacz liniowy (twoja wartość PWM), to funkcja powinna być logarytmiczna.
Tutaj możesz znaleźć tabelę przeglądową dla 32 kroków jasności dla 8 bitów PWM.
Tutaj 16 kroków.
źródło
Oto, co zrobiłem w oparciu o odpowiedź forum arduino . Obliczyłem wartości od 0 do 255, więc jest łatwy w użyciu z pwm na arduino
Aby skorzystać z Arduino, po prostu zrób tak:
Mam nadzieję, że jest to pomocne dla niektórych osób;)
źródło
Radzę sobie z tym teraz i podchodzę nieco inaczej. Chcę 256 poziomów jasności, ale mapowanie liniowego zakresu 0-255 na nieliniowy zakres 0-255 kończy się, jak widać w niektórych innych odpowiedziach, z wieloma zduplikowanymi wpisami. (Tzn. Kilka wartości wejściowych powoduje ten sam poziom jasności).
Próbowałem zmodyfikować algorytm, aby odwzorować zakres wejściowy 0–256 na zakres wyjściowy 0–1023, ale nawet to miało kilka wartości odwzorowujących na 0. Więc próbuję czegoś nieco innego - używam poziomu 0–255 aby wygenerować wartości nieliniowe w zakresie 0-769 (to jest 1023 minus 255) za pomocą
sin()
, a następnie dodać to do poziomu wejściowego, aby uzyskać wynik w zakresie 0-1023 bez duplikatów. Skonfiguruję licznik, aby używał licznika 1023, i ustawię komparator dla wyjścia PWM na wartości z tabeli odnośników w zależności od tego, jaki poziom oświetlenia chcę (0–255).Oto program C, którego użyłem do wygenerowania mojej tabeli odnośników:
A oto tabela:
Prawdopodobnie zbadam inne funkcje (jak
log()
), kiedy już to uruchomię.źródło
Dla mnie to prawo wydaje się działać całkiem nieźle: http://www.pyroelectro.com/tutorials/fading_led_pwm/theory2.html
źródło