Obsah:

Ovládanie servomotora s MCU STM32F4 ARM: 4 kroky
Ovládanie servomotora s MCU STM32F4 ARM: 4 kroky

Video: Ovládanie servomotora s MCU STM32F4 ARM: 4 kroky

Video: Ovládanie servomotora s MCU STM32F4 ARM: 4 kroky
Video: Servo motor control using STM32 and PWM || HAL || CubeMx || Keil 2024, Júl
Anonim
Ovládanie servomotora s MCU STM32F4 ARM
Ovládanie servomotora s MCU STM32F4 ARM
Ovládanie servomotora s MCU STM32F4 ARM
Ovládanie servomotora s MCU STM32F4 ARM

Ahojte priatelia,:) V tomto projekte budeme ovládať servomotor s MCU STM32F4 ARM. V mojom prípade použijem objavnú dosku, ale ak pochopíte podstatu problému, môžete ju použiť pre každý MCU. Takže. Začnime:)

Krok 1: Požiadavky na hardvér a softvér

Čo sa týka hardvéru, budeme potrebovať:

  • MCU, čo je v mojom prípade doska STM32f4 Discovery
  • Bežný servomotor, ako SG90 alebo iný

Čo sa týka softvéru, budeme potrebovať:

  • STM32CubeMX
  • Keil uVision

Ak máte všetky tieto položky, prejdite na ďalší krok:)

Krok 2: Konfigurácia STM32CubeMX

Ako viete, na ovládanie servomotora potrebujeme signál PWM. Požiadavky na signál PWM sú tieto:

  • Perióda PWM musí byť 20 mS
  • Čas by mal byť medzi 0,5 mS až 2,5 mS. Keď je čas 0,5 mS, servo sa otočí o 0 stupňov, 1,5 mS o 90 stupňov a 2,5 mS o 180 stupňov.

Musíme teda nakonfigurovať PWM a na tento účel použijeme Timer1.

  • Najprv vyberte TIM1 v sekcii Časovače. Tento krok
  • Potom v sekcii Režim

    1. V tomto kroku vyberte položku Interné hodiny
    2. Generácia PWM CH1 Tento krok
  • Potom v sekcii Konfigurácia
    1. Nastavte Prescaler na 160 Tento krok
    2. Nastavte počítadlo na 2000 Tento krok
    3. V tomto kroku nastavte Pulse na 50
  • V konfigurácii hodín navyše nastavte hodiny časovača APB1 na 16 MHz. Tento krok

Teraz sa trochu porozprávajme o tomto kroku:

Frekvencia nášho časovača APB1 je 16 MHz. To znamená, že na 1 sekundu je potrebné 16 000 000 kliešťov. Náš prescaler však nastavíme na 160. To znamená, že vydelíme našu frekvenciu týmto číslom a znížime počet kliešťov na 100 000. Takže na 1 sekundu potrebujeme 100 000 kliešťov. Potrebujeme však 20 mS periódy PWM, ako sme už uviedli. Na základe jednoduchej matematiky teda potrebujeme 2 000 kliešťov za 20 mS. Takže nastavením doby počítadla na 2000 určíme periódu signálu PWM, ktorá je 20 mS. Teraz musíme určiť číslo začiarknutia pre časy zapnutia od 0,5 mS do 2,5 mS. Túto rovnicu môžeme získať z jednoduchej matematiky a je to:

On_Time = (Tick_Number / 100). Majte na pamäti, že toto je on_time, ktorý mení uhol servomotora. Takže pod obrázkom sumarizujem tento krok. Ak máte akékoľvek otázky, napíšte do komentárov a ja vám odpoviem čo najskôr.

Obrázok výpočtov

Po všetkých týchto krokoch vygenerujte kód:)

Krok 3: Kódovanie Keil UVision

Najprv si teda určme, čo chceme robiť? Chceme napísať funkciu, ktorá akceptuje stupeň, a napísať ju na servo. Ako to teda urobíme? Ako sme už povedali, aby sme zmenili uhol, musíme zmeniť čas. Naše uhly sa menia medzi [0, 180] a počtom kliešťov, čo určuje časové zmeny medzi [50, 250]. Potrebujeme teda mapovaciu funkciu, ktorá mapuje daný uhol na rozsah počtu kliešťov. Napríklad pre 0 stupňov 50 kliešte, pre 180 stupňov 250 kliešte a tak ďalej … Napíšte teda našu mapovaciu funkciu:

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

Toto je naša funkcia mapovania. Zaujíma vás, ako sa to odvodzuje? Potom si to prečítajte. Zoberieme teda svoje rozsahy a hodnotu, ktorú chceme mapovať.

Teraz napíšeme funkciu, ktorá akceptuje uhol a mapuje ho na rozsah kliešťov:

neplatné servo_write (vnútorný uhol) {htim1. Inštancia-> CCR1 = mapa (0, 180, 50, 250, uhol); }

Ako vidíte, tento kód akceptuje uhol a mapuje ho na rozsah počtu kliešťov. Potom je počet kliešťov daný registru CCR1, ktorý riadi uhol času a tak.

Aby však všetky tieto funkcie fungovali, najskôr spustíme príkaz pwm, ktorý je možné vykonať iba pomocou riadku kódu:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Máme teda funkciu, ktorá akceptuje uhol a zapíše ho na servo. Vyskúšame to a napíšeme našu funkciu zametania, ktorá je veľmi jednoduchá:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Zdržanie (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_Zdržanie (10); }}

Odpočítajte teda do 180 a potom do 0 a zapíšte tieto hodnoty na servo:) Pozrime sa teda na výsledok!

Krok 4: Výsledok:)

Takže toto je koniec. Ak máte akékoľvek otázky, opýtajte sa. Rád im odpoviem. Ďakujem veľmi pekne za prečítanie a dúfam, že sa uvidíme v ďalšom projekte:)

Odporúča: