সুচিপত্র:

STM32F4 ARM MCU সহ সার্ভো মোটর কন্ট্রোল: 4 টি ধাপ
STM32F4 ARM MCU সহ সার্ভো মোটর কন্ট্রোল: 4 টি ধাপ

ভিডিও: STM32F4 ARM MCU সহ সার্ভো মোটর কন্ট্রোল: 4 টি ধাপ

ভিডিও: STM32F4 ARM MCU সহ সার্ভো মোটর কন্ট্রোল: 4 টি ধাপ
ভিডিও: STM32F4-Discovery: программирование с использованием Simulink и Embedded Coder 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 সময়কাল 20 mS হতে হবে
  • সময় থাকতে হবে 0.5 mS থেকে 2.5 mS এর মধ্যে। যখন সময় 0.5 এমএস হয়, তখন সার্ভো 0 ডিগ্রী, 90 ডিগ্রির জন্য 1.5 এমএস এবং 180 ডিগ্রির জন্য 2.5 এমএস চালু হবে।

সুতরাং, আমাদের PWM কনফিগার করতে হবে এবং সেই উদ্দেশ্যে আমরা টাইমার 1 ব্যবহার করব।

  • প্রথমে, টাইমার বিভাগ থেকে TIM1 নির্বাচন করুন। এই ধাপ
  • তারপর, মোড বিভাগ থেকে

    1. অভ্যন্তরীণ ঘড়ি এই ধাপটি বেছে নিন
    2. PWM জেনারেশন CH1 এই ধাপ
  • তারপর, কনফিগারেশন বিভাগ থেকে

    1. Prescaler 160 এ ধাপে সেট করুন
    2. কাউন্টার পিরিয়ড 2000 এ সেট করুন
    3. এই ধাপে পালস 50 তে সেট করুন
  • উপরন্তু, ক্লক কনফিগারেশন থেকে APB1 টাইমার ঘড়ি 16MHz সেট করুন। এই ধাপ

এখন, এই পদক্ষেপ সম্পর্কে একটু কথা বলা যাক:

আমাদের APB1 টাইমার ঘড়ির ফ্রিকোয়েন্সি 16MHz। সুতরাং, এর মানে হল যে 1 সেকেন্ড পেতে 16, 000, 000 টিক প্রয়োজন। যাইহোক, আমরা আমাদের প্রেসকলারকে 160 এ সেট করেছি। এর মানে হল, আমরা আমাদের ফ্রিকোয়েন্সিটিকে সেই সংখ্যা দিয়ে ভাগ করে দিয়েছি এবং টিকের সংখ্যা 100, 000 এ নামিয়ে এনেছি। সুতরাং, 1 সেকেন্ডের জন্য আমাদের 100, 000 টিক দরকার। যাইহোক, আমরা PWM সময়ের 20mS সময় প্রয়োজন যেমন আমরা আগে বলেছি। সুতরাং, সাধারণ গণিতের উপর ভিত্তি করে, আমাদের 20mS এর জন্য 2000 টিক দরকার। সুতরাং, কাউন্টার পিরিয়ড 2000 এ সেট করে আমরা PWM সিগন্যালের সময়কাল নির্ধারণ করি যা 20mS। এখন আমাদের 0.5mS থেকে 2.5mS পর্যন্ত সময় পাওয়ার জন্য টিক নম্বর নির্ধারণ করতে হবে। আমরা সাধারণ গণিত থেকে এই সমীকরণটি পেতে পারি এবং এটি হল:

On_Time = (Tick_Number / 100)। মনে রাখবেন যে এটি অন_টাইম যা সার্ভো মোটরের কোণ পরিবর্তন করে। সুতরাং, চিত্রের নীচে আমি এই ধাপটি সংক্ষিপ্ত করি। যদি আপনার কোন প্রশ্ন থাকে তবে মন্তব্যগুলিতে লিখুন এবং আমি যত তাড়াতাড়ি সম্ভব উত্তর দেব।

হিসাবের ছবি

এই সব জেনারেট কোড করার পরে:)

ধাপ 3: Keil UVision কোডিং

সুতরাং, আসুন প্রথমে নির্ধারণ করি আমরা কি করতে চাই? আমরা চাই, একটি ফাংশন লিখুন যা ডিগ্রী গ্রহণ করে এবং এটি সার্ভোতে লিখতে পারে। সুতরাং, আমরা কিভাবে এটি করব? আমরা আগেই বলেছি, কোণ পরিবর্তন করার জন্য আমাদের সময়মত পরিবর্তন করতে হবে। আমাদের কোণগুলি [0, 180] এবং আমাদের টিক সংখ্যাগুলির মধ্যে পরিবর্তিত হয় যা সময় নির্ধারণ করে [50, 250] এর মধ্যে। সুতরাং, আমাদের একটি ম্যাপিং ফাংশন দরকার যা টিকের সংখ্যার পরিসরে কোণকে মানচিত্র দেয়। উদাহরণস্বরূপ, 0 ডিগ্রী 50 টিক, 180 ডিগ্রী 250 টিক এবং এর জন্য … সুতরাং আসুন আমাদের ম্যাপিং ফাংশন লিখি:

int মানচিত্র (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 angle) {htim1. Instance-> CCR1 = map (0, 180, 50, 250, angle); }

আপনি দেখতে পাচ্ছেন, এই কোডটি কোণ গ্রহণ করে এবং এটি টিক সংখ্যার পরিসরে মানচিত্র করে। তারপর, টিসি সংখ্যা 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_Delay (10); } এর জন্য (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

সুতরাং, এটি শুধুমাত্র 180 পর্যন্ত গণনা করে এবং তারপর 0 তে নেমে এবং এই মানগুলিকে সার্ভোতে লিখুন:) সুতরাং, ফলাফলটি দেখা যাক!

ধাপ 4: ফলাফল:)

সুতরাং, এই শেষ। যদি আপনার কোন প্রশ্ন থাকে দয়া করে জিজ্ঞাসা করুন। আমি তাদের উত্তর দিতে খুশি হবে। পড়ার জন্য আপনাকে অনেক ধন্যবাদ এবং আশা করি আমি আপনাকে পরবর্তী প্রকল্পে দেখতে পাব:)

প্রস্তাবিত: