Nút gỡ


32

Gần đây tôi đã đọc một bài viết về việc gỡ nút và tự hỏi liệu tôi có nên ghi nhớ điều này khi làm việc với, ví dụ, một Arduino (ATMega mC) không? Tôi cho rằng đó là một vấn đề, đặc biệt là khi làm việc với các ngắt.

Vì vậy, tốt hơn là phát hiện thoát trong mã, hoặc điều này nên được quan tâm với phần cứng? Xin hãy giải thích.


Câu trả lời:


17

Tôi đặc biệt khuyên bạn nên nối một phạm vi (hy vọng bạn có một hoặc có thể sử dụng một cái để sử dụng) cho đến công tắc của bạn. Tôi đã thấy một dự án của một sinh viên có độ nảy trên công tắc của họ đã tăng từ 5v xuống -5v lên đến 4v xuống -3v rồi lên đến 2v rồi quay xuống 0v. Khi chúng ta nhìn vào trận hòa hiện tại trên một phạm vi, có một sự tăng đột biến rất lớn.

Trong trường hợp cụ thể của anh ấy, rất cần thiết cho anh ấy để công bố chuyển đổi của mình trong phần cứng.

Tuy nhiên, mặt khác, tôi đã thấy các công tắc có hiệu ứng nhỏ hơn nhiều có thể dễ dàng bị loại bỏ trong phần mềm.

Bạn cần phải cân nhắc các lựa chọn của bạn mặc dù. Nếu bạn có số lượng phần sụn rất phức tạp, việc thêm chi phí cho cả bạn với tư cách là một lập trình viên và việc sử dụng cpu có thể không đáng và bạn sẽ tốt hơn nếu chỉ thêm một chút phần cứng. Mặt khác, nếu bạn đang cố gắng giảm chi phí và kích thước, bạn sẽ muốn loại bỏ càng nhiều phần cứng càng tốt và làm tất cả trong phần sụn nếu bạn có thể.


Tôi đã quét một hình ảnh của công tắc bật lên và đăng nó lên Wikipedia: en.wikipedia.org/wiki/File:Switch_bounce.JPG
Thomas O

@Thomas O đó là một hình ảnh khá vui nhộn của bị trả lại. Tôi chỉ muốn chắc chắn rằng @Vincent Van Den Berghe hiểu rằng không phải tất cả các lần thoát sẽ trông như thế. Độ nảy đó được giới hạn ở 0-5v, nó sẽ không giống như vậy.
Kellenjb

2
@Thomas O, như một lưu ý phụ, chúng tôi đã tạo ra một thực tế về những sinh viên thất bại, những người lấy hình ảnh Oscar như thế. Flash trên màn hình thật kinh khủng. Chúng tôi cũng tiến thêm một bước và thúc đẩy sinh viên thu thập các điểm dữ liệu thực tế, sử dụng một cái gì đó như CSV hoặc labview, để sau đó có thể dễ dàng sử dụng nó trong các báo cáo và phân tích dữ liệu.
Kellenjb

@Kellenjb, tôi sẽ sớm nhận được một máy in cho phạm vi của tôi hỗ trợ HP-IB. Ngoài ra, tôi đã phát hiện ra chế độ "Thể thao" trên máy ảnh của mình có thể chụp ảnh tốt màn hình phạm vi mà không cần đèn flash và không bị nhòe.
Thomas O

1
@Lundin Trong môi trường thời gian thực, bạn phụ thuộc vào việc gián đoạn rất nhiều. Nếu bạn nhấn nút, bạn không thực sự muốn hệ thống thời gian thực của mình bị gián đoạn nhiều lần chỉ bằng một lần nhấn nút. Bạn cũng không muốn phải dành tài nguyên để chờ trong 10 ms.
Kellenjb

15

Nếu bạn là một nhà thiết kế điện tử chuyên nghiệp thì rất có thể ông chủ của bạn thậm chí sẽ không cho phép bạn làm điều đó trong phần cứng. Lý do rất đơn giản: nếu lô sản xuất của bạn đủ lớn thì phần mềm hầu như miễn phí , trong khi phần cứng phải được trả cho mỗi đơn vị bạn sản xuất. Và trong khi điện trở và tụ điện rất rẻ, việc gắn chúng lên PCB có thể tốn gấp 20 lần giá mua.

Cho dù bạn gỡ lỗi trong phần mềm hay phần cứng, bạn vẫn phải chọn các nút bấm chất lượng. Nút 157ms khét tiếng từ bài viết chỉ đơn giản là không phù hợp với bất kỳ ứng dụng nào .
Tôi thường lấy mẫu nút ở các khoảng thời gian 32ms , đủ để thu hẹp thời gian gỡ lỗi của bất kỳ nút tốt nào. Tôi khá hâm mộ các thiết bị chuyển mạch Alps SKQG TACT.

Công tắc chiến thuật Alps

Trên một vài thiết bị tôi đã thử nghiệm, nó có thời gian thoát ban đầu dưới 10ns. Mặc dù nó có tuổi thọ hoạt động là 100 000 chu kỳ, chúng tôi đã thử nghiệm nó cho 200 000 chu kỳ và thậm chí sau đó, việc gỡ lỗi 32ms là đủ. (Tôi đoán rằng tôi nên đã đo mức độ gỡ lỗi thực tế, nhưng mối quan tâm chính của chúng tôi tại thời điểm đó là hành vi của sản phẩm cuối cùng.

Nếu bạn thực sự muốn một giải pháp phần cứng, tôi thứ hai giải pháp flip-flop được đề cập trong bài viết là giải pháp tốt nhất về mặt kỹ thuật:

mạch gỡ

Ví dụ, flip-flop có thể được xây dựng với một cổng NAND kép , có sẵn trong một gói VSSOP8 nhỏ. Hạn chế chính của giải pháp này là bạn cần một nút bấm SPDT, trong đó SPST thường có sẵn hơn nhiều.


12

Có rất nhiều (và rất nhiều) cách khác nhau để gỡ nút. Cho dù bạn làm điều đó trong phần mềm hay phần cứng sẽ phụ thuộc vào yêu cầu dự án và loại chuyển đổi của bạn.

Dưới đây là một số liên kết đến các phương pháp khác nhau:

http://www.ganssle.com/debouncing.htmlm

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/


Tôi sẽ đi lấy một liên kết đến ganssle khi tôi thấy câu hỏi.
Kortuk

Bài viết ganssle là lý do tôi hỏi câu hỏi này, nó được liên kết trong câu hỏi của tôi :) Cảm ơn vì liên kết đến đoạn mã gỡ lỗi.
Vincent Van Den Berghe

Bạn có phiền khi tóm tắt một vài trường hợp sử dụng để minh họa khi nào nên sử dụng phần mềm / phần cứng không? (điều này có thể là chủ quan, nhưng dù sao tôi cũng muốn một số ví dụ)
Vincent Van Den Berghe

1
@Vincent, Kellenjb đã tóm tắt câu trả lời của mình về cách quyết định. Tôi đã không nhấp vào liên kết của bạn bởi vì nó có một cái tên ngộ nghĩnh, bây giờ khi tôi nhấp vào nó, tôi thấy ganssle!
Kortuk

Nếu đó là sự đồng thuận / quy tắc chung thì thực sự, không cần thêm ví dụ.
Vincent Van Den Berghe

6

Bài báo đó là "kinh thánh" về tranh luận. Liên hệ bị trả lại có thể là một vấn đề với bất kỳ ứng dụng.

Nói chung, tốt nhất là gỡ lỗi các công tắc trong phần mềm vì điều chỉnh độ trễ cho các công tắc cụ thể dễ dàng hơn, vì chúng khác nhau về số lần nảy tiếp xúc. Việc phát hành bản phát hành chính cũng thường là cần thiết. Các nhà sản xuất thiết bị chuyển mạch thường chỉ định mức độ nảy cho sản phẩm của họ, thường là khoảng 10ms - 20ms.


Tại sao mọi người bỏ phiếu này xuống?
Toby Jaffey

Điểm tốt về phát hành khóa phát hành!
Vincent Van Den Berghe

1
Tôi đã không đánh giá thấp nó, nhưng chỉ nói để làm điều đó trong phần mềm là một ý tưởng tồi tệ. Đó là một ý tưởng tốt để đặc trưng.
Kortuk

Tôi nói "nói chung", đó là trường hợp, và đưa ra lý do. Nó cũng giảm thiểu chi phí BOM và tăng độ tin cậy.
Leon Heller

nó chỉ tăng độ tin cậy nếu tín hiệu nằm trong giới hạn an toàn của bộ điều khiển của bạn. Hành động này sẽ tăng độ tin cậy nếu bạn giảm số lượng thành phần mà không làm tăng hao mòn linh kiện. Tôi không nói rằng tôi không đồng ý với khái niệm bài viết của bạn, nhưng tôi liên tục làm việc với các kỹ sư chỉ cần tham gia vào lĩnh vực này và một câu trả lời như thế này và họ sẽ công bố mọi thứ trong phần mềm. Bạn luôn phải đặc trưng. Tôi cũng không đánh giá thấp bạn, nhưng tôi cũng không đánh giá cao, tôi nghĩ rằng một câu trả lời rộng như phần mềm có nguy cơ các nhà phát triển mới hơn mạo hiểm phần cứng của họ.
Kortuk

1

Chuyển đổi có thể tiếp tục trong hàng chục mili giây. Nếu bạn đang bỏ phiếu chuyển đổi từ một thói quen ngắt chạy trên bộ đếm thời gian, thì việc thoát sẽ không thành vấn đề, bởi vì ngay cả khi bạn tình cờ thăm dò công tắc ở giữa cơn bão nảy, bạn sẽ có trạng thái mới ngay lập tức hoặc tệ nhất là lấy trạng thái cũ và không thấy trạng thái mới cho đến khi cuộc thăm dò dựa trên bộ đếm thời gian tiếp theo. Thăm dò ý kiến ​​từ một ISR được định thời gian như thế này tạo thành một hình thức gỡ lỗi phần mềm.

Tuy nhiên, nếu bạn đang sử dụng công tắc đó để gây gián đoạn và bạn mong rằng thói quen dịch vụ ngắt đó sẽ chạy nhanh, trong vòng chưa đến 10 mili giây, bạn sẽ cần gỡ lỗi phần cứng, nếu không, một sự kiện chuyển đổi có thể dẫn đến một số lượng ngẫu nhiên gián đoạn, và chắc chắn thường nhiều hơn chỉ là dự kiến. Mặt khác, nếu thói quen ngắt chạy đủ lâu, độ nảy của công tắc sẽ ổn định trước khi ISR ​​kết thúc và bạn sẽ ổn, nhưng hầu hết các ISR được xây dựng tốt sẽ không mất nhiều thời gian như vậy.


Có công tắc để gây ra sự gián đoạn là một ý tưởng tốt. Nhưng một khi bạn đã nhận được nó, đừng cho phép các ngắt thêm - tắt chúng đi và thay vào đó hãy bắt đầu hẹn giờ cho thời gian gỡ lỗi được chỉ định.
Lundin

@Lundin - nếu bộ định thời có sẵn, bạn chỉ có thể sử dụng bộ hẹn giờ để thực hiện phương pháp thăm dò ý kiến ​​và không bận tâm đến việc chuyển đổi tạo ra các ngắt.
JustJeff

0

Cách tốt nhất để làm bất cứ điều gì là cách phù hợp với bạn nhất. Nhưng khi bạn đã có một vi điều khiển, bạn có thể gỡ lỗi trong phần mềm chỉ với chi phí cho một số nỗ lực mã.

Cách tinh vi nhất để gỡ lỗi trong phần mềm là kiểm tra các nút tại các thời điểm cách xa nhau hơn thời gian thoát dài nhất. 50 ms dường như là giới hạn trên của thời gian bật của các công tắc 'bình thường', vì vậy khi bạn có thể sắp xếp phần mềm của mình như thế này, bạn sẽ thấy rõ:

forever loop
   wait (at least) 50 ms
   check buttons
   do procesing
end loop

Và sử dụng bộ định thời trên chip trên MCU của bạn cho việc này.
Lundin

Điều đó là tất nhiên có thể, nhưng bạn có thể viết rất nhiều chương trình mà không cần.
Wouter van Ooijen

3
Phần mềm chuyên nghiệp trong các sản phẩm chất lượng sẽ luôn sử dụng bộ định thời trên chip. Người chơi có thể thoát khỏi một số "NOP" cho vòng lặp hoặc bỏ phiếu chờ chết. Nhưng không có lý do gì để làm điều này trong các sản phẩm thực tế, bất kể yêu cầu thời gian thực của bạn. "Tôi không biết bộ đếm thời gian hoạt động như thế nào và vòng lặp chết này mất 10 giây để bản thân lười biếng viết" không phải là một lập luận hợp lệ cho một kỹ sư.
Lundin

Bullocks. Chuyên gia phải có hiệu quả, điều này (tùy thuộc vào dự án trong tay) có thể có nghĩa (trong số những thứ khác) 'sử dụng phần cứng hiệu quả nhất có thể' hoặc 'sử dụng thời gian của chuyên gia một cách hiệu quả nhất có thể'. Vì vậy, comming của bạn chắc chắn áp dụng trong một số trường hợp (có thể là tất cả các trường hợp bạn đã xử lý) nó chắc chắn không áp dụng trong mọi trường hợp.
Wouter van Ooijen

Để thực hiện bộ đếm thời gian trên chip mất tối đa một giờ thời gian của bạn. Đây không phải là một cái gì đó phức tạp, nó là kỹ thuật bánh mì & bơ hàng ngày. Bạn thậm chí không thể đầu tư một giờ vào dự án của mình để có được giải pháp tốt hơn đáng kể và chất lượng tổng thể tốt hơn? Vâng, nếu bạn không biết nhiều về lập trình, có thể bạn sẽ mất một tuần. Nhưng sau đó, có lẽ bạn không nên làm việc với phần mềm ngay từ đầu ... hoặc có lẽ bạn nên làm việc nhiều hơn với nó, vì vậy bạn sẽ học cách thực hiện điều nhỏ bé đơn giản này ngay lập tức.
Lundin

0

Một cách tiếp cận để thảo luận mà chưa được đề cập là sử dụng một công tắc ném hai lần với một cú ném gắn với VDD và cái kia chạm đất. Đưa nó vào một pin mà (thông qua phần mềm hoặc phần cứng) sẽ bị kéo yếu về trạng thái hiện tại. Cách tiếp cận như vậy sẽ cung cấp những lợi thế của công tắc hai lần, nhưng sẽ chỉ yêu cầu một chân I / O chứ không phải hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.