Sisukord:

Servomootori juhtimine koos STM32F4 ARM MCU -ga: 4 sammu
Servomootori juhtimine koos STM32F4 ARM MCU -ga: 4 sammu

Video: Servomootori juhtimine koos STM32F4 ARM MCU -ga: 4 sammu

Video: Servomootori juhtimine koos STM32F4 ARM MCU -ga: 4 sammu
Video: Как управлять серводвигателем | Внешний ПЛК Arduino 2024, November
Anonim
Servomootori juhtimine koos STM32F4 ARM MCU -ga
Servomootori juhtimine koos STM32F4 ARM MCU -ga
Servomootori juhtimine koos STM32F4 ARM MCU -ga
Servomootori juhtimine koos STM32F4 ARM MCU -ga

Tere jälle sõbrad:) Niisiis, selles projektis juhime servomootorit koos STM32F4 ARM MCU -ga. Minu puhul kasutan avastusplaati, kuid kui mõistate probleemi olemust, saate seda rakendada iga MCU jaoks. Niisiis. alustame:)

1. samm: nõuded riistvarale ja tarkvarale

Riistvara osas vajame:

  • MCU, mis on minu puhul STM32f4 avastusplaat
  • Tavaline servomootor, nagu SG90 või mõni muu

Tarkvara osas vajame:

  • STM32CubeMX
  • Keil uVision

Kui teil on need kõik olemas, minge järgmise sammu juurde:)

Samm: STM32CubeMX seadistamine

Nagu teate, vajame servomootori juhtimiseks PWM -signaali. PWM -signaali nõuded on järgmised:

  • PWM periood peab olema 20 mS
  • Õigeaeg peab olema vahemikus 0,5 mS kuni 2,5 mS. Kui õigeaeg on 0,5 mS, siis servo pöörab 0 kraadi, 1,5 mS 90 kraadi ja 2,5 mS 180 kraadi.

Niisiis, peame konfigureerima PWM ja selleks kasutame taimerit 1.

  • Esiteks valige jaotises Taimerid TIM1. See samm
  • Seejärel jaotisest Režiim

    1. Valige Sisemine kell See samm
    2. PWM põlvkond CH1 See samm
  • Seejärel jaotisest Konfiguratsioon

    1. Seadistage eelvalija väärtuseks 160 See samm
    2. Määra loenduri periood 2000 -le. See samm
    3. Seadke pulss väärtusele 50 See samm
  • Lisaks seadistage kella konfiguratsioonist APB1 taimerite kellaajaks 16 MHz. See samm

Räägime nüüd natuke sellest sammust:

Meie APB1 taimerikella sagedus on 16 MHz. See tähendab, et 1 sekundi saamiseks on vaja 16 000 000 puuki. Sellegipoolest seadsime oma eelseadistajaks 160. See tähendab, et jagame oma sageduse selle arvuga ja vähendame puukide arvu 100 000 -ni. Seega vajame 1 sekundiks 100 000 puuki. Kuid me vajame 20 mS PWM perioodi, nagu me varem märkisime. Niisiis, lihtsa matemaatika põhjal vajame 20 mS jaoks 2000 puuki. Niisiis, määrates loenduriperioodiks 2000, määrame PWM -signaali perioodi, mis on 20 mS. Nüüd peame kindlaks määrama puugi numbri, et saada aega 0,5 mS kuni 2,5 mS. Selle võrrandi saame lihtsast matemaatikast ja see on:

On_Time = (Märgi_arv / 100). Pidage meeles, et see on on_time, mis muudab servomootori nurka. Niisiis, pildi all võtan selle sammu kokku. Kui teil on küsimusi, kirjutage kommentaaridesse ja vastan nii kiiresti kui võimalik.

Arvutuste pilt

Pärast kõigi nende toimingute tegemist genereerige kood:)

Samm: Keil UVisioni kodeerimine

Niisiis, kõigepealt teeme kindlaks, mida me tahame teha? Me tahame kirjutada funktsiooni, mis aktsepteerib kraadi, ja kirjutada see servole. Niisiis, kuidas me seda teeme? Nagu oleme varem öelnud, peame nurga muutmiseks muutma õigeaegselt. Meie nurgad muutuvad vahemikus [0, 180] ja puukide arv, mis määrab ajalised muutused vahemikus [50, 250]. Niisiis, meil on vaja kaardistamisfunktsiooni, mis kaardistab antud nurga puukide arvu vahemiku järgi. Näiteks 0 kraadi 50 puugi, 180 kraadi 250 puugi ja nii edasi … Kirjutame siis meie kaardistamisfunktsiooni:

int kaart (int st1, int fn1, int st2, int fn2, int value) {return (1,0*(väärtus-st1))/((fn1-st1)*1,0)*(fn2-st2)+st2; }

See on meie kaardistamise funktsioon. Kas olete huvitatud sellest, kuidas see on saadud? Siis loe seda. Niisiis, võtame oma vahemikud ja väärtuse, mida soovime kaardistada.

Kirjutame nüüd funktsiooni, mis aktsepteerib nurka ja kaardistab selle puukide vahemikku:

void servo_write (int nurk) {htim1. Aine-> CCR1 = kaart (0, 180, 50, 250, nurk); }

Nagu näete, aktsepteerib see kood nurka ja kaardistab selle puukide arvu vahemikku. Seejärel antakse puukide arv CCR1 registrile, mis kontrollib õigeaegset ja nii nurka.

Kuid selleks, et need kõik toimiksid, käivitame kõigepealt pwm, mida saab teha ainult koodirea abil:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Niisiis, meil on funktsioon, mis aktsepteerib nurka ja kirjutab selle servole. Proovime seda ja kirjutame oma pühkimisfunktsiooni, mis on väga lihtne:

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

Niisiis, see loeb lihtsalt kuni 180 ja seejärel alla 0 ja kirjutab need väärtused servole:) Niisiis, vaatame tulemust!

Neljas samm: tulemus:)

Niisiis, see on lõpp. Kui teil on küsimusi, küsige. Mul on hea meel neile vastata. Suur tänu lugemise eest ja loodan, et kohtume järgmises projektis:)

Soovitan: