مقاله, آموزش, توصیه شده, STM32, STM, ARM, STM32_LL

آموزش STM32 با توابع LL قسمت بیست و سوم: ساخت تایمر 32 و 64 بیتی

با ساختار تایمر در قسمت دوازدهم از سری آموزش‌های STM32 آشنا شدیم و حال می‌خواهیم روش ساخت تایمر 32 و 64 بیتی را بررسی کنیم. تا حالا دقت کرده‌اید که بیشتر تایمرها در خانواده میکروکنترلرهای ST به شکل ۱۶ بیتی هستند ممکن است در نگاه اول مسئله چندان هم جدی نباشد اما گاهی پیش می‌آید که برای اندازه‌گیری طول یک پالس با دقت بالا نیاز پیدا می‌کنیم که تایمری با تعداد بیت‌های بیشتری در اختیار داشته باشیم یا مثلاً اگر قصد شمارش بلادرنگ ایونتی را داشته باشیم که تعداد آن از ۶۵۵۳۶ بیشتر باشد آنگاه چه‌کار باید کرد؟ آیا لازم است که از خانواده‌ای از میکروکنترلر استفاده کرد که تایمرهایی با دقت بالا دارند؟ یا می‌شود به شکلی این مسئله را حل کرد! البته که راه‌های نرم‌افزاری برای حل این مشکل وجود دارد وقتی‌که از اینتراپت بخواهیم استفاده کنیم اما باید اضافه کنم که راه‌حل ساده‌تری برای دست‌یابی به این مهم وجود دارد.

 

چطور می‌شود تایمر ۶۴ بیتی ساخت؟

همان‌طور که می‌دانید، در میکروکنترلر STM32F103C8T6 که در بورد Blue Pill به‌کاررفته است، تنها تایمرهای 16 بیتی وجود دارد. اگر برای کاربرد خاصی نیاز به تایمر بزرگ‌تری داشته باشیم (مثلاً برای اندازه‌گیری فرکانس‌های بالا یا شمارش‌های طولانی یک واقعه یا گذر زمان)، باید با استفاده از این تایمرهای 16 بیتی، و اتصال آن‌ها به‌صورت سخت‌افزاری، عمل موردنظرمان را انجام دهیم. به عبارت دقیق‌تر اگر هر بار سرریز تایمر 1 به‌عنوان کلاک تایمر 2 عمل کند، بدین گونه یک تایمر 32 بیتی ساخته‌ایم. به همین ترتیب اگر 3 یا 4 تایمر را به هم متصل کنیم، تایمر 48 و 64 بیتی در اختیار خواهیم داشت.

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

 

 

قبلاً گفته شد که برای هر تایمر، منبع کلاک می‌تواند به‌صورت داخلی یا خارجی تنظیم می‌شود. همچنین، برای هر تایمر یک منبع تریگر می‌توان تعریف کرد. این تریگر می‌تواند از منبع‌های مختلفی فرستاده شود. در حالتی که تایمر روی حالت Slave Mode و External Clock Mode1 تنظیم‌شده باشد، منبع تریگر به‌عنوان منبع کلاک در نظر گرفته می‌شود. بنابراین با این روش می‌توان کلاک یک تایمر را توسط یک تایمر دیگر تأمین نمود. در ادامه برای ساخت تایمر 32 و 64 بیتی با سیسوگ همراه باشید.

 

ایجاد پروژه

در محیط Cube MX یک پروژه جدید ایجاد می‌کنیم و مراحل تنظیم کلاک و دیباگ را مانند گذشته انجام می‌دهیم. تایمرها را به ترتیب و به‌صورت زیر تنظیم می‌کنیم.

تنظیم تایمر 1

                                                                                                             تنظیم تایمر 2

تنظیم تایمر 3

                                                                                                       تنظیم تایمر 4

 

بدین ترتیب هر تایمر با update event یا سرریز کردن یک تایمر دیگر، شمارش می‌کند و عملاً هر 4 تایمر را به هم متصل کرده‌ایم. کلاک تایمر اول را هم از پایه خارجی تأمین می‌کنیم تا بتوانیم تعداد پالس یک عمل خاص را بشماریم.

 

اندازه‌گیری فرکانس با تایمر 32 بیتی

به‌عنوان یک کاربرد نمونه برای تایمر 32 بیتی، می‌خواهیم فرکانس یک سیگنال ورودی (که دوره تناوب کوچک و فرکانس بالایی دارد) را بدون استفاده از حالت Input Capture، اندازه‌گیری کنیم. بدین منظور تایمرهای 1 و 2 را طبق شکل‌های بالا تنظیم می‌کنیم و تنظیم تایمر 3 را برای اندازه‌گیری زمان 1 ثانیه، طبق شکل زیر انجام می‌دهیم:

تنظیم تایمر3 (فرکانس کلاک میکرو 72 مگاهرتز تنظیم شده است).

و همچنین وقفه تایمر 3 را فعال می‌کنیم.

در ادامه، برای ایجاد یک موج با فرکانس 12 مگاهرتز (برای معیار درستی اندازه‌گیری) تایمر 4 را در حالت PWM تنظیم می‌کنیم؛

تنظیم تایمر 4 در حالت PWM (برای تولید موج با فرکانس 12 مگاهرتز)

همچنین واحد USART1 را برای نمایش دادن فرکانس محاسبه‌شده فعال می‌کنیم. بقیه‌ی مراحل ایجاد پروژه را مانند گذشته طی می‌کنیم و کد پروژه را ایجاد می‌کنیم تا وارد محیط نرم‌افزار Keil شویم.

 

نوشتن کد پروژه

در نوشتن کد مربوط به این پروژه یکی از کارهایی که باید انجام دهیم فعال‌سازی هر 4 تایمر و همچنین فعال‌سازی وقفه مربوط به تایمر 3 است؛

در ادامه، در فایل stm32f1xx_it.c متغیرهای زیر را تعریف می‌کنیم:

می‌توانیم برای نمایش اطلاعات، از ریدایرکت تابع printf استفاده کنیم، بدین منظور هدرفایل stdio.h را اضافه کرده و توابع زیر را تعریف می‌کنیم:

در تابع وقفه تایمر 3 کد زیر را برای محاسبه و نمایش فرکانس می‌نویسیم:

اکنون تنها کاری که باید انجام دهیم اتصال خروجی PWM به پایه مربوط به کلاک خارجی تایمر 1 است (پایه‌های B6 و A12)، تا فرکانس سیگنال PWM اندازه‌گیری شود. درصورتی‌که تمامی مراحل به‌درستی انجام‌شده باشه در ترمینال سریال مقدار فرکانس و تعداد پالس‌های دریافت شده را می‌بینیم و درنهایت توانستیم تایمر 64 بیتی با توابع LL را پیاده‌سازی کنیم.

 

نمایش فرکانس اندازه‌گیری شده در ترمینال سریال

 

   لینک این پروژه در گیت‌هاب

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

بازگشت به لیست

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.