سلام
در اکثر مدارات الکترونیکی وجود پوش باتن( تکتیل سوییچ/tactile switch صحیح تره) یا همان کلید شاسی ضروری هسش .
شما برای حذف دیبانس کلید چه کار هایی انجام میدید؟ مدارات و کدهای خودتون رو لطفا به اشتراک بذارید.
راه حل اول: سخت افزاری:استفاده از اشیمت تریگر - ایسی هایی مثل bs و…
راه حل دوم : استفاده از فیلتر RC یا من خودم فیلترpi میذارم وترکیب میکنم با روش های دیگه…
راه حل سوم : استفاده از حلقه while در دستورات که معمولا تو فیلم های اموزشی یاد میدن.
راه حل چهارم: استفاده از تاخیر delay_ کد مسموم
راه حل پنجم : استفاده از متغیر کمکی که اخرین وضعیت کلید رو نگهداری میکنه که در ادامه کدشو میذارم.
راه حل ششم: استفاده از تایمر -بنظر من بهترین روش که برخی میکروکنترلرها فیلتری هم دارند که بین 0 تا 15 قابل تنظیمه.
راه حل هفتم: استفاده از adc
از دوستان خوبم میخوام که اونم کارخودشونو اینجا قرار بدن
@Mohammad_Poorkhalili
@zeus
بسته یه سخت افزار متفاوته.
برای مداراتی که میکرو کنترلر دارن اگر خیلی حساس باشه: (مثل بردهای آموزشی و یا برد های تست قبل از تولید)
سخت افزاری RC میزارم
و بقیش رو با برنامه نویسی حل میکنم.
البته به نوع عملکردیی که ار کلید انتظار داریم ممکنه برنامه تغییر کنه: مثلا
- میخوایم به محض فشردن کلید عمل کنه و تا فشار دادن مجدد عملی انجام نده
- میخوایم به محض فشردن کلید عملی انجام بشه و تا زماین که کلید رو نگه داشته بطور متناوب یه عملی تکرار بشه
- میخوایم به محض فشردن کلید عملی انجام بشه اما تا زمانی که کلید رو رها نکرده برنامه ادامه پیدا نکته
- و … هر کدوم برنامه متفاوت و دقت متفاوتی رو نیاز داره.
گاهی کلید توی محیط پر نویزی هست:
کلید رو به اینتراپت میدم و هر وقت وقفه عمل کرد یه تاخیر حدود 50 میلی ثانیه میدم و بعد وضعیت کلید رو توی یک حلقه به مدت لازم مثلا 50 میلی ثانیه دائم میخونمش و اگر نتیجه خوندن در اون حلقه برای تعداد محدودی متغیر بود (خوندن برابر رها بودن کلید بود) نویز یا دبانس فرض میکنم و رهاش میکنم.
وضعیت کلید که در حالت high یا low برابر صفر یا یک باشه با توجه به نوع نویز تصمیم گرفته میشه.
معمولا با روش آخر توی تولید انبوه دیگه نیازی به سخت افزار RC برای کلید هایی که به پایه های GPIO وصل هستن نیست اما برای پایه های غیر قابل کنترل سخت افزار حتما لحاظ میشه.
درود فراوان.
در مورد راه حل اول: ترجیح من عمدتا استفاده حداقلی از سخت افزار اضافی هست. البته متناسب با میزان اهمیت طراحی که @mahdiRahi هم بهش اشاره کردن.
در مورد راه حل سوم : یه polling تمام عیار توی کد محسوب میشه
در مورد راه حل پنجم: من عمدتا این روش رو استفاده کردم، به همراه خواندن تایمر tick خود میکرو که زمان debunce رو هم بتونیم متناسب با application به صورت نرم افزاری تغییر بدیم.
تمیز ترین sample code که پیدا کردم از سایت Arduino بود.
در رابطه با استفاده از ADC واسه Debunce تا حالا چیزی نشنیده بودم.
مرسی که مطرح کردید.