विषयसूची:

STM32F4 ARM MCU के साथ सर्वो मोटर कंट्रोल: 4 कदम
STM32F4 ARM MCU के साथ सर्वो मोटर कंट्रोल: 4 कदम

वीडियो: STM32F4 ARM MCU के साथ सर्वो मोटर कंट्रोल: 4 कदम

वीडियो: STM32F4 ARM MCU के साथ सर्वो मोटर कंट्रोल: 4 कदम
वीडियो: Using STM32 to control a DC Motor 2024, जुलाई
Anonim
STM32F4 ARM MCU के साथ सर्वो मोटर नियंत्रण
STM32F4 ARM MCU के साथ सर्वो मोटर नियंत्रण
STM32F4 ARM MCU के साथ सर्वो मोटर नियंत्रण
STM32F4 ARM MCU के साथ सर्वो मोटर नियंत्रण

नमस्कार दोस्तों:) तो, इस परियोजना में हम STM32F4 ARM MCU के साथ एक सर्वो मोटर को नियंत्रित करेंगे। मेरे मामले में, मैं डिस्कवरी बोर्ड का उपयोग करूंगा, लेकिन यदि आप समस्या का सार समझते हैं, तो आप इसे हर एमसीयू के लिए लागू कर सकते हैं। इसलिए। आएँ शुरू करें:)

चरण 1: हार्डवेयर और सॉफ्टवेयर आवश्यकताएँ

हार्डवेयर के संदर्भ में हमें आवश्यकता होगी:

  • एक MCU जो मेरे मामले में STM32f4 डिस्कवरी बोर्ड है
  • एक सामान्य सर्वो मोटर, जैसे SG90 या कोई अन्य

सॉफ्टवेयर के संदर्भ में हमें आवश्यकता होगी:

  • STM32CubeMX
  • कील यूविज़न

यदि आपके पास ये सब हैं, तो अगले चरण पर जाएं:)

चरण 2: STM32CubeMX कॉन्फ़िगरेशन

जैसा कि आप जानते हैं, सर्वो मोटर को नियंत्रित करने के लिए हमें PWM सिग्नल की आवश्यकता होती है। PWM सिग्नल के संदर्भ में आवश्यकताएं इस प्रकार हैं:

  • PWM अवधि 20 mS. होनी चाहिए
  • समय पर 0.5 एमएस से 2.5 एमएस के बीच होना चाहिए। जब समय पर 0.5 एमएस होता है, तो सर्वो 0 डिग्री, 1.5 एमएस 90 डिग्री और 2.5 एमएस 180 डिग्री के लिए बदल जाएगा।

इसलिए, हमें PWM को कॉन्फ़िगर करने की आवश्यकता है और उस उद्देश्य के लिए हम Timer1 का उपयोग करेंगे।

  • सबसे पहले, टाइमर सेक्शन से TIM1 चुनें। यह कदम
  • फिर, मोड सेक्शन से

    1. आंतरिक घड़ी चुनें यह चरण
    2. PWM जनरेशन CH1 यह चरण
  • फिर, कॉन्फ़िगरेशन अनुभाग से

    1. प्रीस्केलर को 160 पर सेट करें यह चरण
    2. काउंटर अवधि को 2000 पर सेट करें यह चरण
    3. पल्स को 50 पर सेट करें यह चरण
  • इसके अतिरिक्त, क्लॉक कॉन्फ़िगरेशन से APB1 टाइमर घड़ियों को 16MHz पर सेट करें। यह कदम

अब, इस चरण के बारे में कुछ बात करते हैं:

हमारे APB1 टाइमर घड़ी की आवृत्ति 16MHz है। तो, इसका मतलब है कि 1 सेकंड प्राप्त करने के लिए 16,000, 000 टिक की आवश्यकता है। हालाँकि, हम अपने प्रीस्केलर को 160 पर सेट करते हैं। इसका मतलब है, हम अपनी आवृत्ति को उस संख्या से विभाजित करते हैं और टिकों की संख्या को घटाकर 100, 000 कर देते हैं। इसलिए, 1 सेकंड के लिए हमें 100, 000 टिक की आवश्यकता होती है। हालाँकि, हमें 20mS PWM अवधि की आवश्यकता है जैसा कि हमने पहले कहा था। तो, सरल गणित के आधार पर, हमें 20mS के लिए 2000 टिक की आवश्यकता है। इसलिए, काउंटर पीरियड को 2000 पर सेट करके हम PWM सिग्नल की अवधि निर्धारित करते हैं जो कि 20mS है। अब हमें 0.5mS से 2.5mS तक ऑन टाइम प्राप्त करने के लिए टिक संख्या निर्धारित करने की आवश्यकता है। हम इस समीकरण को सरल गणित से प्राप्त कर सकते हैं और यह है:

ऑन_टाइम = (टिक_नंबर / 100)। ध्यान रखें कि यह ऑन_टाइम है जो सर्वो मोटर के कोण को बदलता है। तो, छवि के नीचे मैं इस चरण को संक्षेप में प्रस्तुत करता हूं। अगर आपका कोई सवाल है तो कमेंट में लिखें और मैं जल्द से जल्द जवाब दूंगा।

गणना की छवि

इन सभी को कोड उत्पन्न करने के बाद:)

चरण 3: कील यूवीशन कोडिंग

तो, आइए पहले यह निर्धारित करें कि हम क्या करना चाहते हैं? हम चाहते हैं, एक ऐसा फ़ंक्शन लिखें जो डिग्री स्वीकार करता है और इसे सर्वो को लिखता है। तो, हम यह कैसे करेंगे? जैसा कि हम पहले कह चुके हैं, कोण बदलने के लिए हमें समय पर परिवर्तन करने की आवश्यकता है। हमारे कोण [०, १८०] के बीच बदलते हैं और हमारे टिकों की संख्या जो समय पर [५०, २५०] के बीच परिवर्तन को निर्धारित करती है। इसलिए, हमें एक मैपिंग फ़ंक्शन की आवश्यकता होती है, जो दिए गए कोणों को टिकों की संख्या की सीमा तक मैप करता है। उदाहरण के लिए, 0 डिग्री 50 टिक के लिए, 180 डिग्री 250 टिक के लिए और इसी तरह… तो चलिए अपना मैपिंग फंक्शन लिखते हैं:

इंट मैप (int st1, int fn1, int st2, int fn2, int value){ return (1.0*(value-st1))/((fn1-st1)*1.0) * (fn2-st2)+st2; }

यह हमारा मैपिंग फंक्शन है। क्या आप रुचि रखते हैं कि इसे कैसे प्राप्त किया जाता है? फिर वह पढ़ें। इसलिए, हम अपनी रेंज और वह मान लेते हैं जिसे हम मैप करना चाहते हैं।

अब, एक फ़ंक्शन लिखते हैं जो कोण को स्वीकार करता है और इसे टिक्स की श्रेणी में मैप करता है:

शून्य सर्वो_राइट (इंट कोण) {htim1. Instance->CCR1 = नक्शा (0, 180, 50, 250, कोण); }

जैसा कि आप देख सकते हैं, यह कोड कोण को स्वीकार करता है और इसे टिकों की संख्या की सीमा तक मैप करता है। इसके बाद, CCR1 रजिस्टर को टिकों की संख्या दी जाती है जो समय और कोण को नियंत्रित करता है।

हालाँकि, इन सभी को काम करने के लिए हम पहले pwm शुरू करते हैं जो कि कोड की एक पंक्ति द्वारा किया जा सकता है:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

तो, हमारे पास एक फ़ंक्शन है जो कोण को स्वीकार करता है और इसे सर्वो को लिखता है। आइए इसका परीक्षण करें और अपना स्वीप फ़ंक्शन लिखें जो बहुत आसान है:

शून्य सर्वो_स्वीप (शून्य) {के लिए (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Delay(10); } for(int i = 180; i>= 0; i--) {servo_write(i); HAL_Delay(10); } }

तो, यह सिर्फ १८० तक और फिर नीचे ० तक गिनता है और इन मानों को सर्वो को लिखता है:) तो, परिणाम देखते हैं!

चरण 4: परिणाम:)

तो, यह अंत है। यदि आपका कोई प्रश्न है तो कृपया पूछें। मुझे उनका उत्तर देने में प्रसन्नता होगी। पढ़ने के लिए बहुत-बहुत धन्यवाद और आशा है कि मैं आपको अगले प्रोजेक्ट में देखूंगा:)

सिफारिश की: