روش های دیبانس گیری کلید+کد

سلام
در اکثر مدارات الکترونیکی وجود پوش باتن( تکتیل سوییچ/tactile switch صحیح تره) یا همان کلید شاسی ضروری هسش .
شما برای حذف دیبانس کلید چه کار هایی انجام میدید؟ مدارات و کدهای خودتون رو لطفا به اشتراک بذارید.

1 پسندیده

راه حل اول: سخت افزاری:استفاده از اشیمت تریگر - ایسی هایی مثل bs و… :cupid:
راه حل دوم : استفاده از فیلتر RC یا من خودم فیلترpi میذارم وترکیب میکنم با روش های دیگه… :sunglasses:
راه حل سوم : استفاده از حلقه while در دستورات که معمولا تو فیلم های اموزشی یاد میدن. :crazy_face:
راه حل چهارم: استفاده از تاخیر delay_ کد مسموم :cold_face:
راه حل پنجم : استفاده از متغیر کمکی که اخرین وضعیت کلید رو نگهداری میکنه که در ادامه کدشو میذارم. :nerd_face:
راه حل ششم: استفاده از تایمر -بنظر من بهترین روش که برخی میکروکنترلرها فیلتری هم دارند که بین 0 تا 15 قابل تنظیمه. :smirk:
راه حل هفتم: استفاده از adc :face_holding_back_tears:
از دوستان خوبم میخوام که اونم کارخودشونو اینجا قرار بدن :heart_eyes:
@Mohammad_Poorkhalili
@zeus

2 پسندیده

بسته یه سخت افزار متفاوته.
برای مداراتی که میکرو کنترلر دارن اگر خیلی حساس باشه: (مثل بردهای آموزشی و یا برد های تست قبل از تولید)
سخت افزاری RC میزارم
و بقیش رو با برنامه نویسی حل میکنم.

البته به نوع عملکردیی که ار کلید انتظار داریم ممکنه برنامه تغییر کنه: مثلا

  • میخوایم به محض فشردن کلید عمل کنه و تا فشار دادن مجدد عملی انجام نده
  • میخوایم به محض فشردن کلید عملی انجام بشه و تا زماین که کلید رو نگه داشته بطور متناوب یه عملی تکرار بشه
  • میخوایم به محض فشردن کلید عملی انجام بشه اما تا زمانی که کلید رو رها نکرده برنامه ادامه پیدا نکته
  • و … هر کدوم برنامه متفاوت و دقت متفاوتی رو نیاز داره.

گاهی کلید توی محیط پر نویزی هست:
کلید رو به اینتراپت میدم و هر وقت وقفه عمل کرد یه تاخیر حدود 50 میلی ثانیه میدم و بعد وضعیت کلید رو توی یک حلقه به مدت لازم مثلا 50 میلی ثانیه دائم میخونمش و اگر نتیجه خوندن در اون حلقه برای تعداد محدودی متغیر بود (خوندن برابر رها بودن کلید بود) نویز یا دبانس فرض میکنم و رهاش میکنم.
وضعیت کلید که در حالت high یا low برابر صفر یا یک باشه با توجه به نوع نویز تصمیم گرفته میشه.

معمولا با روش آخر توی تولید انبوه دیگه نیازی به سخت افزار RC برای کلید هایی که به پایه های GPIO وصل هستن نیست اما برای پایه های غیر قابل کنترل سخت افزار حتما لحاظ میشه.

3 پسندیده

درود فراوان.
در مورد راه حل اول: ترجیح من عمدتا استفاده حداقلی از سخت افزار اضافی هست. البته متناسب با میزان اهمیت طراحی که @mahdiRahi هم بهش اشاره کردن.

در مورد راه حل سوم : یه polling تمام عیار توی کد محسوب میشه :slight_smile:

در مورد راه حل پنجم: من عمدتا این روش رو استفاده کردم، به همراه خواندن تایمر tick خود میکرو که زمان debunce رو هم بتونیم متناسب با application به صورت نرم افزاری تغییر بدیم.
تمیز ترین sample code که پیدا کردم از سایت Arduino بود.

در رابطه با استفاده از ADC واسه Debunce تا حالا چیزی نشنیده بودم.
مرسی که مطرح کردید.

4 پسندیده

سلام برحسب تجربه بهترین روش برای دیبانس کلید علاوه بر فیلتر سخت افزاری که حتما باید باشه استفاده از یک تایمر می باشد. در میکرو های arm که تایمر systick وجود دارد از آن استفاده میکینیم به این شکل :
اگه فرض کنیم پوش باتن پول آپ باشد در نتیجه حالت درحالت اکتیو صفر می باشد
نمونه کد همراه با event های pressed , hold , released :


همچنین یک ویدیو مفصل درباره پوش باتن در آپارات قرار دادم که اگر علاقه مند بودید می توانید مشاهده کنید.
https://www.aparat.com/v/3f2XQ

1 پسندیده