ورکشاپ آموزشی - آیسی مدار
رفتن به محتوا

کنترل دقیق سرعت موتور DC با انکودر و آردوینو

آموزش و الکترونیک
۰ نظر
۹۲ نفر
کد ۳۲۳۰

کنترل دقیق سرعت موتورها یکی از مهم‌ترین چالش‌ها تو پروژه‌های رباتیک و صنعتیه. وقتی بخوایم رباتمون دقیق حرکت کنه یا یه نوار نقاله سرعت ثابتی داشته باشه، فقط ولتاژ دادن به موتور کافی نیست؛ باید فیدبک بگیریم و سرعت رو لحظه‌به‌لحظه اصلاح کنیم.

تو این پروژه از آیسی‌مدار، قراره یه سیستم کنترل سرعت حلقه بسته (Closed-Loop) برای موتور DC بسازیم. با استفاده از یک انکودر، سرعت واقعی موتور رو می‌خونیم و به کمک برد آردوینو و الگوریتم کنترلر PI، ولتاژ رو طوری تنظیم می‌کنیم که موتور همیشه روی سرعت دلخواه ما کار کنه. پس قطعاتت رو آماده کن تا بریم سراغ ساخت این سیستم کنترلی جذاب و حرفه‌ای.

قطعات موردنیاز

  • برد توسعه آردوینو Uno
  • کابل USB تایپ A به B (کابل آردوینو)
  • موتور DC گیربکس‌دار 6 ولت به همراه چرخ و انکودر (مدل JGB37-520)
  • ماژول درایور موتور L298N
  • دو عدد باتری لیتیوم یون 18650 (3.7 ولت)
  • جا باتری 18650 کلیددار
  • سیم جامپر
مرحله ۱

بررسی دیاگرام سیستم کنترل سرعت حلقه بسته

این تصویر نشون می‌ده که کل سیستم کنترل حلقه بسته موتور ما چطور کار می‌کنه. اول از همه، سرعتی که ما به عنوان هدف تعیین کردیم با سرعت واقعی و فیلترشده موتور مقایسه می‌شه تا مقدار خطا به دست بیاد. بعدش این خطا می‌ره داخل کنترلر PI که روی آردوینو پیاده‌سازی کردیم تا سیگنال کنترلی مناسب رو تولید کنه.

سیگنال خروجی به شکل موج PWM به درایور L298N فرستاده می‌شه تا ولتاژ اعمالی به موتور گیربکس‌دار رو تنظیم کنه. در همین حین، انکودر داره با دقت سرعت چرخش موتور رو اندازه می‌گیره و پالس‌ها رو به آردوینو برمی‌گردونه. البته این سرعت اندازه‌گیری‌شده قبل از اینکه دوباره وارد حلقه کنترل بشه، از یک فیلتر پایین‌گذر دیجیتال عبور می‌کنه تا نویزهاش گرفته بشه.

این ساختار فیدبک‌دار به ما تضمین می‌ده که سرعت موتور کاملا پایدار و دقیق بمونه و موقع تغییرات ناگهانی تو سرعت درخواستی، سیستم بتونه بهترین واکنش رو نشون بده.

مرحله ۲

مشخصات فنی موتور و انکودر

موتوری که تو این پروژه استفاده کردیم، مدل JGB37-520 هست که ویژگی‌های جالبی داره:

  1. نسبت تبدیل گیربکس 9.6 به 1
  2. ولتاژ نامی 6 ولت

وضعیت موتور تو حالت بدون بار:

  1. سرعت 620 دور بر دقیقه (RPM)
  2. جریان مصرفی 0.1 آمپر

وضعیت موتور زیر بار نامی:

  1. سرعت 450 دور بر دقیقه (RPM)
  2. جریان مصرفی 0.45 آمپر
  3. گشتاور 0.22 کیلوگرم بر سانتی‌متر
  4. توان خروجی 2.7 وات

این موتور یه انکودر افزایشی داره که تو هر دور کامل شفت خود موتور، 11 پالس (CPR) تولید می‌کنه. اما چون موتورمون گیربکس داره و نسبت تبدیلش 9.6 به 1 هست، رزولوشن نهایی انکودر روی شفت خروجی برابر می‌شه با حاصل‌ضرب این دو عدد؛ یعنی دقیقا 105.6 پالس به ازای هر دور چرخش شفت خروجی. ما از همین عدد برای محاسبه دقیق سرعت به شکل RPM استفاده می‌کنیم.

مرحله ۳

چطور سرعت رو بر حسب RPM محاسبه کنیم؟

برای به دست آوردن سرعت چرخش موتور JGB37-520، از همون انکودر افزایشی متصل به شفت استفاده می‌کنیم. وقتی شفت می‌چرخه، انکودر یه سری پالس الکتریکی تولید می‌کنه. اگر بیایم تعداد این پالس‌ها رو تو یک بازه زمانی مشخص بشمریم، می‌تونیم سرعت موتور رو با دقت بالایی حساب کنیم.

زمان اندازه‌گیری رو باید به ثانیه تبدیل کنیم تا واحدها یکدست بشن. همون‌طور که قبلا گفتیم، کل پالس‌های تولیدشده تو هر دور شفت خروجی، از ضرب رزولوشن پایه انکودر در ضریب گیربکس به دست میاد.

حالا برای اینکه سرعت رو بر حسب دور بر دقیقه یا همون RPM محاسبه کنیم، از یک فرمول ساده استفاده می‌کنیم. تعداد پالس‌های شمرده‌شده تقسیم بر زمان اندازه‌گیری می‌شه، و بعد در عدد 60 تقسیم بر کل پالس‌های یک دور ضرب می‌شه.

تو این فرمول، در واقع ما داریم پالس بر ثانیه رو به دور بر دقیقه روی شفت خروجی تبدیل می‌کنیم و هم‌زمان رزولوشن انکودر و تأثیر گیربکس رو هم در نظر می‌گیریم.

بعد از پیاده‌سازی این فرمول تو کدها، می‌تونی سرعت محاسبه‌شده رو با یه تاکومتر (دور سنج) خارجی مقایسه کنی تا از دقت و عملکرد بی‌نقص سیستمت مطمئن بشی.

مرحله ۴

پیاده‌سازی الگوریتم کنترلر PI به صورت دیجیتال

از اونجایی که قراره این سیستم رو روی یک میکروکنترلر مثل آردوینو اجرا کنیم، کنترلر PI باید به صورت گسسته (Discrete) پیاده‌سازی بشه. به جای اینکه از انتگرال‌گیری پیوسته و پیچیده ریاضی استفاده کنیم، الگوریتم ما انتگرال رو به شکل جمع انباشته ارورها (خطاها) در طول زمان حساب می‌کنه.

تو هر لحظه از نمونه‌برداری، خطای سرعت از تفاضل سرعت درخواستی و سرعت واقعی فیلترشده به دست میاد. بعد از اون، بخش انتگرال‌گیر با اضافه کردن حاصل‌ضرب این خطا تو زمان نمونه‌برداری آپدیت می‌شه.

سیگنال کنترلی نهایی با یک معادله ساده گسسته محاسبه می‌شه که تو اون ضریب تناسبی (Kp) تو میزان خطا، و ضریب انتگرال‌گیر (Ki) تو جمع خطاها ضرب می‌شن.

ضریب Kp کمک می‌کنه تا موتور خیلی سریع به سرعت دلخواه برسه (پاسخ دینامیکی بهتر)، و ضریب Ki هم خطای ماندگار رو به صفر می‌رسونه تا سرعت دقیقا روی همون عددی که می‌خوایم قفل بشه. این روش پیاده‌سازی گسسته، بهترین و بهینه‌ترین حالت برای سیستم‌های نهفته و میکروکنترلرهاست و یه کنترل حلقه بسته عالی رو براتون فراهم می‌کنه.

مرحله ۵

استفاده از فیلتر پایین‌گذر برای حذف نویز سرعت

برای اینکه سیگنال نویزدار سرعت موتور رو حسابی صاف و یکدست کنیم و اندازه‌گیری پایدارتری داشته باشیم، از یک فیلتر پایین‌گذر مرتبه اول استفاده کردیم. تو حالت دیجیتال، این فیلتر به این شکل کار می‌کنه که سرعت فیلترشده فعلی، ترکیبی از سرعت فیلترشده قبلی و سرعت نویزدار جدیده که با یک ضریب آلفا با هم جمع می‌شن.

این ضریب آلفا بر اساس ثابت زمانی فیلتر و زمان نمونه‌برداری سیستم تعیین می‌شه. با این ترفند ساده نرم‌افزاری، پرش‌های ناگهانی و نویزهای فرکانس بالا حذف می‌شن و یه عدد کاملا قابل اعتماد از سرعت موتور به دست میاریم.

مرحله ۶

راهنمای سیم‌کشی ماژول انکودر

حالا بریم سراغ اتصالات و سیم‌کشی‌ها. کابل‌های انکودر و موتور رو به این شکل وصل کن:

  1. سیم قرمز (M1): قطب مثبت تغذیه موتور (با جابه‌جا کردن این سیم و سیم سفید، جهت چرخش عوض می‌شه).
  2. سیم سفید (M2): قطب منفی تغذیه موتور.
  3. سیم زرد (C1): خروجی اول انکودر.
  4. سیم سبز (C2): خروجی دوم انکودر.
  5. سیم آبی: قطب مثبت تغذیه انکودر که باید به پین 3.3 ولت یا 5 ولت وصل بشه (دقت کن اشتباه وصل نکنی).
  6. سیم مشکی: قطب منفی تغذیه انکودر که به پین GND متصل می‌شه.
مرحله ۷

شماتیک مدار و کدهای آردوینو

تمام اتصالات رو می‌تونی تو تصویر شماتیک مدار ببینی. چون ماژول L298N تو نرم‌افزار Tinkercad وجود نداشت، این شماتیک با ترکیب ابزارهای مختلف کشیده شده تا کاملا واضح باشه. اتصالات رو دقیقا طبق همین تصویر روی برد پیاده کن.

مرحله ۸

مشاهده و مانیتورینگ سرعت تنظیم‌شده موتور

برای اینکه بتونیم متغیرهای سیستم رو ببینیم و رفتار کنترلر رو بررسی کنیم، از ابزارهای ارتباط سریال آردوینو استفاده می‌کنیم. برنامه طوری نوشته شده که چهار تا داده اصلی یعنی زمان (t)، سرعت مرجع (rpmRef)، سرعت اندازه‌گیری‌شده (rpm) و سرعت فیلترشده (rpmFilt) رو از طریق پورت سریال می‌فرسته. این مقادیر با ویرگول از هم جدا شدن (فرمت CSV) تا خوندن و پردازششون خیلی راحت باشه.

اگه ابزار Serial Monitor رو تو نرم‌افزار آردوینو باز کنی، می‌تونی این عددها رو به صورت زنده ببینی و مطمئن بشی که کدهات به درستی دارن اجرا می‌شن.

حتی می‌تونی این داده‌ها رو کپی کنی و تو نرم‌افزارهایی مثل متلب (MATLAB) یا اکسل پیست کنی تا بتونی گراف‌های حرفه‌ای رسم کنی و واکنش سیستم رو با دقت بیشتری تحلیل کنی. البته ممکنه به خاطر محدودیت‌های نمایشگر خود آردوینو، منحنی‌ها کاملا صاف و بی‌نقص به نظر نرسن.

برای همین پیشنهاد می‌کنم اگر می‌خوای تحلیل‌های خیلی دقیق و مهندسی روی رفتار موتور داشته باشی، حتما از همون ابزارهای جانبی تحلیل داده استفاده کنی.

مرحله ۹

تنظیم ضرایب کنترلر PI و فیلتر (جمع‌بندی)

رسیدیم به بخش نهایی و جذاب کار! پارامترهای کنترلر ما یعنی Kp و Ki در کنار ضریب آلفای فیلتر، تأثیر مستقیمی روی رفتار موتور دارن و مواردی مثل سرعت پاسخ‌گویی، اورشوت (رد شدن از حد مجاز) و خطای حالت ماندگار رو تعیین می‌کنن. تو این پروژه، ما با کلی تست و آزمایش به این نتیجه رسیدیم که مقادیر 2 برای Kp، 3 برای Ki و 0.7 برای آلفا بهترین و نرم‌ترین عملکرد رو بهمون می‌دن.

اما یادت باشه که این اعداد وحی منزل نیستن! بسته به نوع موتوری که استفاده می‌کنی و باری که روش قرار می‌گیره، ممکنه نیاز باشه این ضرایب رو کمی تغییر بدی. پس دست به کار شو، اعداد مختلف رو امتحان کن تا به پایدارترین و دقیق‌ترین حالت ممکن برسی.

امیدوارم از این پروژه پیشرفته تو آیسی‌مدار لذت برده باشی. حتما تجربه خودت از تنظیم این ضرایب رو تو بخش کامنت‌ها بامون به اشتراک بذار!

فایل‌های پیوست

INO moteur_encodeur_pi_V1.ino

تو میتونی اولین سازنده باشی!

اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر

این آموزش با استانداردهای اختصاصی آیسی‌مدار بازنویسی و بهینه‌سازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.

آموزش‌های مشابه

گفتگو‌های کاربران

هنوز نظری ثبت نشده؛ تو شروع کن!