در کارخانه ها معمولا از کانتر یا شمارنده برای شمارش پالس های سنسورهای نوری یا proximity یا میکروسوئیچ ها استفاده میکنند. با تایمر های STM32 هم میتونید کانتر پالس بسازید که از گرونترین کانتری که از لاله زار میخرید هم قدرتمند تره و امکانات زیادی رو بصورت سخت افزاری ( یعنی بدون نیاز به اجرای کد در اختیار شما میذاره).
پالس چیست؟
وقتی جسمی مقابل سنسورهای proximity یا نوری قرار بگیره، یا میکروسوئیچ رو فشار بده، یا وقتی یک کلید فشاری رو فشار بدید ، خروجی یک میشه، وقتی جسم عبور کنه یا فشار برداشته بشه، دوباره خروجی صفر میشه و اینجوری یک پالس تولید میشه. یکی از مهمترین وظایف ما شمارش این پالس هاست.
فرض کنید هدف ما این هست:
- تعداد پالس ها رو بشماریم ، تعداد از 0 تا 2 بره و دوباره ریست بشه.
- اگر تعداد پالس ها از 1 به 2 تغییر کرد ، یک led روشن بشه.
- اگر تعداد پالس ها از 2 به 3 تغییر کرد ، led خاموش بشه.
روش نرم افزاری شمارش پالس با اینتراپت در STM32
روش نرم افزاری یعنی کد وجود داره و CPU برای اجرای عملیات باید کدی رو اجرا کنه. در روش نرم افزاری خروجی سنسور proximity یا نوری با یک اپتوکوپلر به پایه ی میکروکنترلر وصل میشه که در حالت اینتراپت خارجی ( مثلا در لبه ی بالا رونده) تنظیم شده. اینطوری هر بار لبه ی بالارونده روی پین وجود داشته باشه، اینتراپت اتفاق می افته و تابع callback فراخوانی میشه.
یک متغیر global هم برای شمارش پالس ها تعریف میشه و در تابع callback اینتراپت خارجی هر دفعه یکی به این متغیر global اضافه میشه و مقدارش هم با 2 و صفر مقایسه میشه و وضعیت led تغییر میکنه.
قابلیت external clock mode2 در تایمر میکروکنترلر STM32
هر تایمر STM32 یک رجیستر کانتر یا CNT داره که با هر لبه ی بالارونده کلاک CNT مقدارش یکی زیاد میشه، بعد از رسیدن مقدار رجیستر CNT به مقدار رجیستر ARR ، رجیستر CNT صفر میشه و دوباره بالارونده میشماره.
در کاربرد های دیگه معمولا کلاک CNT از کلاک داخلی میکروکنترلر تامین میشه. با قابلیت external clock mode2 میشه کلاک CNT رو از پین ETR تامین کرد. اینطوری رجیستر CNT با هر لبه ی بالارونده ( یا پایین رونده ) روی پین ETR یکی زیاد میشه.
روش سخت افزاری شمارش پالس با قابلیت external clock mode2
روش نرم افزاری یعنی کد وجود داره و CPU برای اجرای عملیات باید کدی رو اجرا کنه. در روش نرم افزاری خروجی سنسور proximity یا نوری با یک اپتوکوپلر به پایه ی میکروکنترلر وصل میشه که در حالت اینتراپت خارجی ( مثلا در لبه ی بالا رونده) تنظیم شده. اینطوری هر بار لبه ی بالارونده روی پین وجود داشته باشه، اینتراپت اتفاق می افته و تابع callback فراخوانی میشه.
یک متغیر global هم برای شمارش پالس ها تعریف میشه و در تابع callback اینتراپت خارجی هر دفعه یکی به این متغیر global اضافه میشه و مقدارش هم با 2 و صفر مقایسه میشه و وضعیت led تغییر میکنه.
مقایسه تعداد پالس ها با کانال های خروجی تایمر STM32
هر کانال تایمر یک رجیستر CCR داره که مقدارش با مقدار رجیستر CNT مقایسه میشه. اگر مقدارشون برابر باشه میشه اینتراپت تولید کرد. یا با توجه به نتیجه ی مقایسه در حالت های PWM1 یا PWM2 ، وضعیت پین خروجی کانال تایمر رو مشخص کرد. در این مثال مقدار رجیستر CNT با هر پالس یکی زیاد میشه.