آموزش محاسبه Dead Time(زمان مرده) در تایمرهای STM32

Dead Time در تایمرهای STM32 چیه؟

Dead Time یا "زمان مرده" یه فاصله زمانی کوتاهه که تو تایمرهای پیشرفته STM32 (مثل TIM1 و TIM8) بین خاموش شدن یه سیگنال PWM و روشن شدن سیگنال مکملش ایجاد می‌شه. این فاصله برای جلوگیری از هم‌پوشانی سیگنال‌ها و مشکلاتی مثل اتصال کوتاه تو مدارهای قدرت خیلی مهمه.

 

آموزش محاسبه Dead Time(زمان مرده) در تایمرهای STM32

 

مثلاً فرض کنین داریم یه پل H برای کنترل موتور طراحی می‌کنیم. اگه دو ترانزیستور بالا و پایین همزمان روشن بشن، جریان زیادی کشیده میشه و با رخ دادن اتصال کوتاه مدار آسیب میبینه. Dead Time اینجا میاد وسط و یه وقفه کوچیک می‌ذاره تا خیال ما از بابت این مشکل راحت باشه.

 

کاربردهاش کجاست؟

  1. کنترل موتور: برای سوئیچینگ امن تو درایورهای موتور DC یا BLDC.
  2. اینورترها: تو سیستم‌های تبدیل توان، مثلاً اینورترهای خورشیدی.
  3. منابع تغذیه سوئیچینگ: جاهایی که PWM مکمل با دقت بالا نیاز دارن.

این ویژگی تو تایمرهای پیشرفته STM32 هست و تو مستندات Reference Manual (مثلاً RM0008) توضیحاتش رو می‌تونیم پیدا کنیم.

 

چطور Dead Time رو محاسبه کنیم؟

برای تنظیم Dead Time باید رجیستر BDTR (Break and Dead-Time Register) رو تو تایمر پیکربندی کنیم. بیت‌های DTG[7:0] تو این رجیستر مقدار زمان مرده رو تعیین می‌کنن. فرمول محاسبش به فرکانس کلاک تایمر (TIMxCLK) و مقدار DTG بستگی داره. مطابق تصویر این موارد در رفرنس منوال قابل مشاهده است:

 

آموزش محاسبه Dead Time(زمان مرده) در تایمرهای STM32

 

مطابق تصویر بالا، زمان مرده شامل 4 حالت خواهد بود که برای هر حالت زمان مرده یا dead time به صورت زیر محاسبه میشه:

آموزش محاسبه Dead Time(زمان مرده) در تایمرهای STM32

 

در تصویر بالا T_DT زمان مرده و T_DTG برابر پریود تایمر هستن. با در نظر گرفتن فرکانس 8 مگاهرتز برای تایمر خواهیم داشت:

T_DTG = 1 / (8 * 10^6) = 125 ns

حالا ما میدونیم مطابق با اون چه که در رفرنس منوال اومده باید برای زمان های مرده مختلف از یکی از این چهار حالت بالا استفاده کنیم. در اصل بسته به این که DTG[7:5] دارای چه مقداری باشه طبق تصویر بالا 4 حالت خواهیم داشت. بهترین حالت این هست که با دونستن فرکانس تایمر، مقدار کمینه و بیشینه برای زمان مرده رو برای همه 4 حالت محاسبه کنیم و با بدست آورردن گام زمان مرده برای هر تغییر واحد در رجیستر مربوطه، مشخص کنیم زمان دلخواه خودمون در چه حالتی جا میگیره و اون رو به درستی در در این رجیستر تنظیم کنیم. برای این که مطلب جا بیفته، با فرض داشتن تایمری با فرکانس 8 مگاهرتز، ما دو مثال برای داشتن زمان مرده(dead time) برابر 2 میکروثانیه و 120 میکروثانیه رو بررسی میکنیم:

برای زمان مرده 2 میکروثانیه

 

آموزش محاسبه Dead Time(زمان مرده) در تایمرهای STM32

 

مقدار 16 در رنج 255-0 جا میگیره و DTG[7:5] = 000 هست. بنابراین در حالت اول ما میتونیم به زمان مرده مطلوب خودمون برسیم. بنابراین در کد باید چنین حالتی رو داشته باشیم:

TIM1->BDTR &= ~(0xFF); // Clear DTG bits

TIM1->BDTR |= 16;      // Set DTG to 16

برای محاسبه زمان مرده 120 میکروثانیه

 

آموزش محاسبه Dead Time(زمان مرده) در تایمرهای STM32

 

در این حالت مقدار 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] رو ست میکنیم و سایر بیت های باقی مونده رو هم به گونه ای تنظیم میکنیم که طبق فرمول مشخص شده برای اون حالت خاص، زمان دلخواه ما بدست بیاد. به همین راحتی!

 

نکات پایانی

  • همیشه فرکانس کلاک تایمر رو در نظر داشته باشید و پریود تایمر رو به درستی تنظیم کنید.
  • اگه زمان مرده بیشتری لازم داشته باشیم، باید فرکانس تایمر​ رو با پیش‌تقسیم‌کننده کم کنیم.
  • در نهایت هم می‌تونیم خروجی رو با اسیلوسکوپ تست کنیم تا مطمئن بشیم همه چیز درست کار می‌کنه!

 

امیدواریم از این آموزش استفاده برده باشید!

 

با سایر آموزش های اصفهان درایو همراه باشید!

 

۵
از ۵
۳ مشارکت کننده

بلاگ تخصصی اصفهان درایو