آموزش STM32 با توابع HAL, توصیه شده

تایمر در حالت Encoder برای STM32 | قسمت شانزدهم آموزش STM32 با توابع HAL

تایمر در حالت Encoder

در قسمت قبل از سری آموزش STM32 با توابع HAL، در مورد تایمرهای نگهبان مستقل و پنجره‌ای (IWDG و WWDG)، صحبت شد. در این قسمت، تایمر در حالت Encoder و کاربرد آن را بررسی می‌کنیم. با سیسوگ همراه باشید.

 Encoder

یک نمونه Rotary Encoder

Rotary Endcoder چیست و چگونه کار می‌کند؟

Rotary Encoder ها جزو دسته‌ای از گروه بزرگ‌تری از دستگاه‌های الکترونیکی، یعنی Encoder ها هستند. Encoder ها دسته‌ای از وسایل الکترونیکی هستند که در کاربردهای مختلف و به‌منظورهای مختلفی مثل شمارش و یا اندازه‌گیری موقعیت، سرعت و جهت حرکت، استفاده می‌شوند. Encoder ها به دو دسته کلی Encoder های خطی (Linear) و چرخشی (Rotary) تقسیم می‌شوند. همچنین هر یک از این 2 دسته، براساس نوع اندازه‌گیری (Absolute یا Incremental) و یا تکنولوژی مورداستفاده (مثلاً مغناطیسی، لیزر، مکانیکی، نوری و..) شامل انواع مختلفی از Encoder ها می‌شوند.

 

تایمر در حالت Encoder

انواع Encoder

 

تفاوت Encoder های Absolute و Incremental

روش اندازه‌گیری در این نوع Encoder متفاوت است که این امر موجب می‌شود هرکدام کاربردهای خودشان را داشته باشند. Absolute Encoder، می‌تواند موقعیت را بدون نیاز به نقطه مرجع گزارش کند، درحالی‌که Incremental Encoder، تنها تغییرات را اندازه می‌گیرد و برای به‌دست آوردن موقعیت نیاز به یک مرجع دارد. Absolute Rotary Encoder می‌تواند برای اندازه‌گیری موقعیت زاویه‌ای به‌کار رود. درحالی‌که Incremental Rotary Encoder برای شمارش، اندازه‌گیری موقعیت خطی و اندازه‌گیری سرعت، کاربرد دارد.

 

Encoder

Encoderهای Abolute و Incremental

 

نحوه عملکرد Incremental Encoder بدین‌صورت است که شفت این دستگاه به یک قسمت دایره‌ای شکل شفاف و کدر، مانند یک چرخ، متصل شده است. در یک سوی آن، یک فرستنده اشعه و در قسمت دیگر یک دریافت‌کننده قرارداد. با چرخیدن محور دستگاه، پالس‌های الکتریکی تولید می‌شوند که سپس می‌توانند در مقیاس مناسب قرار گیرند و برای محاسبات مختلف توسط برنامه استفاده شوند.

 

تایمر در حالت Encoder

نحوه کارکرد Incremental Encoder

در مقابل شفت Absolute Encoder، به صفحه‌ای متصل است که برای مشخص کردن موقعیت‌های زاویه‌ای مختلف، روی آن شکاف‌های قوس مانندی به‌صورت کد شده ایجادشده است. یک قسمت دیگر از طریق ارسال و دریافت اشعه‌ی از میان صفحه در حال گردش، موقعیت زاویه‌ای شفت را مشخص می‌کند. ذکر این نکته دارای اهمیت است که در هنگام خاموش شدن این نوع Encoder، برخلاف Incremental Encoder، موقعیت دریافت شده قبلی، حفظ می‌شود و در زمان روشن شدن مجدد دستگاه قابل دریافت است.

تایمر در حالت Encoder

نحوه کارکرد Absolute Encoder

ساختار Incremental Rotary Encoder و کاربرد آن

تا اینجای کار به‌صورت کلی با Encoder ها آشنا شدیم. Encoder مورداستفاده در این قسمت آموزش، یک Incremental Rotary Encoder است که در ادامه، جزییات ساختار و کاربرد آن را بیشتر بررسی می‌کنیم.

 

تایمر در حالت Encoder

تولید دو سیگنال پالس مربعی در خروجی A و B توسط otary Encoder

در این نوع Encoder، در زمان چرخش دستگیره یا همان شفت، دو سیگنال موج مربعی با اختلاف‌فاز 90 درصد روی دو خروجی A و B تولید می‌شود. اختلاف‌فاز این دو سیگنال بدین‌صورت است که اگر چرخش به‌صورت ساعت‌گرد باشد، سیگنال A از B جلوتر خواهد بود و در صورت پادساعت‌گرد بودن چرخش، وضعیت دو سیگنال A و B برعکس می‌شود و سیگنال B جلوتر قرار می‌گیرد.

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

کاربردهای زیادی برای این Encoder وجود دارند که از میان آن‌ها می‌توان شمارش وسایل یا محصولات در حال حرکت روی یک غلتک و یا برش ورقه‌های فلزی در حال حرکت توسط یک ماشین، اشاره کرد.

Incremental Rotary Encoder

یک کاربرد نمونه از Incremental Rotary Encoder در برش ورقه‌های فلزی

سنسور یا همان Rotary Encoder مورداستفاده در این بخش، مانند تصویر نشان داده‌شده در زیر است که به دو صورت بدون بورد و مونتاژ شده روی بورد وجود دارد؛

Encoder

Encoder مورد استفاده

مدار استفاده‌شده در این بورد به‌صورت نشان داده‌شده در شکل زیر است:

مدار برد Encoder

مدار استفاده شده در بورد Encoder

اکنون‌که تا حدود با جزییات و مکانیزم Rotary Encoder آشنا شده‌ایم، به سراغ ایجاد و توسعه یک پروژه نمونه برای به‌کار بردن این قطعه می‌پردازیم.

ایجاد پروژه

در این پروژه نیز مانند گذشته بخش‌های کلاک، دیباگ و USART1 را تنظیم می‌کنیم و یک پایه (مثلاً PA2) را نیز به‌عنوان ورودی و در حالت Pull-up، برای اتصال به پایه SW موجود روی Encoder، قرار می‌دهیم. همان‌طور که در مدارهای مربوط به Encoder مورداستفاده نشان داده‌شده است، این پایه مربوط به کلید فشاری است که در صورت فشرده شدن، پایه SW به زمین متصل می‌شود.

حالا باید یک تایمر (TIM2) را در حالت Encoder تنظیم کنیم.

ایجاد پروژه

تنظیم TIM2 در حالت Encoder

اکنون تنظیمات موردنیاز برای راه‌اندازی اولیه‌ی Encoder انجام‌شده است. پس پروژه را ذخیره می‌کنیم و وارد کد می‌شویم.

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

مانند پروژه‌های پیشین، ابتدا اعمال مربوط به ریتارگت کردن stdio را انجام می‌دهیم. سپس در تابع int main دو متغیر زیر را برای ذخیره حالت کلید و شمارنده تعریف می‌کنیم:

سپس هردو کانال Encoder مربوط به TIM2 را راه‌اندازی می‌کنیم:

اکنون کد زیر را در حلقه while(1) می‌نویسیم تا در هنگام چرخش دستگیره Encoder یا فشرده شدن کلید آن، تغییر وضعیت در پورت سریال چاپ شود:

پس از کامپایل و دانلود، می‌توانیم نتیجه اجرا را در ترمینال سریال ببینیم:

ترمینال سریال

نتیجه تغییرات Encoder در ترمینال سریال

همچنین می‌توانیم با اضافه کردن کد شرطی زیر، در هنگام فشرده شدن کلید، مقدار شمارنده را در حد وسط آن یا صفر برگردانیم (البته روش صحیح این است که این عمل در وقفه خارجی صورت گیرد):

در این قسمت از سری آموزش STM32 با توابع HAL، حالت Encoder تایمر و کاربرد آن را بررسی کردیم. در قسمت بعدی، در مورد نحوه استفاده از تایمر برای خواندن سنسور Hall صحبت خواهیم کرد. با ما همراه باشید.

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

منبع 1

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

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

1 دیدگاه در “تایمر در حالت Encoder برای STM32 | قسمت شانزدهم آموزش STM32 با توابع HAL

  1. Avatar for محمد حسین محمد حسین گفت:

    با عرض سلام و خسته نباشید…
    واقعا دمتون گرم با این آموزش های خوبی که گذاشتید برای STM32، مشتاقانه منتظر ادامه آموزش ها هستیم و امیدوارم ادامه دار باشه
    ممنون از سایت خوب سیسوگ و سیاوش عزیز بابت زحمت هاش

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

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