ዝርዝር ሁኔታ:

Servo የሞተር መቆጣጠሪያ በ STM32F4 ARM MCU: 4 ደረጃዎች
Servo የሞተር መቆጣጠሪያ በ STM32F4 ARM MCU: 4 ደረጃዎች

ቪዲዮ: Servo የሞተር መቆጣጠሪያ በ STM32F4 ARM MCU: 4 ደረጃዎች

ቪዲዮ: Servo የሞተር መቆጣጠሪያ በ STM32F4 ARM MCU: 4 ደረጃዎች
ቪዲዮ: BTT Octopus v1.1 - Switch Endstop 2024, ሀምሌ
Anonim
Servo የሞተር መቆጣጠሪያ ከ STM32F4 ARM MCU ጋር
Servo የሞተር መቆጣጠሪያ ከ STM32F4 ARM MCU ጋር
Servo የሞተር መቆጣጠሪያ ከ STM32F4 ARM MCU ጋር
Servo የሞተር መቆጣጠሪያ ከ STM32F4 ARM MCU ጋር

እንኳን ደህና መጣችሁ ወዳጆች:) ስለዚህ ፣ በዚህ ፕሮጀክት ውስጥ ከ STM32F4 ARM MCU ጋር የ servo ሞተር እንቆጣጠራለን። በእኔ ሁኔታ ፣ እኔ የግኝት ሰሌዳ እጠቀማለሁ ፣ ግን የችግሩን ዋና ነገር ከተረዱ ፣ ከዚያ ለእያንዳንዱ MCU ማመልከት ይችላሉ። ስለዚህ. እንጀምር:)

ደረጃ 1 የሃርድዌር እና የሶፍትዌር መስፈርቶች

ከሃርድዌር አንፃር እኛ ያስፈልገናል-

  • በእኔ ሁኔታ STM32f4 Discovery board ውስጥ የሚገኝ MCU
  • እንደ SG90 ወይም ሌላ ማንኛውም የተለመደ የ servo ሞተር

ከሶፍትዌር አንፃር እኛ ያስፈልገናል-

  • STM32CubeMX
  • Keil uVision

እነዚህ ሁሉ ካሉዎት ወደሚቀጥለው ደረጃ ይዝለሉ:)

ደረጃ 2 STM32CubeMX ውቅር

እንደሚያውቁት ፣ የ servo ሞተርን ለመቆጣጠር የ PWM ምልክት ያስፈልገናል። ከ PWM ምልክት አንፃር መስፈርቶቹ እንደዚህ ናቸው

  • የ PWM ጊዜ 20 mS መሆን አለበት
  • በሰዓቱ ከ 0.5 ሚ.ሜ እስከ 2.5 ሚ.ሜ መሆን አለበት። በሰዓቱ 0.5 mS ሲሆን ፣ ከዚያ ሰርቪው 0 ዲግሪዎች ፣ 1.5 ኤምኤስ ለ 90 ዲግሪዎች ፣ እና 2.5 ኤምኤስ ለ 180 ዲግሪዎች ያዞራል።

ስለዚህ ፣ PWM ን ማዋቀር አለብን እና ለዚያ ዓላማ Timer1 ን እንጠቀማለን።

  • በመጀመሪያ ከ Timers ክፍል TIM1 ን ይምረጡ። ይህ እርምጃ
  • ከዚያ ፣ ከሞድ ክፍል

    1. የውስጥ ሰዓት ይምረጡ ይህንን ደረጃ
    2. PWM ትውልድ CH1 ይህ ደረጃ
  • ከዚያ ፣ ከማዋቀር ክፍል

    1. Prescaler ን ወደ 160 ያዘጋጁ
    2. የቆጣሪ ጊዜን ወደ 2000 ያዋቅሩ ይህ እርምጃ
    3. Pulse ን ወደ 50 ያቀናብሩ ይህ ደረጃ
  • በተጨማሪም ፣ ከሰዓት ውቅር APB1 የሰዓት ቆጣሪ ሰዓቶችን ወደ 16 ሜኸዝ ያዘጋጁ። ይህ እርምጃ

አሁን ስለዚህ ደረጃ ትንሽ እንነጋገር-

የእኛ APB1 የሰዓት ቆጣሪ ሰዓት ድግግሞሽ 16 ሜኸ ነው። ስለዚህ ፣ 1 ሰከንድ ለማግኘት 16,000 ፣ 000 መዥገሮች ያስፈልጋል ማለት ነው። ሆኖም ግን የእኛን ቅድመ -ተቆጣጣሪ ወደ 160. እናስቀምጠዋለን ማለት ነው ፣ እኛ የእኛን ድግግሞሽ በዚያ ቁጥር እንከፋፍለን እና የመዥገሮችን ቁጥር ወደ 100 ፣ 000 ዝቅ አድርገናል። ሆኖም ፣ ቀደም ሲል እንደገለፅነው 20mS የ PWM ጊዜ እንፈልጋለን። ስለዚህ ፣ በቀላል ሂሳብ ላይ በመመርኮዝ ለ 20mS 2000 መዥገሮች ያስፈልጉናል። ስለዚህ ፣ የ Counter Period ን ወደ 2000 በማቀናበር እኛ 20mS የሆነውን የ PWM ምልክት ጊዜ እንወስናለን። አሁን ከ 0.5mS እስከ 2.5mS ጊዜን ለማግኘት የመለያ ቁጥሩን መወሰን አለብን። ይህንን ቀመር ከቀላል ሂሳብ ማግኘት እንችላለን እና እሱ ነው

On_Time = (Tick_Number / 100)። ያስታውሱ ይህ የ servo ሞተርን አንግል የሚቀይር on_time መሆኑን ያስታውሱ። ስለዚህ ፣ ከምስሉ በታች ይህንን ደረጃ ጠቅለል አድርጌዋለሁ። ማንኛውም ጥያቄ ካለዎት በአስተያየቶቹ ውስጥ ይፃፉ እና በተቻለ ፍጥነት እመልሳለሁ።

የስሌቶች ምስል

እነዚህን ሁሉ ኮድ ካደረጉ በኋላ:)

ደረጃ 3: Keil UVision Coding

ስለዚህ ፣ መጀመሪያ ምን ማድረግ እንደምንፈልግ እንወስን? እኛ ዲግሪን የሚቀበል ተግባር ለመፃፍ እና ወደ ሰርቪው ለመፃፍ እንፈልጋለን። ስለዚህ ፣ እኛ ያንን እንዴት እናደርጋለን? ቀደም ብለን እንደተናገርነው ፣ አንግልን ለመለወጥ በሰዓቱ መለወጥ አለብን። በ [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; }

ይህ የእኛ የካርታ ተግባር ነው። እንዴት እንደሚገኝ ፍላጎት አለዎት? ከዚያ ያንን ያንብቡ። ስለዚህ ፣ የእኛን ክልሎች እና ካርታ የምንፈልገውን እሴት እንወስዳለን።

አሁን ፣ አንግልን የሚቀበል እና ወደ መዥገሮች ክልል ካርታ የሚያቀርብ ተግባር እንፃፍ-

ባዶ servo_write (int angle) {htim1. Instance-> CCR1 = ካርታ (0 ፣ 180 ፣ 50 ፣ 250 ፣ አንግል); }

እንደሚመለከቱት ፣ ይህ ኮድ አንግልን ይቀበላል እና ወደ መዥገሮች ብዛት ክልል ያደርገዋል። እና ከዚያ ፣ የቲኬቶች ብዛት በሰዓቱ እና በማዕዘን ለሚቆጣጠረው ለ CCR1 መዝገብ ይሰጣል።

ሆኖም ፣ እነዚህ ሁሉ እንዲሠሩ በመጀመሪያ በኮድ መስመር ብቻ ሊሠራ የሚችል pwm ን እንጀምራለን-

HAL_TIM_PWM_Start (& htim1 ፣ TIM_CHANNEL_1) ፤

ስለዚህ ፣ አንግልን የሚቀበል እና ወደ ሰርቪው የሚጽፍ ተግባር አለን። እንሞክረው እና በጣም ቀላል የሆነውን የእኛን የመጥረግ ተግባር እንፃፍ-

ባዶ servo_sweep (ባዶ) {ለ (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Delay (10); } ለ (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

ስለዚህ ፣ እሱ እስከ 180 ድረስ ከዚያም ወደ 0 ዝቅ ብሎ እነዚህን እሴቶች ለ servo ይፃፉ:) ስለዚህ ውጤቱን እንይ!

ደረጃ 4: ውጤቱ:)

ስለዚህ ፣ ይህ መጨረሻው ነው። ማንኛውም ጥያቄ ካለዎት እባክዎን ይጠይቁ። ለእነሱ መልስ ለመስጠት ደስተኛ እሆናለሁ። ለንባብዎ በጣም አመሰግናለሁ እናም በሚቀጥለው ፕሮጀክት ውስጥ እንደማያይዎት ተስፋ አደርጋለሁ:)

የሚመከር: