Sadržaj:

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

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

Video: Upravljanje servo motorom sa STM32F4 ARM MCU: 4 koraka
Video: Управление 32 серводвигателями с PCA9685 и ESP32 - V4 2024, Juli
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

Zdravo 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. Dakle. hajde da počnemo:)

Korak 1: Hardverski i softverski zahtjevi

Š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, pređ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 period mora biti 20 mS
  • Na vrijeme mora biti između 0,5 mS do 2,5 mS. Kada 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.

  • Prvo odaberite TIM1 u odjeljku Tajmeri. Ovaj korak
  • Zatim iz odjeljka Režim

    1. Odaberite Interni 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
  • Osim toga, iz konfiguracije sata postavite APB1 Timer na 16MHz. Ovaj korak

Hajde sada razgovarati malo o ovom koraku:

Frekvencija takta našeg tajmera 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, podijelili smo našu 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 PWM perioda kao što smo ranije naveli. Dakle, na osnovu jednostavne matematike, potrebno nam je 2000 krpelja za 20 ms. Dakle, postavljanjem brojača na 2000 određujemo period PWM signala koji je 20mS. Sada moramo odrediti broj kvačice za vrijeme uključivanja od 0.5mS do 2.5mS. Ovu jednadžbu možemo dobiti iz jednostavne matematike, a ona je:

On_Time = (Tick_Number / 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, pišite u komentarima i ja ću vam odgovoriti što je brže moguće.

Slika proračuna

Nakon što sve ovo učinite, generirajte kôd:)

Korak 3: Keil UVision kodiranje

Dakle, prvo odredimo šta želimo učiniti? Želimo napisati funkciju koja prihvaća stupanj i upisati 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 se mijenjaju između [0, 180] i našeg broja krpelja što određuje vrijeme promjene između [50, 250]. Dakle, potrebna nam je funkcija preslikavanja koja preslikava dati 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 mapa (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 angle) {htim1. Instance-> CCR1 = mapa (0, 180, 50, 250, kut); }

Kao što vidite, ovaj kôd prihvaća kut i preslikava ga u raspon broja oznaka. 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 linijom koda:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

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

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Odgoda (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_Odgoda (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. Biće mi drago da odgovorim na njih. Hvala vam puno na čitanju i nadam se da se vidimo u sljedećem projektu:)

Preporučuje se: