Kazalo:

Krmiljenje servo motorja s STM32F4 ARM MCU: 4 koraki
Krmiljenje servo motorja s STM32F4 ARM MCU: 4 koraki

Video: Krmiljenje servo motorja s STM32F4 ARM MCU: 4 koraki

Video: Krmiljenje servo motorja s STM32F4 ARM MCU: 4 koraki
Video: Урок 86: Управление положением серводвигателя с помощью потенциометра (английские субтитры) 2024, Julij
Anonim
Krmiljenje servo motorja s STM32F4 ARM MCU
Krmiljenje servo motorja s STM32F4 ARM MCU
Krmiljenje servo motorja s STM32F4 ARM MCU
Krmiljenje servo motorja s STM32F4 ARM MCU

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

    1. Izberite notranjo uro Ta korak
    2. PWM Generacija CH1 Ta korak
  • Nato v razdelku Konfiguracija
    1. Ta korak nastavite na 160
    2. Ta korak nastavite na števec
    3. 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: