پریفرال تایمر در STM32F1

تایمر های STM32 به شکل باور نکردنی قدرتمند هستند ، در بعضی کاربرد ها مثل PFC در منابع تغذیه ، کنترل موتور یا پیاده سازی پروتکل های ارتباطی ، فقط به خاطر تایمرشون از این میکروکنترلرهای STM32 استفاده میشه. هدف این مقاله این هست که شما نکات مهم در مورد پریفرال تایمر میکروکنترلر های STM32 رو یاد بگیرید.



مشاهده ویدئوی تنظیمات کلاک میکروکنترلر STM32F103C8 بصورت رجیستری در یوتیوب


کد تنظیم کلاک با CMSIS استاندارد برای STM32F103C8:

کد تنظیم کلاک با CMSIS با دسترسی به بیت فیلد برای STM32F103C8:

 

تایمر های STM32 به چه دردی میخورن؟

تایمرها در میکروکنترلر های STM32 در دو زمینه استفاده میشن. 


ارسال ، دریافت و اندازه گیری شکل های مختلف پالس با تایمر میکروکنترلر STM32

اگر از من میخواستن اسم پریفرال تایمر در میکروکنترلر های STM32 رو انتخاب کنم ، اسمشو ” ماشین پالس ” میزاشتم. پالس چیه؟ پالس یعنی ولتاژی که سطحش تغییر میکنه و لبه ی بالا رونده و پایین رونده داره. کل الکترونیک دیجیتال هم همینه. تایمر های STM32 میتونن شکل های مختلف پالس رو تولید ، دریافت و اندازه گیری کنند. کاربرد تولید پالس با تایمر STM32 چیه؟

–  منابع تغذیه و درایورهای موتور : تایمر های STM32 به دلیل وجود قابلیت هایی مثل : وجود نات کانال خروجی ، تولید زمان مرده ، قابلیت ترمز و … در ساخت منابع تغذیه و درایور انواع موتور بسیار قدرتمند هستند. مثلا در بخش PFC منابع تغذیه ی ماینر ها، led درایور ها ، منابع تغذیه ی نیم پل و تمام پل ، درایور موتورهای BLD استفاده میشن.

– ساخت بستر سخت افزاری پروتکل های ارتباطی : بسترهای سخت افزاری USART ، SPI و I2C شکل های خاصی از ارسال و دریافت پالس هستند. با تایمر + DMA در میکروکنترلرهای STM32 میتونیم USART ، SPI و I2C رو پیاده سازی کنیم !!! البته این پریفرال ها در میکروکنترلرهای STM32 وجود دارن و نیازی به این کار نیست ، ولی به بسترهای سخت افزاری هم نیاز داریم که در میکروکنترلر ما موجود نیستند ، مثل پارالل و one wire bus . با استفاده از تایمر های STM32 میشه بستر سخت افزاری این ارتباط ها رو با CPU load بسیار کم ساخت.

– شمارش پالس ساده : با تایمر های STM32 میشه کانترهای سخت افزاری با قابلیت های عجیب درست کرد. یا میتونیم پالس های انکودر رو بشماریم.


پالس


زمان بندی با تایمر STM32

زمینه دوم و پیش پا افتاده ی کاربرد زمان بندی هست. با تایمر ها میتونیم زمان رو اندازه گیری کنیم یا میتونیم در بازه های زمانی مشخص کاری رو انجام بدیم. 


تایمر های میکروکنترلرهای STM32 : بلوک دیاگرام

در تصویر زیر بلوک دیاگرام تایمر های advanced-control در میکروکنترلرهای STM32 رو میبینید. این نوع تایمر ها بیشتری قابلیت رو دارند و تایمر های 1 و 8 از این نوع هستند. تایمرهای advanced-control از چهار بخش اصلی تشکیل شدن:

    1. masetr/slave controller
    2. time-base
    3. timer channels
    4. break feature

آموزش stm32 ، بلوگ دیاگرام تایمر ها advance

 

تایمرهای STM32 : بخش time-base

در بخش time-base تایمر های advance-control میکروکنترلر های STM32 چهار رجیستر اصلی وجود داره:

    • TIM_CNT

    • TIM_ARR

    • TIM_PSC

    • TIM_RCR

در مورد رجیستر TIM_RCR بعدا صحبت میکنیم ، چون فقط در تایمرهای advance-control وجود داره. رجیستر CNT یا کانتر شمارنده هست ، مقدار این رجیستر با هر لبه ی بالا رونده ی کلاک CK_CNT  یک دونه زیاد میشه، از صفر شروع میکنه تا به مقدار رجیستر ARR برسه. وقتی به ARR رسید ، آپدیت ایونت اتفاق میافته و مقدار کانتر صفر میشه و دوباره شروع به شمردن میکنه تا به ARR برسه.(کانتر میتونه بالارونده ، پایین رونده یا center-aligned (بعدا میفهمی چیه) بشماره ، در توضیحات بالا اینارو نگفتم که گیج نشی).

رجیستر پری اسکیلر هم برای تنظیم کلاک CNT هست ، مقدار فرکانس کلاک ورودی به پری اسکیلر تقسیم بر رجیستر PSC + یک میشه تا فرکانس کلاک CNT رو بسازه.

آموزش stm32 ، بخش time-base در تایمر

 

محاسبات بخش time-base در تایمر های STM32

هر بار که بخواهید از تایمر استفاده کنید باید مقدار دو رجیستر ARR و PSC رو طوری تنظیم کنیم که دو پارامتر زیر مطلوب ما باشند: (دو پارامتر رو در تصویر بالا پیدا کنید)

– T_(CK_CNT : دوره تناوب کلاک CNT ، فاصله ی زمانی بین دو لبه ی بالارونده یا پایین رونده ی کلاک CNT هست. این مقدار زمانی هست که طول میکشه تا رجیستر CNT یک دونه زیاد بشه. این عدد دقت یا رزولوشن شمارنده هست.

– T_(counter)  : دوره تناوب کانتر ، زمانی که طول میکشه تا مقدار رجیستر CNT از صفر به ARR برسه. این عدد ظرفیت کانتر رو مشخص میکنه ، اینکه کانتر تا چه زمانی رو میتونه اندازه گیری کنه.

 

محاسبه ی رجیستر PSC در تایمر های STM32

دوره تناوب کلاک CNT میشه ، یک تقسیم بر فرکانس کلاک CNT و فرکانس کلاک CNT میشه : فرکانس کلاک PSC  تقسیم بر ( PSC + 1 ) . دقت کنید رجیستر PSC ، تعداد 16 بیت داره و مقدارش کوچکتر مساوی 65535 هست.

آمورش تایمر STM32 ، دوره تناوب کلاک CNT ورجیستر پری اسکیلر

 

محاسبه ی رجیستر ARR در تایمر های STM32

با توجه به اینکه کانتر از صفر تا ARR میشماره ، و هر بار که یکی زیاد بشه اندازه ی دوره تناوب کلاک CNT طول میکشه. پس به اندازه ی ( 1 + ARR )  ضرب در دوره تناوب کلاک CNT طول میکشه تا کانتر ریلود بشه. دقت کنید که ARR یک رجیستر 16 بیتی هست و مقدارش باید کوچکتر مساوی 65535 باشه.

آموزش تایمر STM32 ، دوره تناوب کانتر و رجیستر ARR

 

جهت شمارش کانتر در تایمر های STM32

در up-counting mode کانتر بالارونده میشماره ، رجیستر cnt از مقدار صفر تا ARR میره و وقتی دوباره قراره صفر بشه ، آپدیت ایونت تولید میشه در نتیجه ی over flow تولید میشه.

آموزش stm32 ، کانتر در حالت up-counting mode

در down-counting mode کانتر پایین رونده میشماره ، رجیستر CNT از مقدار ARR شروع میکنه و تا صفر میره ، وقتی دوباره مقدار ARR در کانتر reload میشه ، آپدیت ایونت در نتیجه ی underflow تولید میشه.

آموزش stm32 ، کانتر در حالت down-counting mode

حالت center-aligned کانتر زیگزاگی میشماره ، از صفر شروع میکنه تا ARR-1 میره ، در لحظه ای که به ARR میرسه overflow داریم و آپدیت ایونت ، در ادامه از ARR کاهنده میشماره تا 1 ، در لحظه ای که صفر شد، underflow داریم و آپدیت ایونت.

آموزش stm32 ، کانتر در حالت center aligned mode

تایمرهای STM32 : قابلیت  Preload

قابلیت پریلود در تایمر ها بسیار ضروری هست ، این قابلی باعث میشه بتونیم تغییر در رجیسترها تایمر رو سنکرون کنیم. پریلود برای رجیستر ها یا بیت فیلد های زیر وجود داره:

    • auto-reload register (TIMx_ARR)

    • Prescaler register (TIMx_PSC)

    •  Timer channel registers (TIMx_CCRy)

    • CCxE and CCxNE control bit-fields within TIMx_CCER

    • OCxM control bit-fields in TIMx_CCMRn

    • repetition counter register (TIMx_RCR) 

وجود قابلیت پریلود برای یک رجیستر به این معنا هست که دو نسخه برای اون رجیستر وجود داره ، یکی preload و یکی shadow ، نسخه ی preload ، نسخه ای هست که ما مقادیر جدید رو در اون ثبت میکنیم. نسخه ی shadow اون مقداری هست که خود تایمر ازش استفاده میکنه. مقدار preload در آپدیت ایونت به رجیستر shadow منتقل میشه.

آموزش stm32 ، قابلیت preload در تایمر

تایمرهای STM32 : رجیستر RCR در تایمر های advance

در تایمر های advance control بغیر از رجیستر CNT یک شمارنده دیگه هم وجود داره به نام repetition counter که 8 بیتی هست یعنی از 255 تا صفر میتونه بشماره ، این شمارنده دائما پایین رونده میشماره و بر خلاف CNT نمیتونیم مقدارش رو بخونیم یا در اون بنویسیم. دسترسی ما به مقداری هست که بعد از صفر شدن این کانتر در اون reload میشه که این مقدار رو در رجیستر RCR ثبت میکنیم. هر بار که برای کانتر اصلی overflow یا underflow اتفاق بیافته مقدار repetition counter یه دونه کم میشه ، تا به صفر برسه. وقتی مقدارش صفر شد ، دفعه بعدی که overflow یا underflow داشته باشیم ، مقدار RCR در repetition counter دوباره reload میشه.

آمورش STM32 ، رجیستر repetition counter در تایمر

تاثیر repetition counter بر آپدیت ایونت در تایمر های STM32

آپدیت ایونت فقط وقتی اتفاق میافته که repetition counter صفر باشه و با استفاده از رجیستر RCR میتونیم نرخ اتفاق افتادن آپدیت ایونت رو کنترل کنیم. (1+RCR) دفعه که کانتر اصلی overflow یا  underflow بشه ، آپدیت ایونت اتفاق میافته. 

آمورش STM32 ، رجیستر RCR و نرخ آپدیت ایونت در تایمرها

تایمرهای STM32 : حالت one pulse mode ، تک پالس

اگر حالت one pulse mode رو فعال کنیم ، بعد از استارت ، کانتر CNT شروع به شمردن میکنه تا وقتی آپدیت ایونت اتفاق بیافته. بعد از آپدیت ایونت دیگه نمیشماره و متوقف میشه.

آموزش stm32 ، حالت one pulse mode در تایمر ها


تایمرهای STM32 : کانال خروجی تایمر ، output compare

تایمرهای میکروکنترلر STM32 حداکثر میتونن 4 تا کانال داشته باشن. هر کانال یک رجیستر اصلی به نام CCR داره و کانال میتونه در حالت ورودی یا خروجی تنظیم بشه. یک کانال نمیتونه همزمان هم ورودی و هم خروجی باشه.


آمورش STM32 ، کانال های تایمر ها


در حالت خروجی در رجیستر CCR کانال یک عدد مینویسیم و کانتر رو استارت میکنیم. کانال خروجی تایمر ، وضعیت پین خروجی کانال رو با توجه به نتیجه ی مقایسه ی مقدار رجیستر کانتر و رجیستر CCR کانال تغییر میده. به همین خاطر به کانال خروجی output compare میگن ، چون با توجه به نتیجه ی compare ( مقایسه) وضعیت پین خروجی تغییر پیدا میکنه. خروجی رو در یکی از حالت های زیر میتونیم تنظیم کنیم:

    • Frozen : پین خروجی نداریم ولی برای مقایسه ی CNT با یک عدد قراره از کانال استفاده کنیم

    • active level on match : وقتی CNT و CCR برابر بشن خروجی یک میشه ( اگر active high تنظیم کنیم )

    • inactive level on match : وقتی CNT و CCR برابر بشن ، خروجی صفر میشه ( اگر active high تنظیم کنیم)

    • Toggle : وقتی CNT و CCR برابر بشن ، اگر خروجی یک باشه صفر و اگر صفر باشه یک میشه

    • Force inactive level : بدون در نظر گرفتن مقایسه خروجی صفر میشه 

    • Force active : بدون در نظر گرفتن مقایسه خروجی یک میشه

    • PWM mode 1

    • PWM mode 2


خروجی PWM mode1 در تایمر های STM32

– وقتی کانتر کوچکتر از CCR باشه ، خروجی یک هست.

– کانتر بزرگتر از CCR باشه ، خروجی صفر هست.


آموزش stm32 ، خروجی PWM mode1


خروجی PWM mode2 در تایمر های STM32

– وقتی کانتر کوچکتر از CCR باشه ، خروجی صفر هست.

– کانتر بزرگتر از CCR باشه ، خروجی یک هست.


آموزش STM32 ، خروجی PWM mode2


تایمرهای STM32 : کانال ورودی تایمر ، input capture

در حالت ورودی ، در رجیستر CCR مقداری نمینویسیم ، خود تایمر این کار رو انجام میده ، ما مقداری که تایمر نوشته رو میخونیم. وقتی کانال در حالت ورودی هست ، ممکنه یک پین به یک کانال یا دو کانال وصل شده باشه، وقتی وضعیت این پین تغییر کنه ، تایمر مقدار رجیستر کانتر رو در لحظه ی تغییر وضعیت پین ورودی در رجیستر CCR کانال ثبت میکنه. به همین خاطر به کانال ورودی input capture میگن ، چون تغییر وضعیت پین ورودی capture میشه.


اتصال پین های ورودی به رجیسترهای CCR

وقتی کانال در حالت ورودی هست ، یعنی میخواهیم بفهمیم که تغییر وضعیت روی پین ورودی کی اتفاق میافته، خب شاید بخواهی هم لبه ی بالارونده و هم لبه ی پایین رونده رو شناسایی کنیم ، برای همین باید بتونیم یک پین ورودی رو به دو رجیستر CCR وصل کنیم ، تا یک CCR عدد کانتر رو در لبه ی بالارونده پین ورودی در خودش ثبت کنه و یک CCR عدد کانتر رو در لبه ی پایین رونده ی پین ورودی ثبت کنه. امکان اتصال ورودی های کانال ها به رجیستر های CCR رو در تصویر زیر مشخص کردم.

آموزش STM32 ، اتصال ورودی های تایمر به کانال های ورودی


تایمرهای STM32 : بخش master/slave controller

بخش master/slave controller در تایمر های STM32F1 وظیفه ی کنترل بخش time-base و کانتر رو به عهده داره. سیگنال کنترل کننده ی بخش time-base میتونه از یک تایمر دیگه بیاد . اون تایمری که کنترل میشه رو میگن master و تایمری که کنترلر میکنه رو میگن slave . در تایمر master در بخش master/slave controller مشخص میکنیم که سیگنال کنترل کننده از کجای تایمر ارسال بشه ، و در تایمر slave مشخص میکنیم که سیگنالی که از تایمر master میاد ، چی رو کنترلر کنه. به سیگنال کنترلی که از تایمر master خارج میشه ، میگن TRGO یا تریگر خروجی. به سیگنال کنترلی که به تایمر slave وارد میشه میگن TRGI یا تریگر ورودی.


در میکروکنترلر STM32 روی تایمر slave چه کنترلی داریم؟

– حالت slave  خاموش : کلاک اینترنال منبع کلاک پری اسکیلر خواهد بود و وقتی بیت CEN یک بشه ، کانتر شروع به شمردن میکنه

– انکودر : 3 حالت ب

– ریست : لبه ی بالارونده ی تریگر ورودی کانتر رو ریلود میکنه و آپدیت ایونت تولید میشه

– gated mode : کلاک کانتر وقتی فعال هست که تریگر ورودی یک باشه ، کانتر متوقف میشه ( ریلود نمیشه ) وقتی تریگر صفر بشه

– حالت تریگر : کانتر در لبه ی بالارونده ی سیگنال تریگر شروع به شمارش میکنه ولی ریست نمیشه.

– کلاک خارجی حالت 1 : کلاک پری اسکیلر از تریگر تامین میشه. اینجوری میتونیم از تایمر master برای پی اسکیل کردن کلاک تایمر slave استفاده کنیم.


منابع تریگر در تایمر master در میکروکنترلر STM32

– حالت slave  خاموش : کلاک اینترنال منبع کلاک پری اسکیلر خواهد بود و وقتی بیت CEN یک بشه ، کانتر شروع به شمردن میکنه

– انکودر : 3 حالت ب

– ریست : لبه ی بالارونده ی تریگر ورودی کانتر رو ریلود میکنه و آپدیت ایونت تولید میشه

– gated mode : کلاک کانتر وقتی فعال هست که تریگر ورودی یک باشه ، کانتر متوقف میشه ( ریلود نمیشه ) وقتی تریگر صفر بشه

– حالت تریگر : کانتر در لبه ی بالارونده ی سیگنال تریگر شروع به شمارش میکنه ولی ریست نمیشه.

– کلاک خارجی حالت 1 : کلاک پری اسکیلر از تریگر تامین میشه. اینجوری میتونیم از تایمر master برای پی اسکیل کردن کلاک تایمر slave استفاده کنیم.


تایمر STM32 ، کلاک خارجی حالت 2 در بخش master/slave controller

با استفاده از این قابلیت تایمر میتونیم کلاک پری اسکیلر رو از خارج میکروکنترلر با استفاده از پین ETR تامین کنیم. اینطوری کانتر در لبه های بالارونده یا پایین رونده ی پین ETR شمارش رو انجام میده ، مثلا اینجوری میشه تعداد دفعات فشرده شدن یک کلید رو به صورت سخت افزاری شمرد بدون اینکه از اینتراپت خارجی استفاده کنیم.

آموزش تایمر STM32 ، کلاک خارجی حالت 2 ، external clock mode2

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا