Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Dnia 14.11.2018 o 16:57, mikoby napisał:

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?

Tak, dokładnie tak - w dokumentacji producenta, powinna być informacja, że enkoder generuje 20 impulsów na obrót.

Dnia 14.11.2018 o 16:57, mikoby napisał:

I czy powinna być w dokumentacji informacja, że enkoder resetuje się, co 100 impulsów? (w przeciwnym razie trzeba to ustalić doświadczalnie?)

Nie, nie to już nie jest kwestia enkodera tylko naszego programu, w którym zostało (błędnie) założone, że enkoder ma inną liczbę impulsów na obrót. Albo autor kursu się tutaj pomylił, albo miał jeszcze inną wersję enkodera. Teraz już do tego nie dojdę, ale postaram się jakoś zaktualizować kurs, aby miało to "ręce i nogi". To po jakim czasie "zeruje się" pozycja enkodera to kwestia programowa. Tutaj zostało ustawione błędnie 100 pozycji na obrót, dlatego w praktyce oznacza to u nas 100 / 20 = 5 obrotów. Gdyby w programie było ustawione 20 pozycji na obrót, to wskazanie enkodera resetowałoby się co 1 obrót.

Udostępnij ten post


Link to post
Share on other sites

Witam,

Przykład 05_PWM z tego odcinka skompilowany bezpośrednio działa, ale utworzony samodzielnie w Eclipse i CubeMX już nie. Wydaje się, że problem jest z firmware. Plugin CubeMX (w wersji 5.0.1) raportuje (w zakładce Project Manager) że ma firmware STM32Cube FW_F4_V1.11.0, i z tym firmwarem działa. Ale upgrade do najnowszego firmware'u (STM32Cube FW_F4_V1.23.0) i regeneracja kodu powoduje, że przykład przestaje działać. Przestaje być wywoływana procedura HAL_SYSTICK_Callback. 

Niestety, nie udało mi się przywrócić starej wersji firmware'u, nie można też jej wybrać w nowych projektach, co powoduje, że technik opisanych w tym odcinku kursu nie można wykorzystywać w nowych projektach. 

Czy zna ktoś obejście tego problemu?

Udostępnij ten post


Link to post
Share on other sites

@misklap, dziękuję za sygnał - to niestety wada korzystania z takich rozwiązań, jak widać przy aktualizacjach mogą pojawiać się problemy. Sprawdzimy temat za jakiś czas i wprowadzimy poprawki (jeśli domyślimy się co należy zmienić)... Jeśli ktoś inny znajdziesz wcześniej odpowiedź na to pytanie to będę wdzięczny za podzielenie się tutaj rozwiązaniem 🙂

Potwierdza się przy okazji słuszność lekkiego sceptycyzmu @Elvisa do tego generatora kodu 😉

Udostępnij ten post


Link to post
Share on other sites

Trochę pogooglowałem i znalazłem rozwiązanie.

Na wstępie mała obserwacja: z opisu wynika, że w main() powinny być linie: 

HAL_TIM_Base_Start(&htim4);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);

Podczas gdy wystarcza tylko ta druga, żeby działało ze starym firmwarem.

Żeby zadziałało zarówno ze starym i nowym firmwarem, należy:

a) zamienić nagłówek naszej funkcji z:

void HAL_SYSTICK_Callback(void)

na

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)


b) w main() zamienić wywołanie

HAL_TIM_Base_Start(&htim4);

na

HAL_TIM_Base_Start_IT(&htim4);

c) w CubeMX ustawić:
TIM4|NVIC Settings TIM4 global interrupt|Enabled = true

i wygenerować kod. 

(W przypadku starego firmware'u, spowoduje to wygenerowanie w deklaracjach, linii:

static void SystemClock_Config(void);

oraz jej nadmiarowe (drugie) wywołanie w main():

SystemClock_Config();

które należy usunąć).

 

Wydaje mi się, że kod działający w starym i nowym firmwarze jest bardziej zgodny z (przynajmniej moimi 🙂) oczekiwaniami, a ten stary działał na skutek jakichś błędów w CubeMX


 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@misklap bardzo dziękuję za obszerne wyjaśnienie - zapisuję do aktualizacji 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Tym razem mam problem z projektem 05_PWN_IN. Wizualnie działa (dioda reaguje na enkoder), ale wywołania funkcji HAL_TIM_ReadCapturedValue zawsze zwracają 0, niezależnie od pozycji enkodera.

Jak je zmusić do zwracania zmiennych wartości?

No tak... trzeba spiąć PD14 i PA0 - nie napisano explicite, więc jakoś nie wpadłem na to od razu.

Edytowano przez misklap
Znaleziono rozwiązanie
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć,

mam problem z wizualizacją zmiennych w STM Studio.
Jeśli skonfiguruję sobie projekt w CubeMX i cały czas na nim pracuje to wszystko ładnie działa, ale gdy już chcę coś dodatkowo skonfigurować w tym projekcie używając CubeMX to pojawiają się problemy. Pierwszy z nich jest taki, że często nieznajduje nowych elementów. Wtedy muszę kliknąć na projekt PPM -> Index -> Rebuild. Problemy znikają. Ale gdy chce wczytać plik .ELF do STM Studio, to w miejscu gdzie powinny być zmienne nie ma nic. Dzieje się tak tylko po rekonfiguracji projektu w CubeMX. 

Udostępnij ten post


Link to post
Share on other sites

@wjcust jest to prawdopodobnie błąd aktualnej wersji CubeMX, która gubi się po zmianie konfiguracji projektu. Niestety trzeba czekać na aktualizację lub ręcznie kopiować plik o rozszerzeniu ".ld". Sprawdź czy ten plik u Ciebie nie ma 0 bajtów, jeśli tak jest to problem leży właśnie w aktualizacji Cube 😉

Udostępnij ten post


Link to post
Share on other sites

@Treker Dzięki za odpowiedź, sprawdzę jak tylko będę miał chwilę. Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites
Dnia 4.06.2019 o 06:19, Treker napisał:

@wjcust jest to prawdopodobnie błąd aktualnej wersji CubeMX, która gubi się po zmianie konfiguracji projektu. Niestety trzeba czekać na aktualizację lub ręcznie kopiować plik o rozszerzeniu ".ld". Sprawdź czy ten plik u Ciebie nie ma 0 bajtów, jeśli tak jest to problem leży właśnie w aktualizacji Cube 😉

Rzeczywiście okazuje się, że plik .id ma 0 bajtów. 
Będę pamiętał na przyszłosć, żeby go skopiować.

Dzięki i pozdrawiam

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Jak to jest z konfiguracją timera dla PWM (STM32F103c8t6)?

Ustawiam dla TIM4 na ARR = 9999  dla PSC=3599 aby obserwować zmiany na diodzie LED.
One Pulse Mode z pobudzaniem z innego timera co 10sek.

W kodzie raz wprowadzam Pulse=5, a następnie Pulse=9000.

Jak założyłem, powinienem zobaczyć zmiany czasu świecenia od 1sek do bardzo krótkiego impulsu.
Ale nie zauważam żadnej zmiany 😞

Udostępnij ten post


Link to post
Share on other sites
Dnia 6.06.2019 o 16:51, wjcust napisał:

Rzeczywiście okazuje się, że plik .id ma 0 bajtów. 
Będę pamiętał na przyszłosć, żeby go skopiować.

Dzięki i pozdrawiam

Niestety to nic nie daje 😄

Udostępnij ten post


Link to post
Share on other sites

@wjcust dla pewności: powinieneś skopiować plik .id zaraz po wygenerowaniu projektu (wtedy, gdy wszystko działa) i po edycji projektu nadpisywać ten nowy plik (0B) jego starą wersją. U innych osób takie rozwiązanie działało poprawnie 😕

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, Treker napisał:

@wjcust dla pewności: powinieneś skopiować plik .id zaraz po wygenerowaniu projektu (wtedy, gdy wszystko działa) i po edycji projektu nadpisywać ten nowy plik (0B) jego starą wersją. U innych osób takie rozwiązanie działało poprawnie 😕

Możliwe że problemem jest to że plik id kopiuje dopiero przed wykonaniem rekonfiguracji (ten plik działający ale już ze zmianami w projekcie) a nie zaraz po jego utworzeniu. Sprawdzę jak będę miał chwilkę.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam wszystkich szanownych zebranych.
Zacznę od tego, że kurs stoi na naprawdę wysokim poziomie, niczego mu nie brakuje, wiedza jest przekazywana w niezwykle przystępny sposób (jak zawsze w kursach forbota), dużo praktyki popartej niezbędną teorią. Lecz abstrahując od tego, mam poważny problem z funkcją HAL_TIM_PWM_Start(). Otóż program zatrzymuje się na tej funkcji, a debugger wyświetla cały czas komunikat "halted: PC: 0x08000xxx". Prześledziłem funkcje "wchodząc w nią" za pomocą debuggera, krok po kroku, linia po linii. Niby wszystko zachowuje się prawidłowo, lecz w momencie dojścia do linii: return HAL_OK, program omija ją, jest gotowy do wyjścia i w tym momencie po naciśnięciu klawisza kontynuacji funkcja się zawiesza, a debugger sygnalizuje wcześniej wspomniany komunikat. Użycie DMA daje ten sam efekt. Nie wiem gdzie leży problem. Pozostaje mi jedynie prześledzić ustawienia wszystkich rejestrów, lecz będzie to niewątpliwie mało przyjemna praca mimo ułatwień, które oferuje środowisko SystemWorkbench. Jeśli ktoś wie, dlaczego taka sytuacja może mieć miejsce, będę niezmiernie wdzięczny za feedback.

Pozdrawiam

Edytowano przez BusKetZz

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ść
Napisz odpowiedź...

×   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...