Dead Time در تایمرهای STM32 چیه؟
Dead Time یا "زمان مرده" یه فاصله زمانی کوتاهه که تو تایمرهای پیشرفته STM32 (مثل TIM1 و TIM8) بین خاموش شدن یه سیگنال PWM و روشن شدن سیگنال مکملش ایجاد میشه. این فاصله برای جلوگیری از همپوشانی سیگنالها و مشکلاتی مثل اتصال کوتاه تو مدارهای قدرت خیلی مهمه.
مثلاً فرض کنین داریم یه پل H برای کنترل موتور طراحی میکنیم. اگه دو ترانزیستور بالا و پایین همزمان روشن بشن، جریان زیادی کشیده میشه و با رخ دادن اتصال کوتاه مدار آسیب میبینه. Dead Time اینجا میاد وسط و یه وقفه کوچیک میذاره تا خیال ما از بابت این مشکل راحت باشه.
کاربردهاش کجاست؟
- کنترل موتور: برای سوئیچینگ امن تو درایورهای موتور DC یا BLDC.
- اینورترها: تو سیستمهای تبدیل توان، مثلاً اینورترهای خورشیدی.
- منابع تغذیه سوئیچینگ: جاهایی که PWM مکمل با دقت بالا نیاز دارن.
این ویژگی تو تایمرهای پیشرفته STM32 هست و تو مستندات Reference Manual (مثلاً RM0008) توضیحاتش رو میتونیم پیدا کنیم.
چطور Dead Time رو محاسبه کنیم؟
برای تنظیم Dead Time باید رجیستر BDTR (Break and Dead-Time Register) رو تو تایمر پیکربندی کنیم. بیتهای DTG[7:0] تو این رجیستر مقدار زمان مرده رو تعیین میکنن. فرمول محاسبش به فرکانس کلاک تایمر (TIMxCLK) و مقدار DTG بستگی داره. مطابق تصویر این موارد در رفرنس منوال قابل مشاهده است:
مطابق تصویر بالا، زمان مرده شامل 4 حالت خواهد بود که برای هر حالت زمان مرده یا dead time به صورت زیر محاسبه میشه:
در تصویر بالا T_DT زمان مرده و T_DTG برابر پریود تایمر هستن. با در نظر گرفتن فرکانس 8 مگاهرتز برای تایمر خواهیم داشت:
T_DTG = 1 / (8 * 10^6) = 125 ns
حالا ما میدونیم مطابق با اون چه که در رفرنس منوال اومده باید برای زمان های مرده مختلف از یکی از این چهار حالت بالا استفاده کنیم. در اصل بسته به این که DTG[7:5] دارای چه مقداری باشه طبق تصویر بالا 4 حالت خواهیم داشت. بهترین حالت این هست که با دونستن فرکانس تایمر، مقدار کمینه و بیشینه برای زمان مرده رو برای همه 4 حالت محاسبه کنیم و با بدست آورردن گام زمان مرده برای هر تغییر واحد در رجیستر مربوطه، مشخص کنیم زمان دلخواه خودمون در چه حالتی جا میگیره و اون رو به درستی در در این رجیستر تنظیم کنیم. برای این که مطلب جا بیفته، با فرض داشتن تایمری با فرکانس 8 مگاهرتز، ما دو مثال برای داشتن زمان مرده(dead time) برابر 2 میکروثانیه و 120 میکروثانیه رو بررسی میکنیم:
برای زمان مرده 2 میکروثانیه
مقدار 16 در رنج 255-0 جا میگیره و DTG[7:5] = 000 هست. بنابراین در حالت اول ما میتونیم به زمان مرده مطلوب خودمون برسیم. بنابراین در کد باید چنین حالتی رو داشته باشیم:
TIM1->BDTR &= ~(0xFF); // Clear DTG bits
TIM1->BDTR |= 16; // Set DTG to 16
برای محاسبه زمان مرده 120 میکروثانیه
در این حالت مقدار 28 در رنج 31-0قرار میگیره و DTG[7:5] = 111 و DTG[4:0] = 28 هست. بنابراین در نهایت باید DTG[7:0] = 0xFC (binary 11111100) تنظیم بشه! داخل کد هم خواهیم داشت:
TIM1->BDTR &= ~(0xFF); // Clear DTG bits
TIM1->BDTR |= 0xFC; // Set DTG to 0xFC
پس در ابتدا با به دست آوردن پریود تایمر که وابسته به فرکانس تنظیمی ما برای اون هست، مشخص میکنیم که چه زمان مرده ای لازم داریم. برای هر 4 حالت، مطابق آن چه در رفرنس منوال اومده زمان کمینه و بیشینه رو حساب میکنیم تا ببنیم زمان مطلوب ما در کدوم حالت جا میگیره. با مشخص شدن حالت، مقدار DTG[7:5] رو ست میکنیم و سایر بیت های باقی مونده رو هم به گونه ای تنظیم میکنیم که طبق فرمول مشخص شده برای اون حالت خاص، زمان دلخواه ما بدست بیاد. به همین راحتی!
نکات پایانی
- همیشه فرکانس کلاک تایمر رو در نظر داشته باشید و پریود تایمر رو به درستی تنظیم کنید.
- اگه زمان مرده بیشتری لازم داشته باشیم، باید فرکانس تایمر رو با پیشتقسیمکننده کم کنیم.
- در نهایت هم میتونیم خروجی رو با اسیلوسکوپ تست کنیم تا مطمئن بشیم همه چیز درست کار میکنه!
امیدواریم از این آموزش استفاده برده باشید!
با سایر آموزش های اصفهان درایو همراه باشید!