Tartalomjegyzék:

Szervo motorvezérlés STM32F4 ARM MCU -val: 4 lépés
Szervo motorvezérlés STM32F4 ARM MCU -val: 4 lépés

Videó: Szervo motorvezérlés STM32F4 ARM MCU -val: 4 lépés

Videó: Szervo motorvezérlés STM32F4 ARM MCU -val: 4 lépés
Videó: #1 Say NO to ARDUINO! New ARM Microcontroller Programming and Circuit Building Series 2024, November
Anonim
Szervo motorvezérlés STM32F4 ARM MCU -val
Szervo motorvezérlés STM32F4 ARM MCU -val
Szervo motorvezérlés STM32F4 ARM MCU -val
Szervo motorvezérlés STM32F4 ARM MCU -val

Üdv ismét haverok:) Tehát ebben a projektben egy szervo motort fogunk vezérelni STM32F4 ARM MCU -val. Esetemben a felfedező táblát fogom használni, de ha felfogja a probléma lényegét, akkor minden MCU -ra alkalmazhatja. Így. Lássunk neki:)

1. lépés: Hardver- és szoftverkövetelmények

Ami a hardvert illeti, szükségünk lesz:

  • Egy MCU, ami az én esetemben STM32f4 Discovery board
  • Egy közös szervomotor, mint az SG90 vagy bármely más

Ami a szoftvert illeti, szükségünk lesz:

  • STM32CubeMX
  • Keil uVision

Ha mindez megvan, ugorjon a következő lépésre:)

2. lépés: STM32CubeMX konfiguráció

Mint tudják, a szervomotor vezérléséhez PWM jelre van szükségünk. A PWM jelre vonatkozó követelmények a következők:

  • A PWM periódusnak 20 mS -nak kell lennie
  • Az időnek 0,5 mS és 2,5 mS között kell lennie. Ha az idő 0,5 mS, akkor a szervó 0 fokot, 1,5 mS 90 fokot és 2,5 mS 180 fokot fog fordítani.

Tehát be kell állítanunk a PWM -et, és ehhez a Timer1 -et fogjuk használni.

  • Először válassza a TIM1 lehetőséget az Időzítők részben. Ezt a lépést
  • Ezután a Mód szakaszból

    1. Válassza a Belső óra lehetőséget
    2. PWM generáció CH1 Ez a lépés
  • Ezután a Konfiguráció részben

    1. Állítsa az előskálázót 160 -ra Ez a lépés
    2. Állítsa a számlálási periódust 2000 -re Ez a lépés
    3. Pulzus beállítása 50 -re Ez a lépés
  • Ezenkívül az Óra konfigurációból állítsa az APB1 időzítő óráját 16 MHz -re. Ezt a lépést

Most beszéljünk egy kicsit erről a lépésről:

APB1 időzítőnk frekvenciája 16MHz. Tehát ez azt jelenti, hogy 16 000 000 kullancs szükséges 1 másodperc eléréséhez. Az előskálázót azonban 160 -ra állítottuk. Ez azt jelenti, hogy elosztjuk gyakoriságunkat ezzel a számmal, és 100 000 -re csökkentjük a kullancsok számát. Tehát 1 másodpercig 100 000 kullancsra van szükségünk. Mindazonáltal szükségünk van 20 mS PWM időszakra, amint azt korábban említettük. Tehát egyszerű matematika alapján 2000 kullancsra van szükségünk 20 mS -ért. Tehát a számláló periódus 2000 -re állításával meghatározzuk a PWM jel periódusát, amely 20 mS. Most meg kell határoznunk a kullancs számát a bekapcsolási idők eléréséhez 0,5 mS és 2,5 mS között. Ezt az egyenletet egyszerű matematikából kaphatjuk meg, és ez:

On_Time = (Tick_Number / 100). Ne feledje, hogy ez az on_time, amely megváltoztatja a szervomotor szögét. Tehát az alábbi képen összefoglalom ezt a lépést. Ha bármilyen kérdése van, írjon megjegyzéseket, és a lehető leggyorsabban válaszolok.

Számítások képe

Mindezek után készíts kódot:)

3. lépés: Keil UVision kódolás

Tehát először határozzuk meg, mit akarunk tenni? Azt akarjuk, hogy írjunk egy függvényt, amely elfogadja a fokozatot, és írja be a szervóba. Szóval, hogyan fogjuk ezt megtenni? Amint azt korábban mondtuk, a szög megváltoztatásához meg kell változtatnunk az időben. A szögeink [0, 180] és a kullancsok száma között változnak, ami meghatározza az időbeli változásokat [50, 250] között. Tehát szükségünk van egy leképezési funkcióra, amely az adott szöget a kullancsok tartományához rendeli. Például 0 fok 50 kullancs, 180 fok 250 kullancs és így tovább … Írjuk le tehát a térképészeti függvényünket:

int térkép (int st1, int fn1, int st2, int fn2, int value) {return (1,0*(érték-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }

Ez a mi térképészeti funkciónk. Érdekel, hogyan származik? Akkor olvasd el azt. Tehát vesszük a tartományokat és a feltérképezni kívánt értéket.

Írjunk most egy függvényt, amely elfogadja a szöget, és leképezi a kullancstartományra:

void servo_write (int szög) {htim1. Instance-> CCR1 = térkép (0, 180, 50, 250, szög); }

Mint látható, ez a kód elfogadja a szöget, és a kullancsok számának tartományához rendeli hozzá. Ezután a kullancsok száma megadásra kerül a CCR1 regiszterben, amely szabályozza a bekapcsolási időt és a szöget.

Annak érdekében azonban, hogy mindezek működjenek, először elindítjuk a pwm -t, amelyet csak egy kódsor segítségével lehet megtenni:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Tehát van egy függvényünk, amely elfogadja a szöget és írja be a szervóba. Próbáljuk ki, és írjuk le a sweep funkciónkat, ami nagyon egyszerű:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Késleltetés (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_Késleltetés (10); }}

Tehát csak 180 -ig, majd 0 -ig számoljon, és írja be ezeket az értékeket a szervóba:) Szóval, lássuk az eredményt!

4. lépés: Az eredmény:)

Szóval, ez a vég. Ha bármilyen kérdése van, kérjük, tegye fel. Örömmel válaszolok rájuk. Nagyon köszönöm, hogy elolvastad, és remélem, találkozunk a következő projektben:)

Ajánlott: