Obsah:
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-23 14:38
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
- Zvolte interní hodiny Tento krok
- Generování PWM CH1 Tento krok
-
Poté v sekci Konfigurace
- Nastavte Prescaler na 160 Tento krok
- Nastavit období čítače na 2000 Tento krok
- 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:
Návod k ovládání servomotoru Arduino: 4 kroky
Návod k ovládání servomotoru Arduino: Čau lidi! vítejte v mém novém tutoriálu, doufám, že se vám už líbil můj předchozí instruktážní " ovládání velkého krokového motoru ". Dnes zveřejňuji tento informativní návod, který vás naučí základy jakéhokoli ovládání servomotoru, již jsem zveřejnil video
Super snadný způsob ovládání servomotoru pomocí Arduina: 8 kroků
Super snadný způsob ovládání servomotoru pomocí Arduina: V tomto tutoriálu použijeme Servo Motor a Arduino UNO a Visuino k ovládání polohy stupně servomotoru pomocí pouze několika komponent, díky čemuž bude tento projekt velmi jednoduchý. Podívejte se na ukázkové video
Rotující ventilátor pomocí servomotoru a ovládání rychlosti: 6 kroků
Rotující ventilátor pomocí servomotoru a ovládání rychlosti: V tomto tutoriálu se naučíme otáčet ventilátor s nastavitelnou rychlostí pomocí servomotoru, potenciometru, arduina a Visuina. Podívejte se na video
Výukový program Arduino - ovládání servomotoru pomocí joysticku: 4 kroky
Arduino Tutorial - Servo Motor Control with Joystick: V tomto tutoriálu se naučíme používat servo s Joystickem. Ovládáme 1 ks servomotoru pomocí 1 joysticku. Projekty své robotické paže můžete implementovat podle tohoto tutoriálu. Samozřejmě budeme používat externí baterii / napájení při
Ovládání RC servomotoru pomocí Arduina a dvou momentálních spínačů: 4 kroky
Ovládání RC servomotoru pomocí Arduina a dvou momentálních spínačů: Název mluví za vše. Ovládání servomotoru RC auta pomocí Arduina a některých odporů, propojovacích vodičů a dvou hmatových spínačů. Udělal jsem to druhý den, kdy jsem dostal Arduino, takže jsem na sebe docela hrdý