Start z STM32 VL Discovery – 9 — PWM part 1

Start z STM32 VL Discovery – 9 — PWM part 1
Razem głosów: 5 co stanowi: 96% całości.

STM32F0 DISCOVERY_2

Tak, zapewne czekacie co wymyślę znowu , a no dalej pobawimy się podstawowymi peryferiami naszego

Discovery. Tym razem rzutem na taśmę PWM…  Zapewne wielu go pamięta z AVR gdzie

zaprzęgamy go do niecnych celów, jak choćby płynnej zmiany kolorów w diodach RGB.

Ale nie będziemy się tu genezą PWM zajmować bo nie ma na to czasu , a w większości przypadków

jest on dobrze znany, jednak muszę coś napisać na temat ugryzienia go na STM32VLDiscovery.

Przypominam jednak że dla pozostałych mikrokontrolerów ARM z rdzeniem COrtex M3 i podobnymi będzie

to praktycznie identyczne :)

Hmmm … a jednak będzie nieco genezy :(

Mianowicie nasze TrueStudio Lite ma pewną przykrą cechę jeśli chodzi o język C dla STM32.

Podczas debugowania programu trzeba wniknąć trochę głębiej w procesor , a tu się okazuje

że w TrueStudio dostęp do rejestru SFR jest  …. wyłączony … ciekawe jaki to miało cel  ??

Niemniej producent VLDiscovery .. też nam nieco zrobił psikusa i w sumie doszedł do założenia

że nie będziemy generować żadnego przebiegu PWM więc nawet nie dał nam programu Demo.

BA !!! nawet niema biblioteki do PWM  ….

I dlatego będziemy musieli się dokładniej przyglądnąć filozofii rdzeni ARM ….  Tak wiem, będzie nudno

ale jest to konieczne by zgłębić temat i jednocześnie  zrozumieć dlaczego tak jest właśnie .

ARM został zaprojektowany jako rdzeń z maksymalnym uwzględnieniem jego efektywności.

W związku z tym, możliwe jest ograniczenie zużycia wszystkich bloków wewnętrznych rdzenia.

Generalnie, jeśli nieumieścimy w kodzie czegoś , poza kilkoma wyjątkami (niemaskowalnych przerwań)

to to nie działa – i dlatego pobiera mniej prądu. Jest to w porządku, ale trzeba o tym niestety pamiętać.

Dla przykładu, jeśli chcę, zmienić PIN PA1 na wyjście, najpierw muszę dostać się do portu

peryferyjnego zegara (nawet pina bez funkcji nie można ustawić), a następnie ustawić pin jako wyjścia,

ustawić prędkość, czy użyć rezystora PULL-UP, a następnie pozwolić, aby ustawić żądaną wartość logiczną

na wyjściu. Podobnie działają  liczniki, najpierw ustalić czasy, następnie ustawić wartość licznika, a potem go włączyć.

Innym problemem są przerwania. Ci którzy znają się osobiście z AVR lub 8051 ,

chociaż również mają do czynienia z pewnymi cechami przerwań w programie wiedzą, że liczba przerwań

jest stosunkowo ograniczona.

Tymczasem przerwanie ARM używa na znacznie większą skalę jakiegoś prostego jądra.

W jednej z poprzednich części, widzieliśmy SysTick, który jest jednym z przykładów z cyklicznych przerwań.

Czy są w takim razie przerwania które muszą być „leczone” za pomocą programu?

Tak ale stanowi to pewien częsty problem, można użyć niewłaściwej techniki wywołania

– bez maskowania przerwań i wywołać ciężki błąd wykonania (hard fault).

W innych częściach przerwania spotykamy wiele razy. Tu jednak rozwiązany zostaje PWM tak aby

licznik generował sygnał wyjściowy, bez powodowania zakłóceń programu głównego.

Oczywiście generowania PWM można rozwiązać tak, aby przerwanie timera i jego instrukcje były

adresowane programowo i ustawiać piny wyjściowe.

Rejestrów specjalnych do ustawienia użadzeń jest w ARM sporo.

Dlatego zawsze będziemy używać nazw zdefiniowanych w bibliotekach rejestrów i ich ustawień.

Rejestr opisany jako „adres 0x3F143AB 1 << 5” raz że będzie w złym guście,

to dodatkowo nie będziemy w stanie śledzić, co się ustawiło. Dlatego będziemy ufać i używać

definicji biblioteki  (zawsze można sprawdzić, jeśli istnieją wątpliwości co do ich prawdziwości).

Kolejny cechą rdzenia ARM jest możliwość zmiany funkcji wyprowadzeń.

Na przykład, TXD i RXD  nie zawsze musi być na tym samym porcie, jak np. w  mikrokontrolerach AVR,

ale może być przypisane do różnych pinów GPIO.  Chociaż nie jest to część arbitralna, mamy do wyboru

dwie opcje zmiany układów (częściowe i pełne), co jest nadal przydatną przypadłością i funkcjonalnością

ARM.

Ufff … straszne nudy prawda? Są jednak na tyle istotne że trzeba o nich wspomnieć, a ta okazja jest

ku temu najlepsza. No tak, znaczy jedno z głowy , teraz czas na podręczenie Timerów .. Znów troszkę

zamotam i namieszam , ale mam nadzieje że bez problemu zrozumiecie dlaczego i jak działa PWM

w STM32VL Discovery i innych nowszych wersjach naszej Dyscoteki :)

TIMERY w CORTEXACH:


Timery oznaczamy przez Tim + numer timera. Rdzeń Cortex M3 zawiera 12 timerów.

Ale nie możemy swobodnie korzystać z wszystkich (np. Tim6 Tim7 są używane przez ADC),

Co za problem nie ?? Skoro i tak mamy ich jeszcze sporo do wyboru :).

Sprawdźcie w Datasheet dla serii Value Line jest tam dobry opis timerów.

Generalnie wynika z tego, że  Tim1 jest bardzo przydatny licznikiem o wielu możliwościach,

podstawowych liczników mamy do dyspozycji aż 6 (TIM2, Tim3, Tim4, Tim5, Tim16 i Tim17).

TIM2, Tim3 i Tim4 są zsynchronizowane razem, więc możemy wygenerować w sumie 12 niezależnych

kanałów wyjściowych.

STM32 VL Discovery zawiera diody LED podłączone do pinów PC8 i PC9, na które mogą być remapowane

kanały 3 i 4. Dlatego będziemy korzystać z Tim3 i wyjść remapowanych (tryb fullremap jest konieczny,

częściowy remap jest niewystarczający!).

Zerknijmy na schemat blokowy Timerów :

Free Image Hosting at www.ImageShack.us

Rysunek przedstawia schemat blokowy licznika Tim3. Oczywiście, nie dbamy o to co jest

po lewej stronie, a jest używane do ładowania zewnętrznego sygnału za pomocą wejść,

ale interesuje nas to co jest po prawej stronie, a jest właśnie używane do generowania wyjścia. 

Z 4 kanałów używamy tylko połowy czyli kanałów  3 i 4 

Opcje ogólnego zastosowania timera (zostawiam w języku angielskim, aby uniknąć nieporozumień):

 

  • 16-bit up, down, up/down auto-reload counter
  • 16-bit programmable prescaler used to divide (also “on the fly”) the counter clock
    frequency by any factor between 1 and 65535
  • Up to 4 independent channels for:
    • Input capture
    • Output compare
    • PWM generation (Edge- and Center-aligned modes)
    • One-pulse mode output
Time-jednostka podstawowa:

 
Na rysunku, jest oczywiste, że głównym składnikiem jest 16-bitowy licznik, który może być ustawiony na zliczanie, w dół, w pierwszym lub następnym w cyklu. Licznik jest związany z auto-reload rejestru, w którym mogą one wprowadzić wartość, która zostanie załadowana do licznika — zawsze Reloaded. 

Licznik jest podłączony do źródła CLK . Zegar może być naturalnie podzielony jeśli chcemy uzyskać wolniejszą szybkość liczenia. Counter (licznik), rejestr auto-reload i prescaler może być odczytywany lub możemy do niego zapisać dane w każdej chwili za pomocą oprogramowania (nawet podczas pracy!). 
Rejestry identyfikacyjne :

  • Counter Register (TIMx_CNT)
  • Preskaler Register (TIMx_PSC)
  • Auto-Reload Register (TIMx_ARR)
Rejestr Auto-reload jest ustawiony (fabrycznie). Oznacza to, że w skrócie  zawartość preload  jest przenoszona do rzeczywistego rejestru (który jest tylko dla nas) każde zdarzenie, update (UEV) w zależności od tego, czy jest ustawiony preload włącza bit (ARP) w TIMx_CR1.
W zaplanowanych aktualizacjach występuje gdy licznik przepełnienia , a kiedy jest w okolicy wartości 0 (w TIMx_CR1). Aktualizacja zawartości może również powodować programowe przerwanie. 

Więcej informacji o timerach znajdziecie w dokumencie REFERENCE MANUAL 
W następnym części zrobimy już prawdziwy PWM.

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay