Tak czy siak wracając do PWMa.
Przy LEDach dobrze sobie wybrać jakąś większą częstotliwość 200-300Hz da to dobrą jasność świecenia, a i spory margines w 1s na zmiany wypełnienia, jeżeli mają następować szybko.
Sterownie PWM przykład.
Po wgraniu do sterownika powinno to działać, ale trzeba by dodać podgląd zmiennych DW na ekranie i wywalić trochę nieszczęsny M0 (ENABLE). Trochę się zagalopowałem


Działanie.
Mam dwa przyciski SET (ustaw) na wej. I0 i DIR (kierunek) na wej. I1.
Jest też znacznik M01 - ENABLE (Aktywój) który za pomocą bramki AND (B0005) pozwala włączyć/wyłączyć PWMa.
Bloczek B0000 to dwukierunkowy licznik ustawiony na liczenie do 100. Jak chcesz aby jego wartość była zapamiętywana po wyłączeniu zasilania, co było by wskazane to w jego opcjach trzeba odhaczyć ptaszkiem [√] opcję Retentivity (podtrzymywany).
I teraz zaczyna cała filozofia sterowania PWMem, a właściwie czymkolwiek bo PTO i każdym innym mechanizmem sterowanym wartością w sterowniku także.
Licznik B000 ustala i przechowuje nam wartość dla bloku PWM, ale my musimy tą wartość ustalić (móc zmieniać) i przepisać w odpowiednim momencie z licznika do PWMa. Jak to zrobić ?
Najprostszym sposobem jest skorzystanie z mechanizmu podobnego do DDR. Tak tego samego co jest w kościach RAM.
Otóż na zboczu narastającym sygnału SET zwiększamy/zmniejszamy w zależności od stanu przerzutnika DIR (bloczek B0006) wartość licznika B0000, a na zboczu opadającym sygnału SET które wykrywa bramka NAND zbocze opadające bloczek B0001 przesyłamy za pomocą funkcji MOVE (B0002) wartość licznika DW0 do rejestru wartości zadanej PWM DW1.
UWAGA !! Bloczek MOVE można użyć do zadeklarowania stałych w programie, ponieważ może one przesyłać wartość stałą.
Wyjaśnienia wymaga jeszcze magiczna bramka XOR (B0004).
Działa ona tutaj jako Inwertor sterowny impulsem z bramki NAND, co powoduje wygenerowanie krótkiego impulsu, który ładuje nową wartość do bloku PWM.
Sytuację w obu stanach wejścia SET obrazują oba screny poniżej. Na screnie APB_PWM1 widać wyraźnie że licznik ma już nową wartość czyli 4, ale w rejestrze DW1 nadal jest jeszcze poprzednia czyli 3. Dopiero puszczeni przycisku SET powoduje wpisanie nowej wartości do PWMa (scr. APB_PWM2).
Taki mechanizm ma dwie zalety.
1. Mamy pełną kontrolę kiedy i co wpisujemy do danego bloku.
2. Nie ma możliwości wpisania wartości przypadkowej z licznika, bo ta najpierw musi sie ustalić.
Czy da się to zrobić inaczej ? Oczywiście że da na potencjometrze, na Enkoderze z przyciskiem (fajny bajer, szczególnie jak przycisk jest jeszcze podświetlany). Trzeba tylko mieć dobry pomysł i wiedzieć jak ?


Kilka uwag co do twojego programu.
1. Strasznie chaotycznie narysowany schemat co utrudnia jego czytanie. Nikt poza toba z tego się nie rozczyta

2. Nie wiem czy czytałeś polski HELP do APB, ale użyłeś niemożliwie dużej ilości znaczników M.
I tu praktyczne wskazówki.
Znaczniki M0-M63 oraz rejestry DW0-DW12 są remamentne, czy pamiętane po zaniku zasilania. Warto o tym pamiętać pisząc program.
Szybkie bloki sterownika jak szybkie liczniki, PWM, PTO korzystają z pewnych wejść (I4 do I7) oraz wyjść (Q2,Q3) sprzętowych sterownika, więc warto sobie ich nie po blokować jakimiś błahymi funkcjami typu START/STOP, czy włącz żarówkę. Ogólnie na etapie tworzenia części sprzętowej trzeba już myśleć co chcemy w programie, i co do czego potrzebujemy.
Pisząc program też jest dobrze pisać go w odpowiedniej kolejności i dzielić sobie na logiczne bloki (funkcje), aby potem nie mieć pajęczyny.