Përmbajtje:

Servo Motor Control Me STM32F4 ARM MCU: 4 Hapa
Servo Motor Control Me STM32F4 ARM MCU: 4 Hapa

Video: Servo Motor Control Me STM32F4 ARM MCU: 4 Hapa

Video: Servo Motor Control Me STM32F4 ARM MCU: 4 Hapa
Video: Servo motor control using STM32 and PWM || HAL || CubeMx || Keil 2024, Nëntor
Anonim
Servo Motor Control Me STM32F4 ARM MCU
Servo Motor Control Me STM32F4 ARM MCU
Servo Motor Control Me STM32F4 ARM MCU
Servo Motor Control Me STM32F4 ARM MCU

Përshëndetje përsëri miq:) Pra, në këtë projekt ne do të kontrollojmë një servo motor me STM32F4 ARM MCU. Në rastin tim, unë do të përdor tabelën e zbulimit, por nëse kuptoni thelbin e problemit, atëherë mund ta aplikoni për çdo MCU. Kështu që. le të fillojmë:)

Hapi 1: Kërkesat për harduer dhe softuer

Për sa i përket harduerit do të na duhen:

  • Një MCU e cila është në rastin tim bordi i zbulimit STM32f4
  • Një servo motor i zakonshëm, si SG90 ose ndonjë tjetër

Për sa i përket softuerit do të na duhen:

  • STM32CubeMX
  • Keil uVision

Nëse i keni të gjitha këto, hidheni në hapin tjetër:)

Hapi 2: Konfigurimi STM32CubeMX

Siç e dini, për kontrollin e një servo motori ne kemi nevojë për sinjal PWM. Kërkesat për sa i përket sinjalit PWM janë si më poshtë:

  • Periudha e PWM duhet të jetë 20 mS
  • Koha duhet të jetë midis 0.5 mS dhe 2.5 mS. Kur në kohë është 0.5 mS, atëherë servo do të kthehet 0 gradë, 1.5 mS për 90 gradë dhe 2.5 mS për 180 gradë.

Pra, ne duhet të konfigurojmë PWM dhe për këtë qëllim ne do të përdorim Timer1.

  • Së pari, zgjidhni TIM1 nga seksioni Kohëmatësit. Ky hap
  • Pastaj, nga seksioni Mode

    1. Zgjidhni Ora e Brendshme Ky hap
    2. PWM Generation CH1 Ky hap
  • Pastaj, nga seksioni Konfigurimi

    1. Vendosni Prescaler në 160 Ky hap
    2. Vendos Periudhën e Kundërsulmit në 2000 Ky hap
    3. Vendosni Pulsin në 50 Ky hap
  • Për më tepër, nga Konfigurimi i orës vendosni orët e kohëmatësit APB1 në 16MHz. Ky hap

Tani, le të flasim pak për këtë hap:

Frekuenca e orës sonë APB1 Timer është 16MHz. Pra, do të thotë që kërkohen 16, 000, 000 rriqra për të marrë 1 sekondë. Megjithatë, ne e vendosëm presalen tonë në 160. Kjo do të thotë, ne e ndajmë frekuencën tonë me atë numër dhe e ulim numrin e rriqrave në 100, 000. Pra, për 1 sekondë na duhen 100, 000 rriqra. Megjithatë, ne kemi nevojë për 20mS të periudhës PWM siç kemi deklaruar më parë. Pra, bazuar në matematikë të thjeshtë, na duhen 2000 rriqra për 20mS. Pra, duke vendosur Periudhën e Counter në 2000 ne përcaktojmë periudhën e sinjalit PWM e cila është 20mS. Tani duhet të përcaktojmë numrin e rriqrës për marrjen në kohë nga 0.5mS në 2.5mS. Ne mund ta marrim këtë ekuacion nga matematika e thjeshtë dhe është:

On_Time = (Numri i shënimit / 100). Mbani në mend se kjo është koha në kohë që ndryshon këndin e servo motorit. Pra, nën imazhin unë përmbledh këtë hap. Nëse keni ndonjë pyetje, shkruani në komente dhe unë do t'ju përgjigjem sa më shpejt që të jetë e mundur.

Imazhi i llogaritjeve

Pasi të keni bërë të gjitha këto, krijoni kod:)

Hapi 3: Kodimi Keil UVision

Pra, le të përcaktojmë së pari se çfarë duam të bëjmë? Ne duam, të shkruajmë një funksion që pranon gradën dhe ta shkruajmë atë në servo. Pra, si do ta bëjmë atë? Siç kemi thënë më parë, për të ndryshuar këndin duhet të ndryshojmë në kohë. Këndet tona ndryshojnë midis [0, 180] dhe numri ynë i rriqrave që përcakton në kohë ndryshon midis [50, 250]. Pra, ne kemi nevojë për një funksion të hartës që harton këndin e dhënë në gamën e numrit të rriqrave. Për shembull, për rriqrat 0 gradë 50, për rriqrat 180 gradë 250 e kështu me radhë … Pra, le të shkruajmë funksionin tonë të hartës:

int harta (int st1, int fn1, int st2, int fn2, vlera int) {kthimi (1.0*(vlera-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Ky është funksioni ynë i hartës. A jeni i interesuar se si rrjedh? Pastaj lexoni atë. Pra, marrim vargjet tona dhe vlerën që duam të hartojmë.

Tani, le të shkruajmë një funksion që pranon këndin dhe e harton atë në rangun e rriqrave:

void servo_write (int angle) {htim1. Instance-> CCR1 = hartë (0, 180, 50, 250, kënd); }

Siç mund ta shihni, ky kod pranon këndin dhe e harton atë në rangun e numrit të rriqrave. Pastaj, numri i rriqrave i jepet regjistrit CCR1 i cili kontrollon këndin në kohë dhe kështu, Sidoqoftë, në mënyrë që të funksionojnë të gjitha këto, fillimisht fillojmë pwm, e cila mund të bëhet vetëm me një linjë kodi:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Pra, ne kemi një funksion që pranon këndin dhe e shkruan atë në servo. Le ta testojmë dhe të shkruajmë funksionin tonë të spastrimit i cili është shumë i lehtë:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Vonesë (10); } për (int i = 180; i> = 0; i--) {servo_write (i); HAL_Vonesë (10); }}

Pra, thjesht numëroni deri në 180 dhe pastaj në 0 dhe shkruani këto vlera në servo:) Pra, le të shohim rezultatin!

Hapi 4: Rezultati:)

Pra, ky është fundi. Nëse keni ndonjë pyetje, ju lutemi pyesni. Do të jem i lumtur për t'iu përgjigjur atyre. Faleminderit shumë për leximin dhe shpresoj të shihemi në projektin tjetër:)

Recommended: