جدول المحتويات:

التحكم في محرك سيرفو مع STM32F4 ARM MCU: 4 خطوات
التحكم في محرك سيرفو مع STM32F4 ARM MCU: 4 خطوات

فيديو: التحكم في محرك سيرفو مع STM32F4 ARM MCU: 4 خطوات

فيديو: التحكم في محرك سيرفو مع STM32F4 ARM MCU: 4 خطوات
فيديو: 084-STM32F1 Timer Servo Motor Position control & Continuous Servo Motor Speed and Direction Control 2024, يوليو
Anonim
التحكم في محرك سيرفو مع STM32F4 ARM MCU
التحكم في محرك سيرفو مع STM32F4 ARM MCU
التحكم في محرك سيرفو مع STM32F4 ARM MCU
التحكم في محرك سيرفو مع STM32F4 ARM MCU

مرحبًا رفاقي مرة أخرى:) لذا ، في هذا المشروع ، سنتحكم في محرك مؤازر باستخدام STM32F4 ARM MCU. في حالتي ، سأستخدم لوحة الاكتشاف ، لكن إذا فهمت جوهر المشكلة ، فيمكنك تطبيقها على كل MCU. وبالتالي. هيا بنا نبدأ:)

الخطوة 1: متطلبات الأجهزة والبرامج

من حيث الأجهزة سوف نحتاج:

  • وحدة MCU وهي لوحة اكتشاف STM32f4 في حالتي
  • محرك سيرفو مشترك ، مثل SG90 أو أي محرك آخر

فيما يتعلق بالبرنامج ، سنحتاج إلى:

  • STM32CubeMX
  • Keil uVision

إذا كان لديك كل ذلك ، فانتقل إلى الخطوة التالية:)

الخطوة 2: تكوين STM32CubeMX

كما تعلم ، من أجل التحكم في محرك سيرفو ، نحتاج إلى إشارة PWM. المتطلبات من حيث إشارة PWM هي كما يلي:

  • يجب أن تكون فترة PWM 20 مللي ثانية
  • في الوقت المحدد يجب أن يكون بين 0.5 مللي ثانية إلى 2.5 مللي ثانية. عندما تكون 0.5 مللي ثانية في الوقت المحدد ، ستدور المؤازرة 0 درجة ، 1.5 مللي ثانية لـ 90 درجة ، و 2.5 مللي ثانية لـ 180 درجة.

لذلك ، نحتاج إلى تكوين PWM ولهذا الغرض سوف نستخدم Timer1.

  • أولاً ، حدد TIM1 من قسم Timers. هذه الخطوة
  • ثم من قسم الوضع

    1. اختر الساعة الداخلية هذه الخطوة
    2. PWM Generation CH1 هذه الخطوة
  • ثم من قسم التكوين

    1. اضبط Prescaler على 160 هذه الخطوة
    2. اضبط فترة العداد على 2000 هذه الخطوة
    3. اضبط Pulse على 50 في هذه الخطوة
  • بالإضافة إلى ذلك ، من تكوين الساعة ، قم بتعيين ساعات عداد الوقت APB1 إلى 16 ميجا هرتز. هذه الخطوة

الآن ، دعنا نتحدث قليلاً عن هذه الخطوة:

تردد ساعة APB1 Timer لدينا هو 16 ميجا هرتز. لذلك ، فهذا يعني أن الأمر يتطلب 16.000.000 علامة للحصول على ثانية واحدة. ومع ذلك ، قمنا بتعيين مقياس القيمة المسبقة الخاص بنا على 160. وهذا يعني أننا نقسم التردد على هذا العدد وخفضنا عدد التكات إلى 100000. لذلك ، لمدة ثانية واحدة ، نحتاج إلى 100000 علامة. ومع ذلك ، نحن بحاجة إلى 20 مللي ثانية من فترة PWM كما ذكرنا من قبل. لذلك ، بناءً على العمليات الحسابية البسيطة ، نحتاج إلى 2000 علامة مقابل 20 مللي ثانية. لذلك ، من خلال ضبط فترة العداد على 2000 ، نحدد فترة إشارة PWM وهي 20 مللي ثانية. نحتاج الآن إلى تحديد رقم التجزئة للحصول على الأوقات من 0.5 مللي ثانية إلى 2.5 مللي ثانية. يمكننا الحصول على هذه المعادلة من الرياضيات البسيطة وهي:

On_Time = (Tick_Number / 100). ضع في اعتبارك أن هذا هو الوقت الذي يغير زاوية محرك سيرفو. لذلك ، أدناه الصورة ألخص هذه الخطوة. إذا كان لديك أي سؤال ، فاكتب في التعليقات وسأجيب في أسرع وقت ممكن.

صورة الحسابات

بعد القيام بكل هذه الأشياء ، قم بإنشاء رمز:)

الخطوة 3: Keil UVision Coding

لذا ، دعنا أولاً نحدد ما نريد أن نفعله؟ نريد ، كتابة دالة تقبل الدرجة ونكتبها إلى المؤازرة. لذا ، كيف سنفعل ذلك؟ كما قلنا من قبل ، من أجل تغيير الزاوية ، نحتاج إلى تغيير الزاوية في الوقت المناسب. تتغير الزوايا بين [0 ، 180] وعدد العلامات الذي يحدد تغيرات الوقت بين [50 ، 250]. لذلك ، نحن بحاجة إلى وظيفة رسم خرائط تعين زاوية معينة لنطاق عدد التكات. على سبيل المثال ، لـ 0 درجة 50 علامة ، لـ 180 درجة 250 علامة وهكذا … لذلك دعونا نكتب وظيفة التعيين الخاصة بنا:

int map (int st1، int fn1، int st2، int fn2، int value) {return (1.0 * (value-st1)) / ((fn1-st1) * 1.0) * (fn2-st2) + st2؛ }

هذه هي وظيفة رسم الخرائط لدينا. هل أنت مهتم بكيفية اشتقاقه؟ ثم اقرأ ذلك. لذلك ، نأخذ نطاقاتنا والقيمة التي نريد تعيينها.

الآن ، دعنا نكتب دالة تقبل الزاوية وترسمها إلى نطاق العلامات:

servo_write (زاوية int) باطلة {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 واكتب هذه القيم إلى المؤازرة:) لذا ، دعنا نرى النتيجة!

الخطوة 4: النتيجة:)

إذن ، هذه هي النهاية. إن كان لديك أي سؤال من فضلك إسأل. سأكون سعيدا من أجل الرد عليهم. شكرا جزيلا على القراءة وآمل أن أراك في المشروع القادم:)

موصى به: