Obsah:
2025 Autor: John Day | [email protected]. Naposledy zmenené: 2025-01-23 15:05
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
- V tomto kroku vyberte položku Interné hodiny
- Generácia PWM CH1 Tento krok
- Potom v sekcii Konfigurácia
- Nastavte Prescaler na 160 Tento krok
- Nastavte počítadlo na 2000 Tento krok
- 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:
Návod na ovládanie servomotora Arduino: 4 kroky
Návod na ovládanie servomotora Arduino: Hej, chlapci! vitajte v mojom novom návode, dúfam, že sa vám už páčilo moje predchádzajúce inštruovateľné " ovládanie veľkého krokového motora ". Dnes uverejňujem informatívny návod, ktorý vás naučí základy akéhokoľvek ovládania servomotora, už som zverejnil video
Výučba akcelerometra Arduino: Ovládanie lodného mosta pomocou servomotora: 5 krokov
Výukový program akcelerometra Arduino: Ovládanie lodného mosta pomocou servomotora: Senzory akcelerometra sú v súčasnosti súčasťou väčšiny našich smartfónov, aby im poskytli najrozmanitejšie využitie a možnosti, ktoré denne používame, bez toho, aby sme vedeli, že za to môže akcelerometer. Jednou z týchto schopností je ovládací prvok
ESP8266 RGB LED STRIP WIFI ovládanie - NODEMCU Ako IR diaľkové ovládanie pre LED pás ovládané cez Wifi - Ovládanie smartfónu RGB LED STRIP: 4 kroky
ESP8266 RGB LED STRIP WIFI ovládanie | NODEMCU Ako IR diaľkové ovládanie pre LED pás ovládané cez Wifi | Ovládanie smartfónu RGB LED STRIP: Ahoj, v tomto návode sa naučíme, ako používať nodemcu alebo esp8266 ako IR diaľkové ovládanie na ovládanie RGB LED pásu a Nodemcu budete ovládať smartfónom cez wifi. V zásade teda môžete RGB LED STRIP ovládať pomocou svojho smartfónu
Výukový program Arduino - Ovládanie servomotora pomocou joysticku: 4 kroky
Výukový program Arduino - Ovládanie servomotora pomocou joysticku: V tomto návode sa naučíme používať servo s joystickom. 1 ks servomotora budeme ovládať 1 joystickom. Projekty robotických ramien môžete implementovať podľa tohto tutoriálu. Pri práci… budeme samozrejme používať externú batériu / napájanie
Ovládanie RC servomotora pomocou Arduina a dvoch momentálnych spínačov: 4 kroky
Ovládanie RC servomotora pomocou Arduina a dvoch momentálnych spínačov: Názov hovorí za všetko. Ovládanie servomotora RC auta pomocou Arduina a niektorých rezistorov, prepojovacích káblov a dvoch hmatových spínačov. Urobil som to druhý deň, keď som dostal svoje Arduino, takže som na seba celkom hrdý