Skocz do zawartości
Komentator

Kurs STM32 F4 - #8 - Zaawansowane funkcje liczników

Pomocna odpowiedź

Cześć,
Czym jest polarity do ustawienia w konfiguracji enkodera?

W kursie ustawiamy go na Rising Edge. Ale czemu nie Both Edge.

Help z programu nie za bardzo mi pomógł, bo nie znalazłem nic o polarity.

Z kodu komentarz z tej linii:

sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;

to:

uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal.

Gdzie więc szukać odpowiedzi na przyszłość?

Udostępnij ten post


Link to post
Share on other sites

Podstawowym źródłem jest jak zwykle dokumentacja producenta. Nie wiem którego dokładnie procesora używasz, ale do każdej rodziny STM32 istnieje tzw. Reference Manual. Tam znajdziesz szczegółowe opisy wszystkiego co proc ma w środku. Ponieważ szczegóły niektórych rozwiązań różnią się miedzy rodzinami, warto dokopać się do konkretnego dokumentu. Przykładowo, dla F4 startujesz stąd:

http://www.st.com/en/microcontrollers/stm32f4-series.html?querycriteria=productId=SS1577

wybierasz np. F407 i lądujesz tutaj:

http://www.st.com/en/microcontrollers/stm32f407-417.html?querycriteria=productId=LN11

tutaj znajdujesz już konkretny układ, np. F407VE (100 pin, 512K FLASH) i wjeżdżasz na jego stronę:

http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-high-performance-mcus/stm32f4-series/stm32f407-417/stm32f407ve.html

gdzie od razu na górze masz link do Datasheet, ale to mnóstwo szczegółów technicznych potrzebnych przy projektowaniu schematów i PCB. Ty znajdujesz na liście dokumentów (poniżej) Reference Manual i jesteś w domu:

LINK

Tu o samym TIM1 masz ponad 70 stron...

W rozdziale "17.3.16 Encoder Interface Mode" masz opis i tabelkę, która chyba wyjaśnia sprawę.

W zależności od tego jakie zbocza ustawisz aktywne, takie zdarzenia będzie liczył timer. To znaczy, że możesz mieć od 1 do 4 zliczeń na jeden cykl (w sumie 2 impulsy czyli 4 zbocza) enkodera. Dekodowanie kierunku jest robione niezależnie od ustawionych zboczy.

Udostępnij ten post


Link to post
Share on other sites

Niestety Reference manual ma pewną wadę (poza liczbą stron) - nie daje się bezpośrednio przełożyć na kod wykorzystujący bibliotekę Cube. Oznacza to niestety, że najpierw musisz przeczytać 70 stron dokumentacji - a może i więcej, bo często układy peryferyjne wymagają wiedzy o innych, dopiero później musisz doczytać, jak nowo przyswojoną wiedzę wykorzystać używając wybranej bibliteki... Czasem bezpośrednie używanie rejstrów bywa łatwiejsze niż super-graficzne narzędzie, do którego producent "zapomniał" dodać porządnej dokumentacji.

Udostępnij ten post


Link to post
Share on other sites

Mam płytkę discovery, czyli jest tam STM32F411VCT.

Manual znalazłem tutaj: tutaj

U mnie jak daję sConfig. IC2Polarity = TIM_ICPOLARITY_BOTHEDGE (oraz IC1Polarity = TIM_ICPOLARITY_BOTHEDGE ), to licznik przestaje działać i wynik jest niezależny od obracania enkoderem. Dla TIM_ICPOLARITY_RISING i FALLING działa poprawnie.

@marek1707 Tabelkę rozumiem. Z tabelki poniżej przez Ciebie wskazanej wynika, że zamiana CC1P z 0 na 1 odwraca kierunek obrotu.

Znalałem na jakimś forum zdanie o polarity sConfig.IC1Polarity = TIM_ICPOLARITY_BOTHEDGE:

The TIM_ICPolarity_Rising is about inverting the input edges, not the counting mode. As far as I can see, you should make both polarities either rising or falling. To quite from the reference manual:

I z manuala:

To select Encoder Interface mode write SMS=‘001’ in the TIMx_SMCR register if the counter is counting on TI2 edges only, SMS=’010’ if it is counting on TI1 edges only and SMS=’011’ if it is counting on both TI1 and TI2 edges.

Select the TI1 and TI2 polarity by programming the CC1P and CC2P bits in the TIMx_CCER register. When needed, you can program the input filter as well. CC1NP and CC2NP must be kept low

W kodzie znalazłem:

#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP)

#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE

Czym więc jest CC1P oraz CC1NP na które składa się TIM_ICPOLARITY_BOTHEDGE?

Czyli wychodzi na to, że wybierając TIM_ICPOLARITY_BOTHEDGE oraz domyślą wartość z kursu:

sConfig.IC1Filter = 15; //zakładam, że to "input filter"

wychodzi nam sprzeczny kod, który nie powinien w żaden sposób działać?

Ale dalej nie wiem czym jest tem polarity both edge.

[ Dodano: 26-07-2017, 08:38 ]

Ok przeglądnąłem dokładniej i dostałem odpowiedź, że nie powinienem używać jednocześnie CC1P i CC1NP dla trybu z enkoderem:

CC1 channel configured as input:

CC1NP/CC1P bits select the active polarity of TI1FP1 and TI2FP1 for trigger or capture

operations.

00: non-inverted/rising edge

The circuit is sensitive to TIxFP1 rising edge (capture or trigger operations in reset, external

clock or trigger mode), TIxFP1 is not inverted (trigger operation in gated mode or encoder

mode).

01: inverted/falling edge

The circuit is sensitive to TIxFP1 falling edge (capture or trigger operations in reset, external

clock or trigger mode), TIxFP1 is inverted (trigger operation in gated mode or encoder

mode).

10: reserved, do not use this configuration.

11: non-inverted/both edges

The circuit is sensitive to both TIxFP1 rising and falling edges (capture or trigger operations

in reset, external clock or trigger mode), TIxFP1 is not inverted (trigger operation in gated

mode). This configuration must not be used in encoder mode.

Do wykrywania zbocza są inne bity:

#define TIM_SMCR_SMS_0            (0x1U << TIM_SMCR_SMS_Pos)                   /*!< 0x0001 */
#define TIM_SMCR_SMS_1            (0x2U << TIM_SMCR_SMS_Pos)                   /*!< 0x0002 */

Czyli ustawienie:

SMS=011 if it is counting on both TI1 and TI2 edges

Brak pytań 😉

[ Dodano: 26-07-2017, 18:25 ]

Mam problem z ostatnim zadaniem z tego tematu - odczytywanie PWM.

Lampka

[ Dodano: 26-07-2017, 18:33 ]

Mam problem z ostatnim zadaniem z tego tematu - odczytywanie PWM.

Lampka świeci z różnym natężeniem w zależności od pozycji enkodera. Wnioskuję więc, że zarówno generowanie PWM jak i obsługa enkodera działa poprawnie.

Jednak niezależnie od tych dwóch rzeczy zawsze poniższe zmienne mają takie same wartości (są volatile)

InputPWMDuty_cycles 0x20000060 1

InputPWMPeriod_cycles 0x20000144 1

InputPWMPeriod_miliseconds 0x20000064 0

Co może być przyczyną?

Jak odczytujący timer TIM2 jest połączony z nadawającym timerem TIM4?

[ Dodano: 26-07-2017, 18:34 ]

---------------------------------------------

Mam problem z ostatnim zadaniem z tego tematu - odczytywanie PWM.

Lampka świeci z różnym natężeniem w zależności od pozycji enkodera. Wnioskuję więc, że zarówno generowanie PWM jak i obsługa enkodera działa poprawnie.

Jednak niezależnie od tych dwóch rzeczy zawsze poniższe zmienne mają takie same wartości (są volatile)

InputPWMDuty_cycles 0x20000060 1

InputPWMPeriod_cycles 0x20000144 1

InputPWMPeriod_miliseconds 0x20000064 0

Co może być przyczyną?

Jak odczytujący timer TIM2 jest połączony z nadawającym timerem TIM4?

Udostępnij ten post


Link to post
Share on other sites

Uruchomienie timera generującego sygnał PWM. Krok 3.

Brakuje nawiasu klamrowego dla "if (InterruptPrescaler == 40){". W przykładzie dla DMA jest ok. Przez brak nawiasu błędy dziwnie wyglądają, bo odnoszą się do inicjalizacji timera.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

BioPio, dziękuję za zgłoszenie i gratuluję czujności 🙂 Poprawione!

Udostępnij ten post


Link to post
Share on other sites

czy przy enkoderze nie wystarczy sprawdzac stanu B tylko w momencie zbocza narastajacego na A? i jesli niski to PRAWO a wysoki to LEWO? odpada myk z tym dzieleniem przez 4

z kolei ja mam inny problem:

jak uruchomic kilka kanałów PWM timera w trybie DMA?

robilem wszystko jka na kursie tylko powtórzyłem 3 razy linijke

volatile uint32_t duties[3];
uint32_t potReadings[3];
.......
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1,&duties[0],1);
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_2,&duties[1],1);
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_3,&duties[2],1);
....
while (1)
   for(int i=0;i<3;i++){
       duties[i]=map(potReadings[i],0,ADCResolution,minCCR,maxCCR);
   }
   //TIM1->CCR1=duties[0];
   //TIM1->CCR2=duties[1];
   //TIM1->CCR3=duties[2];
}

i działa tylko jeden, ten jako pierwszy uruchamiany kanał, w rejestrach DMA adresy sa poprawne dla kanałów DMA 2,3 i 6 (takie sa w CubeMX dla tych kanałów TIM1), tak samo adresy kolejnych elementow duties

ale juz rejestry CCR to tylko CCR1 sie zmienia, pozostale sa na 0x0000

jak ręcznie je wypełniam przez TIM1->CCR2=1200 to rejestr zmienia stan ale zero reakcji an pinie

przy sledzeniu krok po kroku tych instrukcji HAL_TIM_PWM_Start_DMA program wchodzi w switch(channel), i za kazdym razem w odpowiedni switch, potem uruchamia HAL_TIM_PWM_Start_IT, i tak dla kazdego kanalu, ale w main() dziala tylko jeden kanal

ADC w trybie DMA działa ok, wszytkie te kanaly bez DMA tez dzialaja ok

i nie wiem co tam trza zrobić jakiś refresh czy co? miedzy tymi wywolaniami HAL_TIM_PWM_Start_DMA?

czy jakos zle wpisuje cos w HAL_TIM_PWM_Start_DMA?

Udostępnij ten post


Link to post
Share on other sites

Panowie mam problem z enkoderem. Testowałem to na 3 różnych płytkach i zawsze to samo. A mianowicie ze enkoder "gubi kroki" tzn nie zlicza mi poprawnie. Jak powoli przekręce to jest ok ale przy szybszym obrocie gubi np jedną bądź dwie pozycje. Najpierw podszedłem do tego od strony sprzętu. Dodałem filtr na liniach i na zasilaniu trochę pomogło. Jedyne co na prawde pomaga to zmniejszenie czestotliwości taktowania procesora. Jednak nie chce schodzić z nią tak nisko (poniej 10MHz wtedy dobrze liczy). Próbowałem już wszystkich opcji w cube i nic to nie daje. Zliczałem po zboczu narastającym opadającym z filtrem i bez i to samo. Możliwe że mój enkoder jest poprostu do niczego ale mam 3 takie same i na każdym to samo. Gdyby ktoś miał cos na ten temat to proszę o info. Jeżeli komuś zlicza poprawnie w tej konfiguracji z artykułu proszę o info jaki macie enkoder. Ja mam ten:

Udostępnij ten post


Link to post
Share on other sites

Na wstępie napiszę, że autor odwalił kawałek dobrej roboty.

Skorzystałem z części poświęconej enkoderowi.

Moim skromnym zdaniem zmieniłbym jeden opis, który może wprowadzać w błąd.

W opisie jest:

Skąd natomiast wzięła się wartość 403 w rejestrze ARR? Jak już powiedzieliśmy, w naszym rozwiązaniu impulsy między pozycjami zliczane są co 4. W takim razie przekręcając enkoder 100 razy, otrzymamy dokładnie 400 impulsów.

Napisałbym coś w tym rodzaju:

Skąd natomiast wzięła się wartość 403 w rejestrze ARR? Jak już powiedzieliśmy, w naszym rozwiązaniu impulsy między pozycjami zliczane są co 4. W takim razie przekręcając enkoder o 100 pozycji (1 obrót), otrzymamy dokładnie 400 impulsów.

Warto też dodać, że użyty enkoder jest o rozdzielczości 100 imp/obr. (jeśli gdzieś w tekście jest ta informacja to przepraszam, ale nie umiałem jej znaleźć).

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

magnez, witam na forum!

Dziękuję za sugestię - właśnie dodałem tę informacje do artykułu!

Udostępnij ten post


Link to post
Share on other sites

Chciałabym zrobić sterowanie PWMem, potrzebuje sygnał o czestotliwosci 5kHz zmienny w zakresie 0-100. Konfiguruje układ zgodnie z opisem w kursie. PSC = 99, ARR = 9, CKD = 0.

Jednak podczas sterowania otrzymuje zupełnie inne wartości wypełnienia. Ustawiająć wypełnienie na 50% otrzymuje 100 %, wpisując 25% otrzymuje 70%, wpisując 10% otrzymuje 40%, a niższej wartości nigdy nie mogę osiągnąć. Możecie mi podpowiedzieć gdzie szukać problemu? Używam płytki Discovery z procesorem stm32f407, do sterowania używam z timera 3 kanału 4. Proszę o pomoc 😉

Udostępnij ten post


Link to post
Share on other sites

@Wnuczek, witam na forum 😉
Widzę, że to Twoje pierwsze kroki na Forbocie, jeśli chcesz przywitać się z innymi członkami naszej społeczności skorzystaj z tego tematu: Powitania użytkowników.

W komentarzach do kursów staramy się rozmawiać wyłącznie o przykładach i sprzęcie, które są opisywane w poradnikach. Jeśli masz problem z innym układem to załóż proszę osobny temat, aby nie wprowadzać w błąd innych czytelników kursu. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum 🙂

Udostępnij ten post


Link to post
Share on other sites

Cześć!

Świetny kurs!

Mam pytanie odnośnie tej lekcji.
Mianowicie w jednym miejscu jest napisane:

Zauważmy, że enkoder ma swoje "stabilne pozycje", które znajdują się średnio co 18° stopni (20 "pozycji" na obrót).

Później mamy:

W takim razie przekręcając enkoder o 100 pozycji (1 obrót), otrzymamy dokładnie 400 impulsów.

A w dokumentacji enkodera (https://www.waveshare.com/w/upload/d/d3/Rotation-Sensor-UserManual.pdf) mamy:

Pulses outputted per circle: 15 pluses

Fizycznie obracając enkoder potwierdzam, że ma 20 pozycji.
Zatem skąd wzięła się liczba z drugiego cytatu o 100 pozycjach i jak to się ma do dokumentacji, w której jest mowa o 15 impulsach?

Z góry dzięki za odpowiedź!

Pozdrawiam,
MK

Udostępnij ten post


Link to post
Share on other sites

@mikoby, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
Dnia 6.11.2018 o 11:12, mikoby napisał:

Fizycznie obracając enkoder potwierdzam, że ma 20 pozycji.
Zatem skąd wzięła się liczba z drugiego cytatu o 100 pozycjach i jak to się ma do dokumentacji, w której jest mowa o 15 impulsach?

Miło słyszeć, że kurs się przydaje 🙂

Jeśli chodzi o kwestę enkodera. To wydaje mi się, że po prostu producent musiał coś "mieszać" z enkoderami wlutowywanymi w identyczny moduł i stąd rozbieżność. Moje enkodery (a mam ich kilka) mają faktycznie po 20 pozycji. Jeśli chodzi o "100" to hmm... tu mnie zagiąłeś. Gratuluję czujności, ale chyba jest tu jakiś błąd w artykule. Najwidoczniej autor z rozpędu przetestował to na enkoderze, który zliczał 100 impulsów na obrót i później nikt tego nie wyłapał. Wychodzi więc na to, że w tym przypadku z enkoderem, który posiadasz informacja na temat pozycji powinna zerować się co 100/20 = 5 obrotów. Czy potwierdzasz, że tak się dzieje? Jeśli tak to będziemy mieli jasność, że to błąd w tekście i go poprawię 😉

Udostępnij ten post


Link to post
Share on other sites
Dnia 8.11.2018 o 02:50, Treker napisał:

Jeśli chodzi o kwestę enkodera. To wydaje mi się, że po prostu producent musiał coś "mieszać" z enkoderami wlutowywanymi w identyczny moduł i stąd rozbieżność. Moje enkodery (a mam ich kilka) mają faktycznie po 20 pozycji. Jeśli chodzi o "100" to hmm... tu mnie zagiąłeś. Gratuluję czujności, ale chyba jest tu jakiś błąd w artykule. Najwidoczniej autor z rozpędu przetestował to na enkoderze, który zliczał 100 impulsów na obrót i później nikt tego nie wyłapał. Wychodzi więc na to, że w tym przypadku z enkoderem, który posiadasz informacja na temat pozycji powinna zerować się co 100/20 = 5 obrotów. Czy potwierdzasz, że tak się dzieje? Jeśli tak to będziemy mieli jasność, że to błąd w tekście i go poprawię 😉

Hej, potwierdzam, że pozycja zeruje się co 5 obrotów.
W związku z tym jaka powinna być informacja w dokumentacji odnosnie liczby impulsów na obrót (Pulses outputted per circle)? 20?
I czy powinna być w dokumentacji informacja, że enkoder resetuje się, co 100 impulsów? (w przeciwnym razie trzeba to ustalić doświadczalnie?)

Mam też pytanie, co do ostatniej części tej lekcji (Odczytywanie sygnału PWM)
Jaką rolę pełni PD15?

I czy przycisk (PA0) pełni jakąś funkcję w tym zadaniu?

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...