Բովանդակություն:

Servo Motor Control STM32F4 ARM MCU- ով ՝ 4 քայլ
Servo Motor Control STM32F4 ARM MCU- ով ՝ 4 քայլ

Video: Servo Motor Control STM32F4 ARM MCU- ով ՝ 4 քայլ

Video: Servo Motor Control STM32F4 ARM MCU- ով ՝ 4 քայլ
Video: Fysetc Spider V1.1 - Servo install 2024, Նոյեմբեր
Anonim
Servo Motor Control STM32F4 ARM MCU- ով
Servo Motor Control STM32F4 ARM MCU- ով
Servo Motor Control STM32F4 ARM MCU- ով
Servo Motor Control STM32F4 ARM MCU- ով

Կրկին բարև ընկերներ:) Այսպիսով, այս նախագծում մենք վերահսկելու ենք սերվո շարժիչը STM32F4 ARM MCU- ով: Իմ դեպքում ես կօգտագործեմ հայտնագործման տախտակ, բայց եթե դուք ընկալեք խնդրի էությունը, ապա այն կարող եք կիրառել յուրաքանչյուր MCU- ի համար: Այսպիսով, Եկեք սկսենք:)

Քայլ 1: Սարքավորման և ծրագրային ապահովման պահանջներ

Սարքավորման առումով մեզ անհրաժեշտ կլինի.

  • MCU, որն իմ դեպքում STM32f4 Discovery տախտակն է
  • Սովորական servo շարժիչ, ինչպես SG90- ը կամ ցանկացած այլ

Softwareրագրային ապահովման առումով մեզ անհրաժեշտ կլինի.

  • STM32CubeMX
  • Keil uVision

Եթե ունեք այս ամենը, անցեք հաջորդ քայլին:)

Քայլ 2: STM32CubeMX կազմաձևում

Ինչպես գիտեք, servo շարժիչը կառավարելու համար մեզ անհրաժեշտ է PWM ազդանշան: PWM ազդանշանի առումով պահանջները հետևյալն են.

  • PWM ժամանակահատվածը պետք է լինի 20 mS
  • Onամանակին պետք է լինի 0.5 mS- ից 2.5 mS: Երբ ժամանակին 0.5 մՍ է, ապա սերվոն կշրջվի 0 աստիճան, 1.5 մՍ ՝ 90 աստիճանի, և 2.5 մՍ ՝ 180 աստիճանի:

Այսպիսով, մենք պետք է կազմաձևենք PWM- ը և այդ նպատակով մենք կօգտագործենք Timer1- ը:

  • Նախ, Timամաչափեր բաժնից ընտրեք TIM1: Այս քայլը
  • Այնուհետև, ռեժիմի բաժնից

    1. Ընտրեք ներքին ժամացույց Այս քայլը
    2. PWM Generation CH1 Այս քայլը
  • Այնուհետև ՝ կազմաձևում բաժնից

    1. Սահմանեք Prescaler- ը 160 -ի: Այս քայլը
    2. Սահմանեք Counter Period- ը 2000 -ի: Այս քայլը
    3. Սահմանեք Pulse- ը 50 -ի: Այս քայլը
  • Բացի այդ, ժամացույցի կազմաձևից APB1 ժամաչափի ժամացույցները սահմանեք մինչև 16 ՄՀց: Այս քայլը

Հիմա մի փոքր խոսենք այս քայլի մասին.

Մեր APB1 ժամաչափի ժամացույցի հաճախականությունը 16 ՄՀց է: Այսպիսով, դա նշանակում է, որ 1 վայրկյան ստանալու համար պահանջվում է 16, 000, 000 տիզ: Այնուամենայնիվ, մենք մեր նախնական սակարկիչը դրել ենք 160 -ի: Դա նշանակում է, որ մենք հաճախականությունը բաժանում ենք այդ թվի վրա և կրճատում ենք տիզերի թիվը մինչև 100,000: Այսպիսով, 1 վայրկյանի համար մեզ անհրաժեշտ է 100,000 տիզ: Այնուամենայնիվ, մեզ անհրաժեշտ է 20mS PWM ժամանակաշրջան, ինչպես նախկինում հայտարարել էինք: Այսպիսով, պարզ մաթեմատիկայի հիման վրա, մեզ անհրաժեշտ է 2000 տիզ 20mS- ի համար: Այսպիսով, Counter Period- ը սահմանելով 2000, մենք որոշում ենք PWM ազդանշանի տևողությունը, որը 20mS է: Այժմ մենք պետք է որոշենք տիզերի թիվը 0.5 մՍ -ից մինչև 2.5 մՍ ժամանակ ստանալու համար: Մենք կարող ենք ստանալ այս հավասարումը պարզ մաթեմատիկայից և այն է.

On_Time = (Tick_Number / 100): Հիշեք, որ սա այն ժամանակն է, որը փոխում է servo շարժիչի անկյունը: Այսպիսով, նկարի ներքևում ես ամփոփում եմ այս քայլը: Եթե ունեք որևէ հարց, գրեք մեկնաբանություններում, և ես կպատասխանեմ հնարավորինս արագ:

Հաշվարկների պատկեր

Այս ամենը կատարելուց հետո ստեղծեք կոդը:)

Քայլ 3. Keil UVision կոդավորում

Այսպիսով, եկեք նախ որոշենք, թե ինչ ենք ուզում անել: Մենք ուզում ենք գրել աստիճան, որն ընդունում է աստիճան և գրել այն սերվոյին: Այսպիսով, ինչպես ենք դա անելու: Ինչպես արդեն ասել ենք, անկյունը փոխելու համար մենք պետք է փոխենք ժամանակին: Մեր անկյունները փոխվում են [0, 180] և մեր տիզերի թիվը, որը ժամանակին որոշում է [50, 250] միջև: Այսպիսով, մեզ անհրաժեշտ է քարտեզագրման գործառույթ, որը քարտեզագրում է տրված անկյունը տիզերի քանակի տիրույթից: Օրինակ ՝ 0 աստիճանի 50 տիզերի, 180 աստիճանի համար 250 տիզերի և այլնի համար … Այսպիսով, եկեք գրենք մեր քարտեզագրման գործառույթը.

int քարտեզ (int st1, int fn1, int st2, int fn2, int արժեքը) {վերադարձ (1.0*(արժեք-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Սա մեր քարտեզագրման գործառույթն է: Ձեզ հետաքրքրու՞մ է, թե ինչպես է այն ծագում: Հետո կարդացեք դա: Այսպիսով, մենք վերցնում ենք մեր միջակայքերը և այն արժեքը, որը ցանկանում ենք քարտեզագրել:

Հիմա եկեք գրենք մի գործառույթ, որն ընդունում է անկյունը և քարտեզագրում այն տիզերի տիրույթում.

void servo_write (int անկյուն) {htim1. Istance-> CCR1 = քարտեզ (0, 180, 50, 250, անկյուն); }

Ինչպես տեսնում եք, այս կոդը ընդունում է անկյունը և քարտեզագրում այն տիզերի քանակի տիրույթում: Հետո, տիզերի քանակը տրվում է CCR1 գրանցամատյանին, որը վերահսկում է ժամանակին և այլն, անկյունը:

Այնուամենայնիվ, այս բոլորն աշխատելու համար մենք նախ սկսում ենք pwm- ը, որը կարող է կատարվել միայն կոդի տողով.

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Այսպիսով, մենք ունենք գործառույթ, որն ընդունում է անկյունը և գրում այն սերվոյին: Եկեք փորձարկենք այն և գրենք մեր մաքրման գործառույթը, որը շատ հեշտ է.

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Հետաձգում (10); } համար (int i = 180; i> = 0; i--) {servo_write (i); HAL_Հետաձգում (10); }}

Այսպիսով, այն պարզապես հաշվում է մինչև 180, այնուհետև մինչև 0 և գրում այս արժեքները սերվոյին:) Այսպիսով, եկեք տեսնենք արդյունքը:

Քայլ 4: Արդյունքը:)

Այսպիսով, սա վերջն է: Եթե ունեք որևէ հարց, խնդրում ենք հարցնել: Ես ուրախ կլինեմ նրանց պատասխանելու համար: Շատ շնորհակալ եմ կարդալու համար և հույս ունեմ, որ կհանդիպենք հաջորդ նախագծում:)

Խորհուրդ ենք տալիս: