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

توسط | 18 اسفند, 1398 | STM32, میکروکنترلر, وبلاگ | 2 دیدگاه ها

کپچر-تایمر-stm32

آموزش STM32 یوبرد

شروع بازی ST

آموزش های رایگان STM32

فیلم های آموزش STM32

آموزش خصوصی STM32

اخبار جدید یوبرد در اینستاگرام

در این نوشته به کنترل دور موتور DC با فیدبک گرفتن و اتصال این مسیر فیدبک به تایمر General Purpose میکروکنترلرهای STM32 و محاسبه دور موتور الکتریکی با کپچر تایمر میکروکنترلرهای STM32 و فرمول محاسبه دور موتور می پردازیم.

واحد Input capture یکی از قابلیت هایی است که هر تایمر General Purpose، آن را دارد و برای راه اندازی کپچر تایمر میکروکنترلرهای STM32 از این قابلیت مهم استفاده می کنیم. همان طور که در نوشتۀ «تایمرهای میکروکنترلرهای STM32» دیدیم، تایمر General Purpose، چهار کانال مجزا دارد که هر تایمر آن می تواند در هر کدام از این چهار کانال قرار گیرد. یکی از این کانال ها، محاسبه دور موتور با STM32 است که از مد کپچر در میکروکنترلر می توان برای محاسبۀ تعداد دور موتور استفاده کرد. مدهای دیگری نیز به منظور محاسبۀ تعداد دور موتور وجود دارند، اما یکی از بهترین روش ها برای به دست آوردن تعداد دور موتور، استفاده از Input capture است. ابتدا مختصرا روش تولید یک پالس PWM توسط موتور را بررسی می کنیم. سپس به سراغ بخش های داخلی میکروکنترلرهای STM32F1 می رویم و به آموزش نحوۀ به دست آوردن تعداد دور موتور الکتریکی در میکروکنترلرهای STM32F1 با استفاده از مد Input capture می پردازیم.

کپچر در تایمر میکروکنترلرهای STM32 و بطور کلی کنترل موتور با میکروکنترلر، نیازمند قرائت خروجی موتور که از آن مشخصات دینامیکی مثل سرعت و شتاب حاصل می شود و فرمان به موتور که با استفاده از پالس PWM می توان این کار را انجام داد. این کار نیازمند آشنایی با میکروکنترلرهای STM32  و تایمر STM32F103 است.

فیلم آموزش تایمر در STM32                         (فیلم آموزش ARM STM32 مقدماتی)

فیلم آموزش تایمر پیشرفته در STM32

فیلم آموزش تایمر در AVR                             (فیلم آموزش میکروکنترلرهای AVR مقدماتی)

فیلم آموزش تایمر پیشرفته در AVR

فیلم آموزش تایمر در آردوینو                          (فیلم آموزش آردوینو مقدماتی)

فیلم آموزش تایمر پیشرفته در آردوینو

تولید پالس PWM توسط یک موتور الکتریکی (انکودر موتور)

برای راه اندازی کپچر در تایمر میکروکنترلرهای STM32  ابتدا باید بدانیم که پالس PWM که از موتور به ورودی میکروکنترلر اعمال می شود، چطور تولید می شود. هنگامی که از طریقی، سیگنالی به موتور وارد می شود، موتور با فرکانس و Duty Cycle مشخصی شروع به حرکت می کند. به این موتور یک پره متصل است که هنگام چرخش موتور، این پره از جلوی یک Encoder عبور می کند. با عبور این پره از جلوی Encoder، یک پالس تولید می شود که با وصل کردن خروجی این Encoder به یکی از پایه های تایمر میکروکنترلرهای STM32F1 (ترجیحاً به پایه های مربوط به مد کپچر در میکروکنترلر متصل شود.) می توان پالس PWM مورد نیاز برای بررسی را دریافت کرد. در ادامه بررسی می کنیم که با استفاده از این سیگنال PWM تولیدی، چطور می توان تعداد دور موتور الکتریکی را تعیین کرد.

انکودر-موتور

تصویر 1 – انکودر دور موتور

در نوشتۀ «روش کنترل دور موتور DC با PWM و Capture تایمر میکروکنترلر AVR» در قالب یک پروژۀ آموزشی، کپچر را در میکروکنترلرهای AVR راه اندازی کرده ایم که خواندن آن در راستای راه اندازی کپچر در تایمر میکروکنترلرهای STM32 نیز مفید است.

یکی از مراحل کنترل دور موتور DC با میکروکنترلر، قرائت خروجی انکودر متصل به موتور است. در ادامۀ مسیر  راه اندازی کپچر تایمر میکروکنترلرهای STM32، قصد بررسی این موضوع را داریم.

 

بررسی کلی روند کار و استفاده از Input capture در میکروکنترلرهای STM32F1

در این نوشته برای راه اندازی کپچر در تایمر میکروکنترلرهای STM32 از تایمر General Purpose استفاده می کنیم. تایمر با توجه به فرکانس کاری خود که از قبل تعیین شده است، تا مقدار مشخصی به نام Auto reload که توسط ما مشخص می شود، شروع به شمارش می کند. هنگامی که تایمر به مقدار Auto reload مشخص شده می رسد، می تواند کاری که ما از آن انتظار داریم را انجام دهد. به تصویر زیر دقت کنید.رجیستر CNT counter با استفاده از کلاک ورودی خود شروع به شمارش می کند، تاز مانی که به مقدار Auto reload برسد. پس از آن می تواند خروجی ای تولید کند. فرض کنید پالس ورودی میکروکنترلر های STM32F1 که توسط Encoder از چرخش پرۀ موتور حاصل شد، به پایۀ TIMx-CH1 (به عنوان مثال) وصل شده باشد. برای محاسبۀ تعداد دور موتور الکتریکی، بهتر است از Input capture استفاده کنیم. برای استفاده از Input capture، باید از Capture Compare استفاده کنیم. همان طور که در تصویر نیز مشاهده می کنید، هر تایمر دارای 4 تا Capture Compare است. برای استفاده از Input capture باید Capture Compare مورد استفادۀ ما در وضعیت Capture قرار گیرد. پس در این قسمت برای راه اندازی کپچر در تایمر میکروکنترلرهای STM32 باید اولین قدم ما این باشد که TIMx-CH1 به عنوان ورودی Capture Compare در نظر گرفته شود و Capture Compare در وضعیت Capture جهت استفاده از مد Input capture قرار گیرد.

بخش-های-general-purpose-timer-میکروکنترلرهای-stm32

تصویر 2 – نمایش کلی بخش های مختلف General Purpose Timer در میکروکنترلرهای STM32F1

در آموزش تایمر در STM32 و بطور کلی در آموزش تایمر در میکروکنترلرها، استفاده از واحد Timer Counter برای کنترل دور موتور یکی از پرکاربردترین موارد استفاده از واحد تایمر است.

تنظیم Capture Compare در میکروکنترلرهای STM32F1

تا به این قسمت از مبحث کپچر در تایمر میکروکنترلرهای STM32 گفتیم برای استفاده از مد کپچر در تایمر STM32F103 باید یکی از Capture Compareها را انتخاب کرده و در رجیستر مربوط به آن، تغییراتی ایجاد کنیم. این تغییرات به این جهت است که Capture Compare مورد نظر در وضعیت Capture قرار گیرد و همچنین TIMx-CH1 به عنوان ورودی ما تنظیم شود. به این منظور باید به رجیستر مربوطه یعنی TIMx capture-compare mode register  مراجعه کنیم. این رجیستر TIMx-CCMRx نام دارد. از قبل توضیح دادیم که 4 عدد Capture Compare در تایمر STM32F103 داریم که می توانیم از هرکدام از آن ها استفاده کنیم. تصویر 2 نمایش دهندۀ این رجیستر است. اگر به توضیحات زیر آن توجه کنید، خواهید دید که این رجیستر می تواند در دو وضعیت input یا output قرار گیرد. اگر بخواهیم این واحد در حالت Capture قرار گیرد، باید بیت های مربوط به این رجیستر را طوری مقداردهی کنیم که در وضعیت input قرار گیرد. اگر به بخشی که در تصویر 2 با کادر قرمز رنگ مشخص شده است دقت کنید، نوشته شده است که برای تنظیم کردن این رجیستر در حالت input، باید بیت 8 و 9 این رجیستر مقدار دهی شود. اما این که این بیت ها چه مقداری داشته باشند، در توضیحات زیر آن نوشته شده است. به عنوان مثال اگر بخواهیم TIMx-CH1 به عنوان ورودی ما قرار گیرند، باید بیت 8 و 9 را به ترتیب 0 و 1 مقدار دهی کنیم. به این ترتیب این رجیستر هم در وضعیت input قرار می گیرد و هم TIMx-CH1 به عنوان ورودی تنظیم می شود.

رجیستر-timx-ccmrx-input-capture-میکروکنترلرهای-stm32f1

تصویر 3 – رجیستر TIMx-CCMRx جهت تنظیم Input capture در میکروکنترلرهای SM32F1

مرحلۀ بعدی و بسیار مهم در راه اندازی کپچر در تایمر میکروکنترلرهای STM32، محاسبۀ پریود سیگنال است.

محاسبۀ زمان بین دو لبۀ بالاروندۀ سیگنال PWM در میکروکنترلر STM32F1

مبحث محاسبۀ زمان پریود سیگنال مبحثی بسیار مهم بوده و امروزه الگوریتم های بسیاری به این منظور استفاده می شود. برای رسیدن به زمانی هرچه دقیقتر نیازمند سخت افزاری مناسب و کدنویسی اصولی هستیم. در آموزش کپچر در تایمر میکروکنترلرهای STM32 یک راه حل برای شروع این دنیا را بررسی می کنیم. خروجی Encoder که همان ورودی ما در پایۀ TIMx-CH1 بوده که باید توسط میکروکنترلر بررسی شود. این کار باید توسط رجیستر Capture Compare که اکنون در مد کپچر در میکروکنترلر قرار گرفته، انجام شود. زمانی که پالس PWM توسط پایۀ ورودی وارد می شود، در همان زمان تایمر در حال شمارش است. کاری که باید ابتدا انجام شود این است که مدت زمان بین دو لبۀ پالس اندازه گیری شود. برای مثال ما در اینجا برای راه اندازی کپچر در تایمر میکروکنترلرهای STM32 می خواهیم مدت زمان بین دو لبۀ بالاروندۀ PWM را محاسبه کنیم. پس از محاسبۀ این زمان، کافی است از روابط و نسبت هایی برای به دست آوردن سرعت دور موتور استفاده کنیم. پس ما نیاز به محاسبۀ مدت زمانی که طول می کشد تا دو لبۀ بالارونده در سیگنال PWM ورودی اتفاق بیافتد، داریم. زمانی که Capture را روی لبۀ بالارونده تنظیم کنیم، Timer شروع به شمارش می کند. هرگاه یک لبۀ بالارونده در سیگنال PWM ایجاد شود، یعنی روی  سیگنال ورودی یک لبۀ بالارونده ایجاد شده است. در همان لحظه رجیستر شمارنده یعنی CNT counter مقداری که شمرده است را حفظ می کند. در این لحظه می توانیم از میکروکنترلر بخواهیم کاری انجام دهد. برای مثال می توانیم از میکروکنترلر بخواهیم یک وقفه ایجاد کند. در این وقفه از او بخواهیم مقدار شمرده شده توسط رجیستر CNT counter را درون یک متغیر بریزد. به عنوان مثال فرض کنیم یک لبۀ بالارونده بر روی پایۀ ورودی در زمانی که رجیستر CNT counter عدد 1000 را نشان می دهد، ایجاد شده باشد. در وقفۀ تولید شده مقدار 1000 را درون یک متغیر جدید به نام L1 می ریزیم. پس از آن، رجیستر شمارنده یعنی CNT counter به شمارش خود ادامه می دهد تا زمانی که دوباره ورودی به یک لبۀ بالارونده برسد. این یعنی سیگنال ورودی لبۀ بالاروندۀ اول را گذارنده و اکنون به لبۀ بالاروندۀ دوم خود رسیده است. در اینجا دوباره لازم است تا وقفه ای دیگر را فعال کرده و در آن از میکروکنترلر بخواهیم مقدار شمارش شده توسط رجیستر CNT counter را درون متغیر جدید به نام L2 بریزد و سپس آن ها را از یکدیگر کم کند. برای مثال فرض کنیم این بار رجیستر CNT counter مقدار 2000 را نمایش می دهد و این مقدار درون متغیر L2 ذخیره می شود. با کم کردن دو متغیر L1 و L2  از یکدیگر، مقدار 1000 به دست می آید. در راه اندازی کپچر در تایمر میکروکنترلرهای STM32 این عدد بسیار مهمی برای شما خواهد بود، زیرا اکنون می توانید با استفاده از این عدد و عددی CLOCK، زمانی که طول کشیده است تا دوباره لبۀ بالارونده ایجاد شود را اندازه بگیرید و این یعنی محاسبۀ زمان بین دو لبۀ بالاروندۀ سیگنال PWM ورودی.

رجیستر CNT counter دارای یک ورودی است، که این ورودی همان CLOCK ای است که با آن کار می کند. اگر این کلاک 0.001 ثانیه باشد، یعنی هر بار که شمارنده می شمرد و جلو می رود، 0.001 ثانیه زمان می برد. پس اگر این شمارنده عدد 100 را نمایش دهد، 100*0.001 یعنی 0.1 ثانیه گذشته است. پس اگر بین دو لبۀ بالارونده رجیستر CNT counter، 1000 بار شمارش انجام داده باشد، این یعنی برای رخ دادن دولبۀ بالارونده در سیگنال PWM، 1000*0.001 ثانیه برابر با 1 ثانیه زمان نیاز است. پس تا بدین جا برای راه اندازی کپچر در تایمر میکروکنترلرهای STM32 توانستیم محاسبه کنیم که زمان بین دولبۀ بالاروندۀ سیگنال PWM ما، 1 ثانیه است.

جهت ایجاد وقفه نیز می توان از رجیستر TIMx-DIER استفاده کرد و بیت 6 ام آن را یک کرد.

رجیستر-timx-dier

تصویر 4 – رجیستر TIMx-DIER

کپچر در تایمر میکروکنترلرهای STM32 نیازمند فرمول محاسبه دور موتور است. در ادامه به بررسی این فرمول محاسبه دور موتور می پردازیم.

 

فرمول محاسبه دور موتور

اکنون زمان این است که از عدد به دست آمده، یعنی مدت زمان بین دو لبۀ بالارونده استفاده کرده و با استفاده از فرمول محاسبه دور موتور به سرعت موتور برسیم. می خواهیم بدانیم سرعت چرخش موتور چند RPM است. RPM مخفف Route Per Minute به معنای تعداد دوری است که موتور در یک دقیقه می زند. پس لازم است به دست آوریم که موتور در هر 60 ثانیه که معدل همان یک دقیقه است، چند دور می زند. وقتی می گوییم بین دو لبۀ بالاروندۀ سیگنال PWM، یک ثانیه فاصلۀ زمانی است، یعنی یک ثانیه طول می کشد تا موتور دوباره به وضعیتی که قبلا بود برسد. پس نتیجه می گیریم که موتور ما یک ثانیه زمان می برد تا یک دور بزند.

می توان به راحتی محاسبه کرد که در هر 60 ثانیه، موتور ما 60 دور می زند. در نتیجه سرعت چرخش موتور ما، 60 RPM خواهد بود.

می توان تمامی این محاسبات را در همان وقفۀ دوم که ایجاد کرده ایم، انجام دهیم و سپس عدد نهایی که 60 RPM است را بر روی یک LCD نمایش دهیم. همچنین می توان با استفاده از فرمول های مربوطه، Duty Cycle پالس PWM را محاسبه کرده و آن را نیز بر روی LCD نمایش داد. در ادامۀ آموزش کپچر در تایمر میکروکنترلرهای STM32 به محاسبه Duty Cycle می پردازیم.

 

نحوه محاسبه Duty Cycle سیگنال PWM تولیدی موتور

برای محاسبۀ Duty Cycle یک پالس، باید فاصلۀ بین دو لبۀ بالاروندۀ یک پالس PWM را به عنوان زمان کل یک دوره در نظر گرفت و فاصلۀ بین یک لبۀ بالارونده و پایین رونده را به عنوان زمانی که پالس روی وضعیت 1 قرار دارد، در نظر گرفت. نسبت زمانی که پالس در وضعیت 1 یعنی روشن قرار دارد به زمان کل یک دورۀ کلی پالس را Duty Cycle آن پالس می نامند.

محاسبه-duty-cycle-پالس-pwm

تصویر 5 – محاسبۀ Duty Cycle یک پالس PWM

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

 

اهمیت کاربرد کنترل دور موتور چیست؟

حال اهمیت راه اندازی کپچر در تایمر میکروکنترلرهای STM32 را ببینیم. امروزه کنترل دور موتور مبحثی بسیار پرکاربرد و با اهمیت در صنایعی که با موتور سروکار دارند است. این موتور صرفا موتور الکتریکی نیست. موتور خودرو نیز باید سرعت چرخ محاسبه شود که علاوه بر نمایش برای کاربر، واحدهای مختلف در خودرو باتوجه به سرعت موتور عملکردهای مختلفی بر روی موتور یا بخش های دیگر خودرو داشته باشند. بطور مثال واحد ترمز ABS با استفاده از انکودرهای مغناطیسی به پارامترهای دینامیکی خودرو مثل سرعت دست پیدا می کند و علاوه بر اینکه باتوجه این پارامتر سرعت خودرو بر روی عملکرد خودش برای ترمز گرفتن تاثیر دارد، دیتای سرعت را برای واحدهای دیگر بطور مثال یکی از ECU ها مرکزی که با ریموت کنترل در ارتباط بوده ارسال می کند تا در سرعت بالای 8 کیلومتر بر ساعت ریموت کنترل عمل نکند و همچنین برای ECU یا ECU های مربوط به درب خودرو (این ECU معمولا در خودروها با نام DCM یا Door Control Module نامیده می شود) ارسال کرده تا درب ها را قفل کند.

سنسور-سرعت-چرخ-خودرو-abs

تصویر 6 – سنسور سرعت چرخ خودرو برای ABS

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

 

از بررسی کپچر در تایمر میکروکنترلرهای STM32 نتیجه می گیریم:

  1. برای به دست آوردن دور موتور الکتریکی، می توان از مد Input captureدر کپچر در تایمر میکروکنترلرهای STM32استفاده شود. زیرا کپچر یکی از بهترین قابلیتها در میکروکنترلرها و بطور خاص در میکروکنترلرهای STM32F1 جهت محاسبۀ دور موتور الکتریکی است.
  2. جهت استفاده از مد Input capture، باید به رجیستر TIMx-CCMRx مراجعه کرده و بیت های 8 و 9 آن را با توجه به نیاز خود مقداردهی کنید.
  3. برای اینکه بدانید موتور مورد نظر در هر دقیقه چند دور می زند، باید از یک Encoder برای تولید پالس مربوط به موتور استفاده کرد. این پالس در نهایت توسط مد Input captureبررسی می شود.
  4. شمارندۀ CNT counter که در تایمر STM32F103 وجود دارد عدد شمارش شدۀ خود را تا زمان رسیدن به یک لبۀ پالس، به رجیستر Capture Compare که در مد Input capture قرار گرفته است، انتقال می دهد و با فعال کردن یک وقفه می توان آن را درون یک متغیر ریخت و عملیات ریاضی مورد نظر را بر روی آن انجام داد.

 

رضا اسدی

رضا اسدی

مدیر یوبرد، خالق و توسعه دهندۀ پلتفرم یوبرد، مجری پروژه های الکترونیکی، فعال در صنعت آسانسور، سابقه فعالیت در صنعت خودرو و همکاری در صنعت پزشکی و صنایع دیگر، آموزگار آموزش های یوبرد

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

زیرساخت مطمئن صنعت

جدیدترین تاپیک های STM32

میکروکنترلر ARM

میکروکنترلر ARM چیست؟ پردازندۀ ARM

میکروکنترلر ARM ، میکروکنترلرهایی هستند که پردازندۀ آنها ساخت شرکت ARM است. شرکت ARM سازندۀ میکروکنترلر نیست. سازندۀ پردازنده (CPU) است. امروزه به میکروکنترلرهایی که پردازندۀ آنها طراحی شدۀ شرکت ARM باشد، میکروکنترلر ARM گفته می شود.

راه-اندازی-dac-stm32

راه اندازی DAC در STM32

راه اندازی DAC در STM32، ویژگی های DAC در میکروکنترلرهای STM32F1، بلوک دیاگرام DAC در STM32، اتصالات راه اندازی DAC در میکروکنترلر STM32F107VC، نمونه کد رجیستری راه اندازی واحد DAC در میکروکنترلرهای STM32F1، ساخت موج سینوسی با STM32، راه اندازی مبدل دیجیتال به آنالوگ STM32 با توابع HAL

راه-اندازی-usart-stm32

راه اندازی UART در STM32، رجیستری و HAL

راه اندازی UART در STM32، اتصالات و نرم افزار مورد نیاز، نمونه کد USART در STM32 به صورت رجیستری، نمونه کد رجیستری USART با وقفۀ دریافت، نمونه کد HAL برای راه اندازی USART در STM32، نمونه کد HAL با وقفۀ دریافت، نحوه محاسبه Baud rate در USART میکروکنترلرهای STM32F1

برنامه-نویسی-میکروکنترلر-ویژوال-استودیو

برنامه نویسی میکروکنترلرها با ویژوال استودیو

نصب VisualGDB روی ویژوال استودیو، ساخت پروژه برای برنامه نویسی میکروکنترلرها با ویژوال استودیو، ساخت پروژه برای STM32 در ویژوال استودیو، کدنویسی STM32 در ویژوال استودیو، ساخت پروژه برای AVR در ویژوال استودیو، ساخت پروژه برای LPC در ویژوال استودیو، ساخت پروژۀ آردوینو در ویژوال استودیو

2 دیدگاه ها

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

    پاسخ
    • سلام. اتفاقاً آموزش خودروهای الکتریکی در دستور کار ما قرار داره و به امید خدا در آیندۀ نزدیک مطالب آموزشی خودروهای الکتریکی رو قرار میدیم.

      پاسخ

یک دیدگاه بنویسید

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

دیگر آموزش های یوبرد

آموزش TFT LCD با TouchGFX و STM32 یوبرد

گرافیک کاربرپسند با میکروکنترلر ST

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش طراحی PCB و نویز یوبرد

تجسم دنیای الکترونیک

آموزش زبان C و MISRA-C یوبرد

گام نخست دنیای میکروکنترلر

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

آموزش زبان ++C و ++MISRA-C یوبرد

لمس شی گرایی در میکروکنترلرها

آموزش میکروکنترلرهای AVR یوبرد

شاهکار 8 بیتی Atmel

آموزش میکروکنترلرهای LPC یوبرد

یادگار فیلیپس

آموزش های شاخص

دانلود

لطفا برای دریافت لینک دانلود اطلاعات خواسته شده را وارد نمایید
ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است