Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-23 14:37
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
- Odaberite Interni sat Ovaj korak
- PWM generacija CH1 Ovaj korak
- Zatim iz odjeljka Konfiguracija
- Postavite Predkaler na 160 Ovaj korak
- Postavite Counter Period na 2000 Ovaj korak
- 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:
Upravljanje koračnim motorom: 5 koraka
Upravljanje koračnim motorom: Ovaj vodič vrijedi i ako koristimo Arduino i oboje koristeći Drivemall ploču ispod veze za izgradnju Drivemall -a. Prednost davanja prednosti Drivemall -u u odnosu na klasičnu Arduino ploču je smanjenje složenosti veza
Upravljanje motorom pomoću Magicbita [Magicblocks]: 10 koraka
Upravljanje motorom pomoću Magicbita [Magicblocks]: Ovaj vodič će vas naučiti upravljati motorom pomoću Magicbita koristeći Magicblocks
Korištenje mjerača vremena 556 za upravljanje koračnim motorom: 5 koraka
Korištenje mjerača vremena 556 za pogon koračnog motora: Ova instrukcija će objasniti kako tajmer 556 može upravljati koračnim motorom. Za ovaj krug nije potreban kôd
Android (remotexy) korisnički interfejs za upravljanje servo motorom koristeći Arduino i Bluetooth: 7 koraka (sa slikama)
Android (remotexy) korisnički interfejs za upravljanje servo motorom pomoću Arduina i Bluetootha: U ovom uputstvu ću vam dati brzi korak da napravite Android korisničko sučelje koristeći Remotexy Interface Maker za upravljanje Servo motorom povezanim na Arduino Mega putem Bluetooth -a. Ovaj video prikazuje kako će korisničko sučelje kontrolirati brzinu i položaj servo motora
Upravljanje RC servo motorom s Arduinom i dva trenutna prekidača: 4 koraka
Upravljanje RC servo motorom s Arduinom i dva trenutna prekidača: Naziv govori sve. Upravljanje RC servo motorom za automobile s Arduinom i nekim otpornicima, kratkospojnicima i dva taktilna prekidača. Ovo sam napravio drugi dan kada sam dobio svoj Arduino, pa sam prilično ponosan na sebe