Kazalo:
2025 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2025-01-23 15:08
Pozdravljeni spet prijatelji:) Torej, v tem projektu bomo upravljali servo motor s STM32F4 ARM MCU. V mojem primeru bom uporabil desko za odkrivanje, če pa razumete bistvo problema, jo lahko uporabite za vsak MCU. Torej. Začnimo:)
Korak 1: Strojne in programske zahteve
Kar zadeva strojno opremo, potrebujemo:
- MCU, ki je v mojem primeru plošča STM32f4 Discovery
- Običajen servo motor, kot je SG90 ali kateri koli drug
Kar zadeva programsko opremo, potrebujemo:
- STM32CubeMX
- Keil uVision
Če imate vse to, pojdite na naslednji korak:)
2. korak: Konfiguracija STM32CubeMX
Kot veste, za krmiljenje servo motorja potrebujemo signal PWM. Zahteve glede signala PWM so takšne:
- Obdobje PWM mora biti 20 mS
- Čas mora biti med 0,5 mS in 2,5 mS. Ko je čas vklopa 0,5 mS, se bo servo obrnil za 0 stopinj, 1,5 mS za 90 stopinj in 2,5 mS za 180 stopinj.
Zato moramo konfigurirati PWM in v ta namen bomo uporabili Timer1.
- Najprej v razdelku Časovniki izberite TIM1. Ta korak
-
Nato v razdelku Način
- Izberite notranjo uro Ta korak
- PWM Generacija CH1 Ta korak
- Nato v razdelku Konfiguracija
- Ta korak nastavite na 160
- Ta korak nastavite na števec
- V tem koraku nastavite Pulse na 50
- Poleg tega iz nastavitve ure nastavite ure APB1 Timer na 16MHz. Ta korak
Zdaj pa se pogovorimo malo o tem koraku:
Frekvenca naše časovne ure APB1 je 16 MHz. To pomeni, da je za 1 sekundo potrebno 16 000 000 klopov. Vendar pa smo prednastavko prednastavil na 160. To pomeni, da smo frekvenco razdelili na to število in zmanjšali število klopov na 100 000. Torej, za 1 sekundo potrebujemo 100 000 klopov. Vendar pa potrebujemo 20 mS obdobja PWM, kot smo že povedali. Na podlagi preproste matematike potrebujemo 2000 klopov za 20 mS. Tako z nastavitvijo številskega obdobja na 2000 določimo obdobje PWM signala, ki je 20 mS. Zdaj moramo določiti številko kljukic za čas vklopa od 0,5 mS do 2,5 mS. To enačbo lahko dobimo iz preproste matematike in je:
On_Time = (Tick_Number / 100). Upoštevajte, da je to čas vklopa, ki spremeni kot servo motorja. Torej, pod sliko povzemam ta korak. Če imate kakršno koli vprašanje, napišite v komentarje in odgovoril bom v najkrajšem možnem času.
Slika izračunov
Ko vse to naredite, ustvarite kodo:)
Korak 3: Keil UVision kodiranje
Torej, najprej ugotovimo, kaj želimo narediti? Želimo napisati funkcijo, ki sprejema stopnjo, in jo zapisati v servo. Torej, kako bomo to storili? Kot smo že povedali, moramo za spremembo kota spremeniti čas. Naši koti se spreminjajo med [0, 180] in številom klopov, kar časovno določa spremembe med [50, 250]. Zato potrebujemo funkcijo preslikave, ki preslika določen kot v obseg števila klopov. Na primer, za 0 stopinj 50 klopov, za 180 stopinj 250 klopov in tako naprej … Torej zapišimo našo funkcijo preslikave:
int zemljevid (int st1, int fn1, int st2, int fn2, int vrednost) {return (1,0*(vrednost-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }
To je naša funkcija preslikave. Vas zanima, kako izhaja? Potem preberi tole. Torej vzamemo svoje dosege in vrednost, ki jo želimo preslikati.
Sedaj napišemo funkcijo, ki sprejme kot in jo preslika v obseg klopov:
void servo_write (int kot) {htim1. Instance-> CCR1 = zemljevid (0, 180, 50, 250, kot); }
Kot lahko vidite, ta koda sprejema kot in jo preslika v obseg števila kljukic. Nato se število klopov poda v register CCR1, ki nadzoruje čas vklopa in tako kot.
Da pa bi vse to delovalo, najprej zaženemo pwm, ki ga lahko naredimo le z vrstico kode:
HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);
Torej imamo funkcijo, ki sprejme kot in jo zapiše na servo. Preizkusimo in napišemo funkcijo pometanja, ki je zelo enostavna:
void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Zamuda (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_Zamuda (10); }}
Torej, šteje samo do 180 in nato navzdol do 0 ter te vrednosti zapiše v servo:) Torej, poglejmo rezultat!
4. korak: rezultat:)
Torej, to je konec. Če imate kakršno koli vprašanje, vprašajte. Z veseljem bom odgovoril nanje. Najlepša hvala za branje in upam, da se vidimo v naslednjem projektu:)
Priporočena:
Krmiljenje enosmernega motorja z modulom optičnega senzorja dajalnika FC-03: 7 korakov
Upravljajte enosmerni motor z modulom optičnega senzorja dajalnika FC-03: V tej vadnici se bomo naučili šteti prekinitve optičnega dajalnika z enosmernim motorjem, zaslonom OLED in Visuinom. Oglejte si video
Arduino krmiljenje hitrosti in smeri enosmernega motorja z uporabo potenciometra, OLED zaslona in gumbov: 6 korakov
Arduino krmiljenje hitrosti in smeri enosmernega motorja z uporabo potenciometra, OLED zaslona in gumbov: V tej vadnici se bomo naučili uporabljati gonilnik DC MOTOR CONTROL L298N in potenciometer za nadzor hitrosti in smeri enosmernega motorja z dvema gumboma in prikazati vrednost potenciometra na zaslonu OLED. Oglejte si predstavitveni video
Arduino vadnica - krmiljenje servo motorja z igralno palico: 4 koraki
Vadnica Arduino - Nadzor servo motorja z igralno palico: V tej vadnici se bomo naučili uporabljati servo z igralno palico. Nadzorujemo 1 kos servo motorja z 1 krmilno palčko, svoje projekte robotskih ročic pa lahko izvajate glede na to vadnico. Seveda bomo pri tem uporabili zunanjo baterijo / napajanje
Arduino vadnica - krmiljenje servo motorja s potenciometrom: 5 korakov
Vadnica Arduino - krmiljenje servo motorja s potenciometrom: Ta navodila so napisana različica mojega " Arduina: Kako upravljati servo motor s potenciometrom " YouTube videoposnetek, ki sem ga pred kratkim naložil. Toplo vam priporočam, da to preverite. Obiščite kanal YouTube
Krmiljenje servo motorja RC z Arduinom in dvema trenutnima stikaloma: 4 koraki
Upravljanje servo motorja RC z Arduinom in dvema trenutnima stikaloma: Ime pove vse. Upravljanje servo motorja RC za avto z Arduinom in nekaterimi upori, mostičnimi žicami in dvema taktilnima stikaloma. To sem naredil drugi dan, ko sem dobil svoj Arduino, zato sem zelo ponosen nase