اندازه گیری دقیق فرکانس و دیوتی سایکل سیگنال PWM با میکروکنترلر STM32

تصور کنید شما قصد دارید یک اسپید کنترلر براشلس برای خودتون بسازید و کنترل موتور رو با سیگنال PWM انجام بدین. انتخاب روش مناسب و بسیار دقیق به منظور اندازه گیری فرکانس و دیوتی سایکل(Duty Cycle) سیگنال ورودی توسط میکروکنترلر میتونه چالش برانگیز باشه!

قبل از هر چیزی لازمه ذکر بشه که ما در اصفهان درایو، بیشتر آموزش ها رو با استفاده از کتابخونه HAL پیش می بریم. علت این امر هم اینه که با توجه به گویا بودن اسم این توابع(self explanatory) و توضیح عملکردشون در نام خودشون، کار ما برای کنار هم چیدن این توابع برای به دست آوردن نتایج مطلوب خیلی راحته!

مسئله بعدی اینه که سرعت پردازش میکروکنترلرهای ST اونقدر زیاده که استفاده از این توابع برای پروژه های نرمال و بسیاری از پروژه های پیشرفته مشکلی ایجاد نمی کنه! البته پرواضحه که راه های بسیار بهینه تری برای کدنویسی پروژه های خیلی پیشرفته ما وجود داره!

پس ما خودمون رو از درگیر شدن با رجیسترها و برنامه نویسی اون ها جدا می کنیم و از این قابلیت فوق العاده که شرکت st با نرم افزار stm32cubemx در اختیار ما قرار داده استفاده میکنیم.

یکی از ویژگی های تعبیه شده در میکروکنترلر STM32 ، حالت PWM Input Mode هست که به برنامه نویس قابلیت خوندن اطلاعات سیگنال PWM رو به طرز بسیار دقیقی اعطا میکنه! مزیت این روش نسبت به سایر روش ها این هست که با توجه به استفاده از قابلیت input capture (کپچر) خود تایمر، دقت کار تا حد زیادی بالا میره. مزیت دوم این هست که در این روش خود میکرو، وظیفه کپچر کردن لبه پایین رونده و بالا رونده و البته ذخیره کردن مقادیر اون ها در رجیسترهای مناسب رو بر عهده میگیره! دیگه از این ساده تر؟

خب بریم ببینیم باید چیکار کنیم!

ما توی این آموزش قصد داریم از STM32F303RET6 استفاده کنیم.

قبل از هر چیزی ما مطابق تصاویر، ابتدا کریستال خارجی رو فعال میکنیم و کلاک میکرو رو روی 72 مگاهرتز تنظیم میکنیم و قابلیت دیباگ رو هم فعال میکنیم تا بتونیم متغیرهای خودمون در میکرو رو تحت نظر داشته باشیم.

انتخاب کریستال خارجی

 

STM32 PWM Input Mode RCC

 

فعال سازی دیباگ

 

STM32 PWM Input Mode Sys

 

تنظیم کلاک میکرو به 72 مگاهرتز

 

Clock Config

 

ما در اینجا قصد داریم از یکی از کانال های خروجی تایمر خود میکروکنترلر STM32 برای تولید شکل موج PWM خودمون استفاده کنیم. به طور مثال، قصد داریم یک سیگنال 500 هرتز با دیوتی سایکل 50 درصد رو روی کانال 1 از تایمر 1 میکرو ایجاد کنیم. برای این منظور تنظیمات تایمر 1 رو باید مطابق تصویر زیر انجام بدیم:

 

PWM Signal 500Hz Config

 

Timer Freq. = 72 / 9 = 8MHz

each counting period = 1 / 8M = 0.000000125

Timer Period = 16000 * 0.000000125 = 0.002(2ms)

PWM Freq. = 1/0.002 = 500Hz

طبق محاسباتی که در بالا انجام شده، علت انتخاب این مقادیر برای Prescalar و Auto Reload Register واضح میشه. البته که ما فرض رو بر این میذاریم که یک سری مقدمات در مورد نحوه تنظیم این رجیسترها رو شما از قبل میدونید.

حالا این سیگنال تولید شده رو مجددا باید به عنوان ورودی به یکی دیگه از تایمرهای میکروکنترلر داده و از قابلیت PWM Input Mode میکروکنترلر STM32 استفاده کنیم. در نهایت Pinout ما به شکل زیر خواهد بود:

 

STM32 PWM Input Mode Pinout

 

حالا نوبت به این میرسه که تایمر input capture خودمون رو فعال کنیم. ما در اینجا از تایمر شماره 3 که یک تایمر 16 بیتی هست استفاده می کنیم. مطابق تصویر تنظیمات رو انجام میدیم

 

Input Capture Timer Config

 

در اینجا ما در قسمت Combined Channel گزینه PWM input on CH1 رو انتخاب کردیم. یه سری بخش ها به صورت خودکار دستخوش تغییراتی میشن که ما اون ها رو به همون حالت پیشفرض رها میکنیم. برای این که بدونید جزییات مربوطه چی هست شما رو به خوندن reference manual این سری از میکروکنترلرهای STM32 دعوت میکنیم.

در قسمت Parameter Settings ما Prescalar رو به گونه ای تنظیم میکنیم که هر دوره شمردن تایمر 1 میکرو ثانیه باشه. همچنین مقدار ARR رو هم به حداکثر اون تنظیم میکنیم. این به این معنیه که با این پیکربندی تایمر میتونه اطلاعات شکل موجی با دوره تناوب حداکثر و البته تقریبا 65 میلی ثانیه رو به درستی استخراج کنه!

در نهایت ما باید اینتراپت input capture رو فعال کنیم. برای بعضی از تایمرها این امکان فراهمه اما برای تایمر 3 صرفا اینتراپت عمومی اون در دسترسه که باید همین گزینه رو هم مطابق تصویر فعال کنیم.

 

Input Capture Timer NVIC Config

 

حالا ما قادر هستیم پروژه رو تولید بکنیم و در IDE محبوب خودمون برنامه نویسی اون رو پیگیر بشیم. اگر به دیتاشیت مراجعه بکنیم متوجه میشیم که در این حالت تایمر با دریافت لبه بالا رونده، ابتدا مقدار شمارنده کانتر رو در رجیستر CCR1 کپچر و ذخیره میکنه، سپس تایمر رو ریست میکنه و در نهایت با دریافت لبه پایین رونده، مقدار شمارنده کانتر رو در رجیستر CCR2 ذخیره میکنه.

تصویر زیر رو در نظر داشته باشید! مشاهده میکنیم که کپچر مربوط به کانال دوم مربوط به لبه پایین رونده هست که ما میتونیم مشاهده کنیم تایمر تا این لبه چقدر شمرده و دیوتی سایکل رو از اون استخراج کنیم.

همچنین، کپچر مربوط به کانال اول مربوط به لبه بالا رونده است که ما میتونیم از روی اون پریود تایمر رو داشته باشیم.

STM32 PWM Input Mode

حالا صرفا کافی هست اینتراپت کپچر رو اضافه بکنیم و قرائت های مناسب رو انجام بدیم و محاسبات مربوط به اندازه گیری فرکانس و دیوتی سایکل رو انجام بدیم.

 

کد نوشته شده برای پروژه ساخت فرکانس متر با STM32

 

STM32 PWM Input Mode Code Example

 

با استفاده از کد بالا ما قادر هستیم به سادگی، مقدار دیوتی سایکل و فرکانس یک سیگنال PWM رو در پروژه فرکانس متر خودمون به دست بیاریم. توجه کنید که نحوه انجام محاسبات بسیار ساده هست و نیازی به توضیح اضافی نداره اما با توجه به این که فرکانس تایمر 3 الان برابر 1 مگاهرتز هست، در فرمول از عدد 1000000UL استفاده شده.

 

نتیجه پروژه در حالت دیباگ STM32

 

STM32 PWM Input Mode Test Result

 

با دقت بسیار بالایی و مطابق همون چیزی که انتظارش رو هم داشتیم، مقدار دیوتی سایکل و فرکانس استخراج شده و اطلاع سیگنال PWM رو به راحتی در دست داریم. 

یکی دیگه از کاربردهای این قضیه مثلا میتونه در اندازه گیری مسافت با استفاده از ماژول فاصله سنج اولتراسونیک(HC-SR04) باشه. با توجه به نوعی خروجی ای که این ماژول در اختیار ما قرار میده و با ترکیب اون با ویژگی PWM input mode میکروکنترلر STM32 میتونیم در حد بضاعت خود این ماژول یک دقت بسیار خوبی در اندازه گیری مسافت داشته باشیم.

 

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

 

دانلود سورس کد پروژه

main.rar

 

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

 

 

 

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

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