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:
=1/(1+EXP(((A2/21)-6)*-1))*255
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:
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