Obsah:

Ovládání servomotoru s MCU STM32F4 ARM: 4 kroky
Ovládání servomotoru s MCU STM32F4 ARM: 4 kroky

Video: Ovládání servomotoru s MCU STM32F4 ARM: 4 kroky

Video: Ovládání servomotoru s MCU STM32F4 ARM: 4 kroky
Video: Servo ovládané microbitem 2024, Červenec
Anonim
Řízení servomotoru s MCU STM32F4 ARM
Řízení servomotoru s MCU STM32F4 ARM
Řízení servomotoru s MCU STM32F4 ARM
Řízení servomotoru s MCU STM32F4 ARM

Ještě jednou ahoj kamarádi:) V tomto projektu tedy budeme ovládat servomotor s MCU STM32F4 ARM. V mém případě použiji objevovací desku, ale pokud pochopíte podstatu problému, můžete ji použít pro každý MCU. Tak. Začněme:)

Krok 1: Hardwarové a softwarové požadavky

Co se týče hardwaru, budeme potřebovat:

  • MCU, což je v mém případě deska STM32f4 Discovery
  • Běžný servomotor, jako SG90 nebo jakýkoli jiný

Co se týče softwaru, budeme potřebovat:

  • STM32CubeMX
  • Keil uVision

Pokud máte všechny tyto, přejděte k dalšímu kroku:)

Krok 2: Konfigurace STM32CubeMX

Jak víte, pro ovládání servomotoru potřebujeme signál PWM. Požadavky na signál PWM jsou následující:

  • Perioda PWM musí být 20 mS
  • Čas musí být mezi 0,5 mS až 2,5 mS. Když je čas 0,5 mS, servo se otočí o 0 stupňů, 1,5 mS o 90 stupňů a 2,5 mS o 180 stupňů.

Musíme tedy nakonfigurovat PWM a za tímto účelem použijeme Timer1.

  • Nejprve vyberte TIM1 v sekci Časovače. Tento krok
  • Poté v sekci Režim

    1. Zvolte interní hodiny Tento krok
    2. Generování PWM CH1 Tento krok
  • Poté v sekci Konfigurace

    1. Nastavte Prescaler na 160 Tento krok
    2. Nastavit období čítače na 2000 Tento krok
    3. V tomto kroku nastavte Pulse na 50
  • Navíc z konfigurace hodin nastavte hodiny časovače APB1 na 16 MHz. Tento krok

Pojďme si nyní o tomto kroku trochu promluvit:

Frekvence našich časovačů APB1 je 16 MHz. Znamená to tedy, že k získání 1 sekundy je zapotřebí 16 000 000 klíšťat. Náš prescaler však nastavíme na 160. To znamená, že dělíme naši frekvenci tímto číslem a snížíme počet ticků až na 100 000. Takže na 1 sekundu potřebujeme 100 000 ticků. Potřebujeme však 20 mS období PWM, jak jsme uvedli dříve. Na základě jednoduché matematiky tedy potřebujeme 2 000 tiků za 20 mS. Nastavením doby čítače na 2000 určíme periodu signálu PWM, která je 20 mS. Nyní potřebujeme určit počet zaškrtnutí pro časy zapnutí od 0,5 mS do 2,5 mS. Tuto rovnici můžeme získat z jednoduché matematiky a je to:

On_Time = (Tick_Number / 100). Mějte na paměti, že toto je on_time, který mění úhel servomotoru. Takže pod obrázkem shrnuji tento krok. Pokud máte nějaké dotazy, napište do komentářů a já vám odpovím co nejrychleji.

Obrázek výpočtů

Po provedení všech těchto kroků vygenerujte kód:)

Krok 3: Keil UVision Coding

Pojďme si tedy nejprve určit, co chceme dělat? Chceme napsat funkci, která přijímá stupeň, a zapsat ji na servo. Jak to tedy uděláme? Jak jsme řekli dříve, abychom mohli změnit úhel, musíme změnit čas. Naše úhly se mění mezi [0, 180] a počtem klíšťat, což určuje časové změny mezi [50, 250]. Potřebujeme tedy mapovací funkci, která mapuje daný úhel na rozsah počtu tiků. Například pro 0 stupňů 50 ticků, pro 180 stupňů 250 ticků a tak dále … Pojďme tedy napsat naši mapovací funkci:

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še mapovací funkce. Zajímá vás, jak se odvozuje? Pak si to přečtěte. Vezmeme tedy naše rozsahy a hodnotu, kterou chceme namapovat.

Nyní zapíšeme funkci, která přijímá úhel a mapuje ji na rozsah zaškrtnutí:

neplatné servo_write (int úhel) {htim1. Instance-> CCR1 = mapa (0, 180, 50, 250, úhel); }

Jak vidíte, tento kód přijímá úhel a mapuje jej na rozsah počtu zaškrtnutí. Poté je počet ticků uveden do registru CCR1, který řídí úhel zapnutí a tak dále.

Aby však všechny tyto fungovaly, nejprve spustíme pwm, což lze provést pouze řádkem kódu:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Máme tedy funkci, která přijímá úhel a zapisuje jej na servo. Vyzkoušíme to a napíšeme naši funkci rozmítání, která je velmi snadná:

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

Počítá se tedy do 180 a pak do 0 a zapíše se tyto hodnoty na servo:) Podívejme se tedy na výsledek!

Krok 4: Výsledek:)

Tak tohle je konec. Pokud máte nějaké otázky, ptejte se. Budu rád, když jim na to odpovím. Děkuji moc za přečtení a doufám, že se uvidíme v dalším projektu:)

Doporučuje: