Skocz do zawartości
Bornhartt

Sterowanie silnikiem STM32F103

Pomocna odpowiedź

Dzień dobry,

Jest to mój pierwszy wpis na forum, szukałem wcześniej podobnego tematu ale go nie znalazłem, tak więc zakładam nowy.

Steruję silnikiem DC za pomocą sterownika L293D, połączenie jest poprawne, steruję "ręcznie" silnikiem , więc od tej strony wszystko działa, problem pojawił się przy programowaniu STMki.

Korzystając z kursu STM32 F1 HAL #4 porty GPIO próbuję wystawić sygnał sterujący silnikiem

lecz pozostaje on w stanie wysokim. Jeżeli zmienię PIN na diodę LED PC13 to ta działa poprawnie.

Co zrobić aby dany PIN zmieniał swój stan?

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); 
	HAL_Delay(500);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
	HAL_Delay(500);

  }
  /* USER CODE END 3 */
}

 

Udostępnij ten post


Link to post
Share on other sites

@Bornhartt witamy na forum. Nie napisałeś co to za silnik, jaki ma pobór prądu. Jak sterujesz nim ręcznie, co to oznacza? Czy używasz gołego mostka, czy to jakiś shield do arduino?

A już tak zupełnie z innej strony, STM pewnie na wyjściu daje 3,3V. Teoretycznie to powinno wystarczyć, ale któż to wie. L293 to taki dinozaur, że dziwię się, że jest jeszcze w sprzedaży. Bez większej ilości informacji, czy chociażby jakiegoś schematu to tylko mogę zgadywać. Może kod jest napisany nieprawidłowo, a może masz coś źle podłączone, a może napięcie sterujące mostkiem jest za niskie, a może złe stany wysyłasz na złe piny mostka bo oprócz wysterowania wejść 1 i 2 musisz wysterować wejście Enable.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Używam gołego mostka, a w sterowaniu ręcznym chodziło mi o to, że przykładam 3,3 V do wejść sterujących i silnik działa poprawnie.

W specyfikacji mostka jest opisane wejście enable i dwa wejścia sterujące lewo prawo, jeżeli zasilimy enable 3,3 V to sterujące też możemy zasilić tym napięciem do poprawnego działania mostka. 

Zrobiłem test, w którym podaję napięcie 3,3V na enable a do STM podłączyłem jedynie jedno wejście sterujące na pin, który w stanie wysokim wystawia 3,3 V, silinik obraca się ale pin nie przechodzi w stan niski i to jest problem którego nie potrafię rozwiązać

Albo z drugiej strony, dlaczego kod który przedstawiłem nie zmienia stanu na wyjściu PINu?

 

Edytowano przez Bornhartt

Udostępnij ten post


Link to post
Share on other sites

Ustaw sobie breakpointy na HAL_GPIO_WritePin a w debugerze wyświetl ODR portu A i zobaczysz czy soft działa poprawnie. Może kręci się w wyjątku?

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
35 minut temu, Elvis napisał:

Pokaż kod, którym konfigurujesz pin PA15.

Po co? Widać, ze użył CubeMX.

 

@Bornhartt pokaż jak skonfigurowałeś pin w CubeMX bo pewnie nie wiesz gdzie w kodzie jest inicjalizacja pinu.

Dobra rada. W CubeMX nadawaj etykiety pinom a w kodzie programu posługuj się etykietami a nie nr pinów i nazwami portów.

Udostępnij ten post


Link to post
Share on other sites

Może i faktycznie CubeMX, jakoś się zapatrzyłem na "Korzystając z kursu STM32 F1 HAL #4".

W każdym razie PA15 został wybrany nieco niefortunnie. W datasheecie jest taka informacja:

pa15.thumb.png.97e5f172805fc0e07a38d2d7a4899296.png

Jak widać domyślnie ten pin jest używany przez interfejs JTAG.

Dlatego może nie działać jeśli go odpowiednio nie skonfigurujemy. Po pierwsze wybierając piny trzeba sprawdzić do czego są podłączone oraz w dokumentacji upewnić się, czy to na pewno zwykły pin, a nie jakiś "specjalny". W tym przypadku pewnie najłatwiej byłoby skorzystać z innego pinu i po sprawie.

Natomiast jeśli bardzo chcemy używać PA15, a JTAG nie jest nam potrzebny, trzeba zmienić jego funkcję na GPIO:

	 __HAL_RCC_AFIO_CLK_ENABLE();
	 __HAL_AFIO_REMAP_SWJ_NOJTAG();

Właśnie dlatego pytałem o kod konfigurujący pin - bo jeśli tego wywołania w nim nie ma, to PA15 ma prawo nie działać. Tzn. działa, ale jako JTDI i stan ODR nie ma najmniejszego znaczenia.

Z tego co widzę CubeMX nie wyłącza JTAG-a, więc możliwe że to była przyczyna całego zamieszania.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
  GPIO_InitStruct.Pin = GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Kod konfiguracji pinu.

wstawiając breakpointy i przeglądając ODR można zauważyć, że stan na pinie zmienia się, ale w ciągłym działaniu kodu już wystawia tylko stan wysoki, próbowałem dla pinów a10-a12 również, z tym samym rezultatem

Udostępnij ten post


Link to post
Share on other sites

Pierwsze pytanie - czy używasz płytki Nucelo-103rb, czy czegoś innego? Chodzi mi głównie o to czy używane piny są wolne.

Druga sprawa - próbowałeś testować diodą led lub multimetrem? Warto zacząć od czegoś prostego, upewnić się że sterowanie pinem działa i dopiero wtedy podłączyć silnik.

I ostatnie pytanie - testowałem na Nucleo103rb kod sterujący PA15, inicjalizacja taka jak u Ciebie, tylko z dwoma linijkami o których pisałem wcześniej - mógłbyś sprawdzić czy taki program działa poprawnie?

Jeszcze jedno pytanie - napisałeś: "wstawiając breakpointy i przeglądając ODR można zauważyć, że stan na pinie zmienia się," - jak rozumiem to znaczy że zmienia się wartość w rejestrze ODR, co w sumie jest oczywiste - ale czy testowałeś stan pinu?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Używam STM32F103C8 (BluePill)

Testowałem diodą LED i multimetrem, wraz ze zmianą stanu multimetr wskazywał 3,3 i 0 V

A w którym miejscu wstawić te dwie linijki? Tam gdzie  jest konfiguracja pinu?

Udostępnij ten post


Link to post
Share on other sites

Skoro za pomocą LED-a i multimetru widzisz, że pin jest poprawnie sterowany, to nie musisz nic w kodzie zmieniać - przecież działa poprawnie.

O ile rozumiem problem jest albo z działaniem samego programu, albo sterownikiem silnika. Jeśli podłączysz diodę i uruchomisz program, to działa / miga poprawnie?

Pytanie pomocnicze: z czego zasilasz silnik oraz bluepill?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Wszystko działało poprawnie, niestety podłączyłem do płytki stykowej również GND i to nie pozwalało na poprawną pracę silnika, temat zamknięty i dziękuję Wam za pomoc i porady 🙂

 

Edytowano przez Bornhartt

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