Spisu treści:

Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM: 4 kroki
Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM: 4 kroki

Wideo: Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM: 4 kroki

Wideo: Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM: 4 kroki
Wideo: Akademia Serwonapędów #1: Podstawy serwonapędów 2024, Lipiec
Anonim
Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM
Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM
Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM
Sterowanie serwosilnikiem za pomocą MCU STM32F4 ARM

Witam ponownie koledzy:) Tak więc w tym projekcie będziemy sterować serwomotorem za pomocą MCU STM32F4 ARM. W moim przypadku użyję tablicy wykrywania, ale jeśli zrozumiesz istotę problemu, możesz zastosować ją do każdego MCU. Więc. Zacznijmy:)

Krok 1: Wymagania sprzętowe i programowe

Pod względem sprzętowym będziemy potrzebować:

  • MCU, którym jest w moim przypadku płyta Discovery STM32f4
  • Zwykły silnik serwo, taki jak SG90 lub jakikolwiek inny

W zakresie oprogramowania będziemy potrzebować:

  • STM32CubeMX
  • Keil uVision

Jeśli masz to wszystko, przejdź do następnego kroku:)

Krok 2: Konfiguracja STM32CubeMX

Jak wiadomo do sterowania serwonapędem potrzebujemy sygnału PWM. Wymagania w zakresie sygnału PWM są takie:

  • Okres PWM musi wynosić 20 mS
  • Czas musi mieścić się w zakresie od 0,5 ms do 2,5 ms. Gdy czas wynosi 0,5 mS, serwo obróci się o 0 stopni, 1,5 mS na 90 stopni i 2,5 mS na 180 stopni.

Musimy więc skonfigurować PWM i do tego celu użyjemy Timera1.

  • Najpierw wybierz TIM1 z sekcji Timery. Ten krok
  • Następnie z sekcji Tryb

    1. Wybierz zegar wewnętrzny w tym kroku
    2. Generacja PWM CH1 Ten krok
  • Następnie z sekcji Konfiguracja
    1. Ustaw Prescaler na 160 Ten krok
    2. Ustaw okres licznika na 2000 Ten krok
    3. Ustaw tętno na 50 w tym kroku
  • Dodatkowo w opcji Clock Configuration ustaw zegary APB1 Timer na 16MHz. Ten krok

Porozmawiajmy teraz trochę o tym kroku:

Częstotliwość zegara naszego timera APB1 wynosi 16 MHz. Oznacza to, że do uzyskania 1 sekundy wymagane jest 16 000 000 tyknięć. Ustawiliśmy jednak nasz preskaler na 160. Oznacza to, że dzielimy naszą częstotliwość przez tę liczbę i zmniejszamy liczbę tików do 100 000. Czyli na 1 sekundę potrzebujemy 100 000 tików. Potrzebujemy jednak 20mS okresu PWM, jak wspomnieliśmy wcześniej. Tak więc, bazując na prostej matematyce, potrzebujemy 2000 tików na 20ms. Tak więc ustawiając Counter Period na 2000 określamy okres sygnału PWM, który wynosi 20ms. Teraz musimy określić liczbę tików dla czasów włączenia od 0,5ms do 2,5ms. Możemy otrzymać to równanie z prostej matematyki i jest to:

On_Time = (Tick_Number / 100). Należy pamiętać, że jest to czas on_time, który zmienia kąt silnika serwo. Tak więc na poniższym obrazku podsumowuję ten krok. Jeśli masz jakieś pytanie napisz w komentarzach a odpowiem najszybciej jak to możliwe.

Obraz obliczeń

Po wykonaniu wszystkich tych czynności wygeneruj kod:)

Krok 3: Kodowanie Keil UVision

Więc najpierw ustalmy, co chcemy zrobić? Chcemy napisać funkcję przyjmującą stopień i zapisać ją do serwa. Jak więc to zrobimy? Jak powiedzieliśmy wcześniej, aby zmienić kąt, musimy zmienić na czas. Nasze kąty zmieniają się między [0, 180] a naszą liczbą tików, co określa zmiany w czasie między [50, 250]. Potrzebujemy więc funkcji mapującej, która odwzorowuje dany kąt na zakres liczby tików. Na przykład dla 0 stopni 50 tików, 180 stopni 250 tików i tak dalej… Napiszmy więc naszą funkcję mapującą:

int map(int st1, int fn1, int st2, int fn2, int value){ return (1.0*(value-st1))/((fn1-st1)*1.0) * (fn2-st2)+st2; }

To jest nasza funkcja mapowania. Czy interesuje Cię, jak to się wywodzi? Więc przeczytaj to. Tak więc bierzemy nasze zakresy i wartość, którą chcemy zmapować.

Napiszmy teraz funkcję, która przyjmuje kąt i odwzorowuje go na zakres tików:

void servo_write(int angle){ htim1. Instance->CCR1 = map(0, 180, 50, 250, angle); }

Jak widać, ten kod akceptuje kąt i odwzorowuje go na zakres liczby tików. Następnie liczba tików jest podawana do rejestru CCR1, który kontroluje czas i tym samym kąt.

Jednak, aby to wszystko zadziałało, najpierw uruchamiamy pwm, co można zrobić za pomocą jednej linii kodu:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Mamy więc funkcję, która przyjmuje kąt i zapisuje go w serwomechanizmie. Przetestujmy to i napiszmy naszą funkcję przemiatania, która jest bardzo prosta:

void servo_sweep(void){ for(int i = 0; i <= 180; i++) { servo_write(i); HAL_Opóźnienie(10); } for(int i = 180; i>= 0; i--) { servo_write(i); HAL_Opóźnienie(10); } }

Więc po prostu policz do 180, a następnie do 0 i zapisz te wartości do serwa:) Zobaczmy więc wynik!

Krok 4: Wynik:)

To już koniec. Jeśli masz jakieś pytanie, zapytaj. Chętnie na nie odpowiem. Bardzo dziękuję za lekturę i mam nadzieję, że do zobaczenia w kolejnym projekcie:)

Zalecana: