Upravljanje servo motorom sa STM32F4 ARM MCU: 4 koraka
Upravljanje servo motorom sa STM32F4 ARM MCU: 4 koraka
Anonim
Upravljanje servo motorom sa STM32F4 ARM MCU
Upravljanje servo motorom sa STM32F4 ARM MCU
Upravljanje servo motorom sa STM32F4 ARM MCU
Upravljanje servo motorom sa STM32F4 ARM MCU

Pozdrav opet prijatelji:) Dakle, u ovom projektu ćemo kontrolirati servo motor sa STM32F4 ARM MCU. U mom slučaju koristit ću ploču za otkrivanje, ali ako shvatite srž problema, možete je primijeniti za svaki MCU. Tako. Započnimo:)

Korak 1: Zahtjevi hardvera i softvera

Što se tiče hardvera, trebat će nam:

  • MCU koji je u mom slučaju STM32f4 Discovery ploča
  • Uobičajeni servo motor, poput SG90 ili bilo kojeg drugog

Što se tiče softvera, trebat će nam:

  • STM32CubeMX
  • Keil uVision

Ako imate sve ovo, prijeđite na sljedeći korak:)

Korak 2: Konfiguracija STM32CubeMX

Kao što znate, za upravljanje servo motorom potreban nam je PWM signal. Zahtjevi u pogledu PWM signala su sljedeći:

  • PWM razdoblje mora biti 20 mS
  • Na vrijeme mora biti između 0,5 mS do 2,5 mS. Kad je vrijeme uključivanja 0,5 mS, tada će se servo okrenuti za 0 stupnjeva, 1,5 mS za 90 stupnjeva i 2,5 mS za 180 stupnjeva.

Dakle, moramo konfigurirati PWM i u tu ćemo svrhu koristiti Timer1.

  • Najprije odaberite TIM1 u odjeljku Odbrojavanje. Ovaj korak
  • Zatim iz odjeljka Način rada
    1. Odaberite Unutarnji sat Ovaj korak
    2. PWM generacija CH1 Ovaj korak
  • Zatim iz odjeljka Konfiguracija
    1. Postavite Predkaler na 160 Ovaj korak
    2. Postavite Counter Period na 2000 Ovaj korak
    3. Postavite Pulse na 50 Ovaj korak
  • Dodatno, iz konfiguracije sata postavite APB1 Timer satove na 16MHz. Ovaj korak

Sada, razgovarajmo malo o ovom koraku:

Frekvencija našeg mjerača vremena APB1 je 16MHz. Dakle, to znači da je za dobivanje 1 sekunde potrebno 16 000 000 krpelja. Međutim, predskaler smo postavili na 160. To znači da smo podijelili svoju frekvenciju s tim brojem i smanjili broj krpelja na 100 000. Dakle, za 1 sekundu potrebno nam je 100 000 krpelja. Međutim, potrebno nam je 20 ms vremenskog razdoblja PWM -a kao što smo ranije naveli. Dakle, na temelju jednostavne matematike, potrebno nam je 2000 krpelja za 20 ms. Dakle, postavljanjem brojača na 2000 određujemo razdoblje PWM signala koje je 20mS. Sada moramo odrediti broj krpelja za vrijeme uključivanja od 0,5 mS do 2,5 mS. Ovu jednadžbu možemo dobiti iz jednostavne matematike, a ona je:

Uključeno_Vrijeme = (Označite_broj / 100). Imajte na umu da je ovo vrijeme uključivanja koje mijenja kut servo motora. Dakle, ispod slike rezimiram ovaj korak. Ako imate bilo kakvih pitanja, napišite u komentarima i ja ću vam odgovoriti što je brže moguće.

Slika proračuna

Nakon što sve ovo napravite, generirajte kôd:)

Korak 3: Keil UVision kodiranje

Dakle, prvo odredimo što želimo učiniti? Želimo napisati funkciju koja prihvaća stupanj i zapisati je u servo. Dakle, kako ćemo to učiniti? Kao što smo već rekli, da bismo promijenili kut moramo promijeniti vrijeme na vrijeme. Naši kutovi mijenjaju se između [0, 180] i našeg broja krpelja što određuje vremenske promjene između [50, 250]. Dakle, potrebna nam je funkcija preslikavanja koja preslikava zadani kut u raspon broja oznaka. Na primjer, za 0 stupnjeva 50 krpelja, za 180 stupnjeva 250 krpelja i tako dalje … Pa napišimo našu funkciju mapiranja:

int karta (int st1, int fn1, int st2, int fn2, int vrijednost) {return (1,0*(vrijednost-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }

Ovo je naša funkcija mapiranja. Zanima li vas kako se izvodi? Onda pročitaj to. Dakle, uzimamo naše domete i vrijednost koju želimo mapirati.

Napisimo sada funkciju koja prihvaća kut i preslikava je u raspon krpelja:

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

Kao što vidite, ovaj kôd prihvaća kut i preslikava ga u raspon broja krpelja. Zatim se broj oznaka daje registru CCR1 koji kontrolira vrijeme uključivanja, pa tako i kut.

Međutim, kako bi sve ovo funkcioniralo, prvo pokrećemo pwm što se može učiniti samo retkom koda:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Dakle, imamo funkciju koja prihvaća kut i zapisuje ga u servo. Testirajmo ga i napiši našu funkciju brisanja koja je vrlo jednostavna:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Zakašnjenje (10); } za (int i = 180; i> = 0; i--) {servo_write (i); HAL_Zakašnjenje (10); }}

Dakle, samo izbroji do 180, a zatim do 0 i upiši ove vrijednosti u servo:) Dakle, da vidimo rezultat!

Korak 4: Rezultat:)

Dakle, ovo je kraj. Ako imate bilo kakvih pitanja, pitajte. Bit ću sretan što ću im odgovoriti. Hvala vam puno na čitanju i nadam se da se vidimo u sljedećem projektu:)

Preporučeni: