طراحی و راهاندازی اینورترهای سهفاز برای کنترل موتورهای الکتریکی (مانند موتورهای BLDC، PMSM و القایی AC) تنها به طراحی مدار قدرت و انتخاب سوئیچینگ مناسب محدود نمیشود. در سیستمهای الکترونیک قدرت مدرن، «مغز متفکر» سیستم، یعنی فریمور (Firmware) و معماری نرمافزاری میکروکنترلر است که پایداری، راندمان و طول عمر سختافزار را تضمین میکند.

در این مقاله تخصصی از مجموعه اصفهان درایو، قصد داریم کدهای سطح پایین و معماری نرمافزار برای یک اینورتر سهفاز سینوسی (SPWM) را بر روی میکروکنترلرهای خانواده STM32 بررسی کنیم. این معماری بر پایه زبان C شیگرا (Object-Oriented C)، بدون توابع مسدودکننده (Blocking) و با تکیه بر محاسبات نقطه ثابت (Fixed-Point DSP) توسعه یافته است.
۱. مبانی اینورتر سهفاز و چالشهای کنترل نرمافزاری
یک اینورتر سهفاز از ۶ سوییچ قدرت (مانند IGBTهای تعبیه شده در یک ماژول IPM) تشکیل شده است که در قالب ۳ بازو (Leg) به نامهای U, V و W مداربندی شدهاند. کنترل روشن و خاموش شدن این سوییچها نیازمند تولید سیگنالهای PWM دقیق است.
در روش SPWM (مدولاسیون پهنای پالس سینوسی)، یک موج سینوسی مرجع با یک موج مثلثی با فرکانس بالا (فرکانس سوئیچینگ) مقایسه میشود. در میکروکنترلرهای STM32، موج مثلثی به صورت سختافزاری توسط تایمر پیشرفته (مانند TIM1 یا TIM8) در حالت Center-Aligned تولید میشود. وظیفه نرمافزار، تزریق بیدرنگ (Real-Time) مقادیر موج سینوسی به رجیسترهای مقایسه تایمر (CCR) برای تغییر مداوم عرض پالسها (Duty Cycle) است.

۲. بهینهسازی حافظه: تولید جدول سینوسی (Look-up Table)
اولین قدم در این معماری، پرهیز از محاسبات سنگین مثلثاتی (مانند تابع sin) درون روتین وقفه است. ما از یک جدول از پیش محاسبهشده با ۲۵۶ نمونه استفاده میکنیم که یک سیکل کامل ۳۶۰ درجه الکتریکی را پوشش میدهد.
دامنه این مقادیر در بازه اعداد صحیح علامتدار ۱۶ بیتی (از 32767- تا 32767+) تنظیم شده است.

استفاده از مادیفایر static const در تعریف این آرایه، یک الزام حیاتی در سیستمهای نهفته است. این کار باعث میشود کامپایلر این آرایه حجیم را مستقیماً در حافظه غیرفرار Flash (ROM) قرار دهد و از اشغال بیمورد حافظه ارزشمند RAM جلوگیری کند.
۳. کپسولهسازی سختافزار (معماری OOP در زبان C)
در کدنویسی صنعتی، استفاده از متغیرهای سراسری (Global Variables) ریسک بروز تداخل در حافظه را افزایش میدهد. ما تمام متغیرهای وضعیت، فلگها و پوینترهای سختافزاری را درون یک ساختار (Struct) کپسوله کردهایم.

مزیت دور زدن توابع HAL: در این ساختار، آدرس رجیسترهای CCR مستقیماً به پوینترها پاس داده میشود. در وقفههای سریع (مثلاً ۲۰ کیلوهرتز)، فراخوانی توابع کتابخانه HAL زمان پردازنده را تلف میکند. با این معماری، نوشتن در رجیسترها در یک سیکل کلاک و با تأخیر صفر (Zero Latency) انجام میشود. ضمن اینکه میتوان به صورت همزمان چندین اینورتر مستقل را روی یک میکروکنترلر مدیریت کرد.
۴. مقداردهی اولیه و حفاظت سختافزاری (Bootstrap Clamping)
تضمین ایمنی ماژول قدرت (IPM) بر عهده نرمافزار است. تابع SPWM_Init علاوه بر مقداردهی اولیه، وظیفه محاسبه محدودههای ایمن پالسها را بر عهده دارد.

تحلیل مکانیزمهای حفاظتی در این تابع:
- محافظت ناحیه خطی IGBT (ccr_min_limit): پالس خروجی تایمر در سختافزار میکروکنترلر، دچار برش زمان مرده (Dead-Time) میشود. متغیر safe_pulse_ticks مجموع حداقل پالس روشن ماندن IGBT و زمان مرده است. اگر پالس از این مقدار کمتر شود، IGBT کامل روشن نمیشود و در ناحیه خطی با تلفات حرارتی شدید میسوزد. در حالت Center-Aligned چون پالس فیزیکی دو برابر رجیستر است، حد پایین دقیقاً نصف این زمان در نظر گرفته شده است (safe_pulse_ticks >> 1).
- محافظت خازن بوتاسترپ (ccr_max_limit): در مدار درایور گیت سوییچ بالا (High-Side)، خازن Bootstrap تنها در زمانی که سوییچ پایین روشن است شارژ میشود. اگر نرمافزار دیوتیسایکل را به ۱۰۰٪ برساند، خازن تخلیه شده و ماژول با خطای UVLO متوقف میشود. مقدار سقف مجاز رجیستر (ccr_max_limit) برابر با تفاضل سقف تایمر (arr_val) از حد پایین (hspwm->ccr_min_limit) تعیین شده است تا حداقل زمان لازم برای هدایت سوییچ پایین و شارژ خازن در هر سیکل تضمین گردد.
- شیفت فاز دقیق: فازهای V و W با مقادیر 1431655765 و 2863311530 مقداردهی شدهاند که معادل دقیق ۱۲۰ و ۲۴۰ درجه در یک فضای متغیر ۳۲ بیتی (0xFFFFFFFF) است.
۵. کنترل دقیق فرکانس و دامنه با محاسبات نقطه ثابت (DDS)
برای تنظیم فرکانس خروجی و ولتاژ موتور، از تکنیک DDS (Direct Digital Synthesis) و ریاضیات نقطه ثابت استفاده میکنیم.

در تابع SPWM_Set_Amplitude، به استفاده از کستینگ ۶۴ بیتی (uint64_t) برای متغیر center دقت کنید. چون درصد دامنه، مقدار تایمر مرکزی و عدد ثابت ۶۵۵۳۶ در هم ضرب میشوند، حاصل به سادگی از مرز رجیسترهای ۳۲ بیتی فراتر میرود. استفاده از متغیر ۶۴ بیتی (ULL) پیش از انجام تقسیم نهایی، یک تکنیک حرفهای برای جلوگیری از باگ سرریز ریاضی (Math Overflow) میانمرحلهای است. این محاسبات بیرون از روتین وقفه انجام میشوند تا بار پردازشی به سیستم تحمیل نکنند.
۶. قلب تپنده نرمافزار: روتین وقفه (ISR)
بخش نهایی، روتین وقفهای است که با فرکانس ۲۰ کیلوهرتز (یا بسته به تنظیمات سوئیچینگ) اجرا میشود. این تابع باید بینهایت سریع، ایمن و مستقل از توابع کتابخانهای باشد.

نکات فنی روتین وقفه:
- تولید موج پیوسته (Wrapping): انباشتگرهای ۳۲ بیتی (phase_acc) با مقدار phase_step جمع میشوند. سرریز طبیعی (Rollover) در محدوده ۳۲ بیتی سختافزار، معادل عبور از ۳۶۰ درجه و آغاز مجدد موج سینوسی است. برای یافتن ایندکس جدول نیز، صرفاً ۸ بیت باارزش (MSB) با یک شیفت ساده ۲۴ بیتی) استخراج میشود.
- کلمپینگ (Clamping): در بخش پنجم کد، اگر دیوتیسایکل از ccr_min_limit کمتر شود، مقدار آن کاملاً صفر میشود تا از داغ شدن IGBT جلوگیری شود (Pulse Dropping). و اگر از مرز بالایی تجاوز کند، بر روی ccr_max_limit قفل میشود تا شارژ خازن بوتاسترپ آسیب نبیند.
نتیجه اجرای برنامه و محاسبه دیوتی سایکل کانال های تایمر با پایتون

نویسنده و توسعهدهنده: محمد حسینی
مهندس نرمافزار سیستمهای نهفته و متخصص درایورهای موتور الکتریکی و Edge AI.
برای دسترسی به سورس کدهای کامل و آموزشهای ویدیویی بیشتر، میتوانید به کانال گیتهاب و وبسایت اصفهان درایو مراجعه کنید.
دانلود کتابخانه اینورتر سه فاز با STM32
با اصفهان درایو همراه باشید!










