Satura rādītājs:

Servo motora vadība ar STM32F4 ARM MCU: 4 soļi
Servo motora vadība ar STM32F4 ARM MCU: 4 soļi

Video: Servo motora vadība ar STM32F4 ARM MCU: 4 soļi

Video: Servo motora vadība ar STM32F4 ARM MCU: 4 soļi
Video: Управление 32 сервомоторами с помощью PCA9685 и Arduino: V3 2024, Jūlijs
Anonim
Servo motora vadība ar STM32F4 ARM MCU
Servo motora vadība ar STM32F4 ARM MCU
Servo motora vadība ar STM32F4 ARM MCU
Servo motora vadība ar STM32F4 ARM MCU

Sveiki vēlreiz draugi:) Tātad, šajā projektā mēs kontrolēsim servomotoru ar STM32F4 ARM MCU. Manā gadījumā es izmantošu atklāšanas paneli, bet, ja jūs saprotat problēmas būtību, varat to izmantot katram MCU. Tātad. sāksim:)

1. darbība. Prasības aparatūrai un programmatūrai

Aparatūras ziņā mums būs nepieciešams:

  • MCU, kas manā gadījumā ir STM32f4 atklāšanas dēlis
  • Parasts servomotors, piemēram, SG90 vai jebkurš cits

Runājot par programmatūru, mums būs nepieciešams:

  • STM32CubeMX
  • Keil uVision

Ja jums tas viss ir, pārejiet pie nākamās darbības:)

2. darbība: STM32CubeMX konfigurācija

Kā jūs zināt, lai kontrolētu servomotoru, mums ir nepieciešams PWM signāls. PWM signāla prasības ir šādas:

  • PWM periodam jābūt 20 mS
  • Laika intervālam jābūt no 0,5 līdz 2,5 mS. Kad laiks ir 0,5 mS, tad servo pagriezīsies par 0 grādiem, 1,5 mS par 90 grādiem un 2,5 mS par 180 grādiem.

Tātad, mums ir jākonfigurē PWM, un šim nolūkam mēs izmantosim taimeri 1.

  • Pirmkārt, sadaļā Taimeri izvēlieties TIM1. Šis solis
  • Pēc tam sadaļā Mode

    1. Izvēlieties Iekšējais pulkstenis Šis solis
    2. PWM Generation CH1 Šis solis
  • Pēc tam sadaļā Konfigurācija
    1. Iestatiet Prescaler uz 160 Šis solis
    2. Iestatīt skaitītāja periodu uz 2000 Šis solis
    3. Iestatiet impulsu uz 50 Šis solis
  • Turklāt no pulksteņa konfigurācijas iestatiet APB1 taimera pulksteņus uz 16 MHz. Šis solis

Tagad parunāsim mazliet par šo soli:

Mūsu APB1 taimera pulksteņa frekvence ir 16 MHz. Tātad, tas nozīmē, ka 1 sekundes iegūšanai ir nepieciešami 16 000 000 ērču. Tomēr mēs iestatījām savu prescaler uz 160. Tas nozīmē, ka mēs dalām savu frekvenci ar šo skaitli un samazinājām ērču skaitu līdz 100 000. Tātad, 1 sekundi mums vajag 100 000 ērču. Tomēr mums ir nepieciešams 20 mS PWM periods, kā mēs teicām iepriekš. Tātad, pamatojoties uz vienkāršu matemātiku, mums vajag 2000 ērču 20mS. Tātad, iestatot skaitītāja periodu uz 2000, mēs nosakām PWM signāla periodu, kas ir 20mS. Tagad mums ir jānosaka ērču skaits, lai saņemtu ieslēgšanās laiku no 0,5 mS līdz 2,5 mS. Mēs varam iegūt šo vienādojumu no vienkāršas matemātikas, un tas ir:

Ieslēgšanas laiks = (atzīme_skaitlis / 100). Paturiet prātā, ka tas ir on_time, kas maina servodzinēja leņķi. Tātad, zem attēla es apkopoju šo soli. Ja jums ir kādi jautājumi, rakstiet komentāros, un es atbildēšu pēc iespējas ātrāk.

Aprēķinu attēls

Pēc visu šo darbību veikšanas ģenerējiet kodu:)

3. darbība: Keil UVision kodēšana

Tātad, vispirms noteiksim, ko mēs vēlamies darīt? Mēs vēlamies uzrakstīt funkciju, kas pieņem grādu, un ierakstīt to servo. Tātad, kā mēs to darīsim? Kā jau teicām iepriekš, lai mainītu leņķi, mums ir jāmaina laiks. Mūsu leņķi mainās starp [0, 180] un ērču skaitu, kas nosaka laika izmaiņas starp [50, 250]. Tātad, mums ir nepieciešama kartēšanas funkcija, kas kartē noteikto leņķi ar ērču skaita diapazonu. Piemēram, 0 grādu 50 ērcēm, 180 grādu 250 ērcēm un tā tālāk … Tātad, uzrakstīsim mūsu kartēšanas funkciju:

int karte (int st1, int fn1, int st2, int fn2, int value) {return (1,0*(vērtība-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }

Šī ir mūsu kartēšanas funkcija. Vai jūs interesē, kā tas tiek iegūts? Tad izlasiet to. Tātad, mēs ņemam savus diapazonus un vērtību, ko vēlamies kartēt.

Tagad uzrakstīsim funkciju, kas pieņem leņķi un kartē to ērču diapazonam:

void servo_write (int leņķis) {htim1. Instance-> CCR1 = karte (0, 180, 50, 250, leņķis); }

Kā redzat, šis kods pieņem leņķi un kartē to ērču skaita diapazonā. Pēc tam ērču skaits tiek piešķirts CCR1 reģistram, kas kontrolē ieslēgšanas laiku un tā leņķi.

Tomēr, lai tas viss darbotos, vispirms sākam pwm, ko var izdarīt, izmantojot tikai koda rindu:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Tātad, mums ir funkcija, kas pieņem leņķi un uzraksta to servo. Pārbaudīsim to un uzrakstīsim mūsu slaucīšanas funkciju, kas ir ļoti vienkārša:

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

Tātad, vienkārši saskaitiet līdz 180 un pēc tam līdz 0 un ierakstiet šīs vērtības servo:) Tātad, redzēsim rezultātu!

4. solis: rezultāts:)

Tātad, tas ir beigas. Ja jums ir kādi jautājumi, lūdzu, jautājiet. Es priecāšos, ja atbildēšu uz viņiem. Liels paldies par lasīšanu un ceru, ka tiksimies nākamajā projektā:)

Ieteicams: