• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
PWM - Sygnały przesunięte w fazie
#10
(19-07-2018, 03:30)kaczakat napisał(a): Może jeszcze sprawdzę czy można zmniejszyć preskaler z 8, ale to i tak nie trafi w 20kHz, jak nawet zadziała to wyjdzie koło 30kHz.

Można dość dokładnie uzyskać 20kHz. Wystarczy wybrać tryb timera, w którym przeładowanie następuje nie przy wartości TOP a jest określane przez rejestr, OCRxA.
Proste?

(19-07-2018, 03:30)kaczakat napisał(a): wymyśli coś w assemblerze, C lub jadąc po rejestrach.
ASM do tak banalnej sprawy?
Ponadto, łącząc program C z ASM trzeba wiedzieć jak poinformować kompilator o tym, jakie się rejestry użyło, do woli można bowiem używac tylko R0 i R1. Trzeba wiedzieć jak C przekazuje parametry do funkcji, jak je zwracać. Jak używać zmiennych z C w ASM. Jak nie musze to w takie rzeczy się nie bawiem, bo to strata czasu, aby zapisać dwa rejestry timera w ASM.
Do tego wystarczy C, bo co niby zyskam używając Asm? Szybkość kodu? Nie! Oszczędność pamięci? Nie! Komplikację programu, dłuższy czas jego pisania/uruchamiania? TAAAAAAK.

Biblioteki Arduino nie sa przygotowane do wszystkiego. Trzeba wziąć notę katalogową uC i zrobić co trzeba na rejestrach. Można też szukać (pewnie baaaaardo długo) kodu napisanego przez kogoś innego, który realizuje wymaganą funkcjonalność.

Zanim zabierze się za robotę nad samodzielnym napisaniem kodu trzeba pamiętać o:
- Czasie wejścia w przerwanie (czas reakcji sprzętu i czas odłożenia rejestrów na stosie). Robiąc wstawki ASM i korzystając z ISR_NAKED można zejść poniżej 1us, bez tego, może być różnie, nawet do 3us. Do tych 3us trzeba doliczyć czas realizacji algorytmu w przerwaniu, który ustawi GPIO. W 15us to raczej na pewno da się wyrobić a myślę, że będzie poniżej 5us. Trzeba się więc liczyć z jtter-em na takim poziomie o ile nie przeszkodzą inne przerwania! AVR nie ma priorytetowego systemu przerwań, więc ów jtter będzie większy. w AVR problemem są przerwania odbiorcze od USART, których nie można zadeklarować jako nie blokowalne (ISR_NOBLOKC czy INTERRUPT). W ich przypadku trzeba się namęczyć aby zezwolić na przerwanie w przerwaniu odpowiednio szybko. Mnie udało się zejść do 4 czy 5 rozkazów co przekłada sie na ok 7 cykli.
- Obciążenie CPU. Realizując licznik częstotliwości i czasu, max jaki uzyskałem (bez asm) to był pomiar czasu około 4,8ms czyli ok 20kHz. Fakt, że tam w przerwaniu było przeprowadzane dużo obliczeń. W przypadku PWM obliczeń nie będzie, więc tu raczej problemów nie widzę.

Podsumowując:
Da się zrobić.
 
Odpowiedź
  


Wiadomości w tym wątku
PWM - Sygnały przesunięte w fazie - przez akudom - 16-07-2018, 20:46
RE: PWM - Sygnały przesunięte w fazie - przez es2 - 16-07-2018, 22:22
RE: PWM - Sygnały przesunięte w fazie - przez es2 - 17-07-2018, 09:43
RE: PWM - Sygnały przesunięte w fazie - przez es2 - 17-07-2018, 20:03
RE: PWM - Sygnały przesunięte w fazie - przez es2 - 19-07-2018, 09:36
RE: PWM - Sygnały przesunięte w fazie - przez es2 - 22-07-2018, 10:50
RE: PWM - Sygnały przesunięte w fazie - przez es2 - 23-07-2018, 12:14

Skocz do:


Przeglądający: 1 gości