วิธีตรวจจับปุ่มอย่างชาญฉลาด (ใช้พลังงานน้อยลง)


28

ในระหว่างการประชุมสำหรับโครงการเฉพาะฉันถูกขอให้คิดเกี่ยวกับวิธีการตรวจจับการกดปุ่มด้วย MCU การตรวจจับควรใช้พลังงานน้อยที่สุด เมื่อแรกเห็นฉันคิดว่าวงจรทั่วไปมีการดึงขึ้นหรือเลื่อนลง:

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab

ฉันไม่ได้พิจารณาคุณสมบัติการต่อต้านการตีกลับที่นี่เนื่องจากอยู่นอกเหนือขอบเขตของคำถามนี้ ในกรณีใดกรณีหนึ่งเมื่อกดปุ่มค่าปัจจุบันทั้งหมดที่ไหลขึ้นอยู่กับค่าตัวต้านทาน เพื่อลดให้น้อยที่สุด (กระแส) ฉันสามารถเพิ่มค่าตัวต้านทาน แต่ไม่มากนักเนื่องจากถ้าฉันถูกมันก็ขึ้นอยู่กับค่าการรั่วไหลของขาอินพุต นอกจากนี้ตัวต้านทานขนาดใหญ่จะฟื้นตัวช้า

คำถามของฉันคือคำถามต่อไปนี้: วิธีตรวจสอบปุ่มที่กดอย่างชาญฉลาดซึ่งไม่ใช้พลังงาน (โดยทั่วไปจะเป็นแอปพลิเคชันที่ใช้พลังงานสูง) มีวิธีการใดที่ใช้พลังงานน้อยมากเมื่อกดปุ่ม?


5
pull-down 10k กินไฟเกือบหมด 3.3V ให้ 330uA และใน MCUs ที่ทันสมัยส่วนใหญ่คุณมีตัวเลือกในการตั้งค่าหนึ่งภายในซึ่งจะมีความต้านทานที่สูงขึ้น ดังที่ได้กล่าวไว้คุณสามารถเปิดใช้งานการจัดหาปุ่มจากพิน MCU ผ่าน BJT หรือ MOSFET เปิดใช้งานเฉพาะในระหว่างการอ่านและอ่านด้วยการหยั่งสัญญาณ
Lundin

27
μ

6
จริง ๆ แล้วไมโครคอนโทรลเลอร์หลายตัวสามารถรับกระแสการนอนหลับได้ต่ำถึง 2-10 μA การสูญเสีย 30x ที่การดึงลงครั้งเดียวเป็นเรื่องที่น่าเศร้าโดยเฉพาะอย่างยิ่งในสถานการณ์ที่ใช้พลังงานจากแบตเตอรี่
whatsisname

1
ตัวต้านทานที่คุณสามารถใช้ในการดึงลงจะขึ้นอยู่กับอิมพิแดนซ์ของพินและแรงดันที่เปลี่ยน สมมติว่าคุณมีพิน 3.3v ในสถานะอิมพีแดนซ์สูงที่เปลี่ยนที่ 2.4 โวลต์สิ่งที่คุณต้องการจริงๆคืออิมพีแดนซ์ต่ำกว่าอินพุท ฉันอยากจะแนะนำให้คุณแนบโพเทนชิออมิเตอร์และวัดความต้านทานของพินที่คุณสามารถใช้กับพินเพื่อให้ทำงานได้อย่างน่าเชื่อถือจากนั้นจึงลดค่าลง 20% เพื่อรักษาระยะห่าง
Drunken Code Monkey

คำตอบ:


29

วิธีการที่กระแสต่ำที่ฉันใช้ครั้งเดียวคือการเชื่อมต่อสวิตช์ระหว่างสองขาของ I / O ไมโครคอนโทรลเลอร์

I / O หนึ่งตัวถูกกำหนดค่าเป็นเอาท์พุท (SWO) วินาทีถูกกำหนดค่าเป็นอินพุต (SWI) โดยเปิดใช้การดึงขึ้นภายในที่ตั้งโปรแกรมได้

สถานะสวิตช์ถูกสุ่มตัวอย่างไม่บ่อยนัก (ทุกๆ 10 ms) โดยชุดคำสั่งอินเทอร์รัปต์ของซอฟต์แวร์ ลำดับการอ่านคือ: ขับ SWO ต่ำ, อ่าน SWI, ขับ SWO สูง

นั่นหมายความว่าสวิตช์แบบกดจะดึงกระแสเลื่อนลง SWI ผ่านตัวมันเองและ SWO น้อยกว่า 1 เราในระหว่างการสแกนในขณะที่สวิตช์ที่ไม่ได้กดก็ไม่ดึงกระแส การวาดในปัจจุบันสำหรับ <1 เราทุก ๆ 10 มิลลิวินาทีส่งผลให้สิ้นเปลืองค่าเฉลี่ยโดยเฉลี่ยเล็กน้อย


เป็นคำถามที่น่าสงสัยว่าทำไมคุณต้องใช้การดึงขึ้นโดยใช้เทคนิคนี้ ลำดับ SWO ต่ำ, อ่าน SWI, SWO สูง, SWI อ่านอาจเพียงพอที่จะบอกได้ว่าหมุดเชื่อมต่อกันหรือไม่ นอกจากนี้คุณยังสามารถแบ่งปัน SWO ระหว่างสวิตช์จำนวนมาก
Trevor_G

8
@ เทรเวอร์ปล่อยให้อินพุตลอยเมื่อสวิตช์เปิดอยู่ไม่ใช่ความคิดที่ดีโดยเฉพาะ ขึ้นอยู่กับเทคโนโลยีสามารถทำให้บัฟเฟอร์อินพุตใช้พลังงานหากอินพุตอยู่ในระดับกลาง
RoyC

1
@Trevor เพิ่มตัวต้านทาน pullup อย่างมีประสิทธิภาพโดยวัฏจักรหน้าที่ sw1 sw2 ยังเป็นแรงผลักดันให้เรากลับไปที่โครงร่างของ OP 1 มันอาจทำงานในสภาพแวดล้อมที่มีเสียงรบกวนต่ำ
RoyC

2
ความจริงที่ว่า MCU ต้องตื่นตัวเพื่อทำโพลแทนที่จะพึ่งพาการขัดจังหวะโดยสิ้นเชิงยกเลิกการบันทึกใด ๆ จากรอบหน้าที่สั้นลงหรือไม่?
AndreKR

5
สวัสดี @AndreKR เรามีแอปพลิเคชั่นไมโครคอนโทรลเลอร์ที่ใช้พลังงานจากแบตเตอรี่และมันต้องการสวิตช์หลายตัวที่เชื่อมต่อกันดังนั้นเราจึงใช้เทคนิคนี้เพราะมันค่อนข้างง่าย เราไม่ได้ใส่ MCU ลงไปเพื่อตรวจจับสวิตช์ MCU ดึงบางอย่างเช่น 900nA ในโหมดสลีประหว่างอินเทอร์รัปต์ 10ms ดังนั้นการประหยัดการดึงขึ้นจะคุ้ม
TonyM

23

SPDT ( Sแหล่งไฟP OLE D ouble T hrow) ปุ่มจะเป็นปุ่มที่มีประสิทธิภาพของคุณเป็นพิเศษ

ป้อนคำอธิบายรูปภาพที่นี่

ที่มา: http://www.ni.com/white-paper/3960/th/

ในกรณีของคุณ 1P จะไปที่ MCU, 1T ถึง VCC, 2T ถึง GND


+1 .. มันมีข้อผิดพลาดอยู่เสมอว่า SPDT ของ subminiature นั้นหายากมากหรือเสียค่าใช้จ่ายมากเกินไป ...
Trevor_G

1
@ เทรเวอร์ใช่ ... บางสิ่งมีราคาแพงเกินไปอย่างน่าเศร้า ในขณะที่รายการอื่น ๆ underpriced (MCU เป็นตัวอย่าง) คุณมีทั้งหมดไม่ได้
Harry Svensson

นี่เป็นความคิดที่ดี น่าเศร้าที่ฉันไม่สามารถหาปุ่ม SPDT CMS ที่ตรงกับความต้องการของฉัน ฉันจะจำวงจรนี้ไว้
vionyst

10

ปุ่มจะถูกกดนานเท่าไหร่? ถ้ามันไม่ใช่สวิตช์สลับ (ซึ่งรักษาสถานะไว้) แต่เป็นการสลับชั่วขณะกระแสที่ไหลเมื่อปุ่มถูกกดส่วนใหญ่จะไม่เกี่ยวข้องเนื่องจากช่วงเวลาสั้น ๆ ที่ปุ่มถูกปิดจริง

ทั้งสองวงจรที่คุณแสดงนั้นโอเคไม่สำคัญ

คุณสามารถสรุปได้ว่าการรั่วไหลของการป้อนข้อมูลและ / หรือในปัจจุบันการป้อนข้อมูล MCU เป็นเล็กน้อย MCUs ทั้งหมดอยู่ในเทคโนโลยี CMOS ในปัจจุบันและมีกระแสอินพุตไม่เป็นศูนย์ ดังนั้นหยุดพิจารณามันไม่ได้มี

แทนที่จะใช้ตัวต้านทานภายนอกคุณสามารถใช้ตัวต้านทานแบบดึงขึ้นภายในในอินพุตของ MCU หลายตัวได้ ตัวต้านทานนี้อาจมีค่าค่อนข้างต่ำ (อาจจะ 50 kohm) ดังนั้นกระแสขนาดเล็กจะไหลเมื่อกดปุ่ม

คุณสามารถใช้ตัวต้านทาน Mohm 1 ตัวได้อย่างปลอดภัยสำหรับการดึง / ดึงลง เฉพาะในสภาพแวดล้อม "สกปรก" (พูดด้วยไฟฟ้า) เท่านั้นคุณอาจต้องใช้ค่าที่ต่ำกว่า คุณยังสามารถวางตัวเก็บประจุ 100 nF ควบคู่กับสวิตช์เพื่อหยุดการรบกวนจากวงจรอื่น ๆ ในบริเวณใกล้เคียง

เคล็ดลับสำหรับมืออาชีพ: สงวนสถานที่ไว้สำหรับตัวเก็บประจุบน PCB แต่อย่าติดตั้งฝาปิด ยัง ในกรณีที่เกิดปัญหา: วางไว้และดูว่าจะช่วยได้

ในการตรวจสอบสถานะของสวิทช์ที่ใช้ทั้งการลงคะแนนเลือกตั้ง (ในขณะที่คำตอบของ TonyM) หรือใช้การขัดจังหวะ ขึ้นอยู่กับแอพพลิเคชั่นที่ดีกว่าสำหรับการใช้พลังงาน (ของ MCU)


จริง ๆ แล้วปุ่มจะเป็นชั่วขณะหนึ่ง แต่เวลาที่มันจะถูกกดอาจนานพอ (นาที)
vionyst

หากอุปกรณ์อยู่ใน 24/7 ตลอดเวลาไม่กี่นาทีก็อาจไม่มาก สิ่งสำคัญคือรอบการทำงาน 5 นาทีต่อชั่วโมงคือ 5 x 60/3600 = 8.3% ดังนั้นแม้ที่กระแส 100 uA สวิทช์จะกิน 8.3 uA โดยเฉลี่ยในสถานการณ์ของฉัน ข้อความของฉันคือ: อย่าโฟกัสมากเกินไปกับสวิตช์ที่ใช้เมื่อกดโดยไม่เปรียบเทียบกับปริมาณการใช้ปัจจุบันของระบบทั้งหมด เฉพาะเมื่อมีส่วนร่วมเหมือนกันดังนั้นจึงเหมาะสมที่จะปรับปรุงปริมาณการใช้ปัจจุบันของสวิตช์ ไม่มีประโยชน์ในการใช้สวิตช์ 0.1 uA เมื่อ MCU ใช้ 1uA อย่างต่อเนื่อง
Bimpelrekkie

"ไม่มีประโยชน์ที่ใช้สวิตช์ 0.1 uA เมื่อ MCU ใช้ 1uA อย่างต่อเนื่อง" เสียงที่ออกมา ฉันคิดว่าคุณหมายถึง 1uA peak 10% สำหรับสวิตช์จะมากเกินไป;)
Trevor_G

@ เทรเวอร์ไม่สูงสุดฉันหมายถึงกระแสเฉลี่ย 1uA สำหรับ MCU แต่ 0.1uA เมื่อกดสวิตช์ เมื่อรวมกับสวิตช์ 0.1 A ซึ่งจะกดเพียงช่วงเวลาสั้น ๆ (ค่อนข้าง) สวิตช์จะไม่ก่อให้เกิดการสิ้นเปลืองพลังงานโดยรวมเลยทีเดียวเนื่องจากกระแสเฉลี่ยจะเป็น 100% x 1 uA + 8.3% * 0.1 uA = 1.0083 uA (ใช้ซ้ำ 8.3% จากความคิดเห็นด้านบน)
Bimpelrekkie

2
ใช่แค่อ่านเช่นคุณหมายถึงค่าเฉลี่ย 0.1uA บนสวิตช์ ซึ่งคงจะไม่สมเหตุผลสำหรับเหมือนสวิตช์จุ่ม
Trevor_G

10

วิธีการหนึ่งที่ฉันใช้ใช้ประโยชน์จากธรรมชาติของ capacitive ของอินพุต CMOS

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab

ในวงจรด้านบนสวิตช์เมื่อปิดจะช่วยให้ตัวต้านทานแบบดึงลงเพื่อชาร์จ / คายประจุความจุอินพุตของ GPIO ลงไปที่ระดับพื้นดิน

เคล็ดลับที่มีวงจรนี้คือการใช้ลักษณะสองทิศทางของ GPIO เพื่อให้การป้อนข้อมูลค่าใช้จ่ายในระดับสูงตรรกะเมื่อสวิตช์เปิด

รูทีนการควบคุมจะเปิดพินออกเป็นระยะ ๆ เป็นระดับสูงหรือเปิดใช้งานการดึงในเวลาสั้น ๆ นานพอที่จะรักษาประจุของแคป จากนั้นขาอินพุตจะทำหน้าที่เหมือนบิตหน่วยความจำแบบไดนามิกซึ่งอุปกรณ์ส่วนใหญ่จะเก็บประจุนั้นไว้เป็นระยะเวลานานพอสมควร

เมื่อกำหนดค่าอย่างเหมาะสมหากกดปุ่มการชาร์จบนพินจะคายประจุเร็วกว่าอัตราการรีเฟรช เงื่อนไขนั้นสามารถตรวจพบได้ในฐานะเป็นส่วนหนึ่งของอัลกอริทึมการรีเฟรชเหมือนอ่านก่อนการดำเนินการรีเฟรชหรือใช้เพื่อผลักดันการขัดจังหวะ

พลังงานจะใช้ช่วงสั้น ๆ ระหว่างพัลส์รีเฟรชทั้งเพื่อชาร์จตัวเก็บประจุและผ่านตัวต้านทานและสวิตช์หากปิด อย่างไรก็ตามความยาวของพัลส์รีเฟรชนั้นสั้นและความถี่ในการทำโพลจะส่งผลให้กระแสรีเฟรชนั้นไม่มีนัยสำคัญ

เห็นได้ชัดว่าวิธีนี้เป็นวิธีการที่ใช้งานอยู่ หากไมโครถูกสลีปโหมดสวิทช์จะไม่สามารถทำงานได้ รอบการรีเฟรชครั้งแรกหลังจากตื่นขึ้นต้องละเว้นการอ่านพิน นอกจากนี้วิธีนี้ไม่ควรใช้ในการปลุกไมโคร ก่อนเข้านอนก็ควรที่จะเปิดใช้งานพินเป็นเอาต์พุตต่ำเพื่อจอดไว้ในสถานะศูนย์เป็นศูนย์

สำหรับการอ่านสวิตช์แบบคงที่มากขึ้นเช่นการตั้งค่าสวิตช์ dip สามารถใช้รูทีนเฉพาะงานแทนวงจรการรีเฟรชอย่างต่อเนื่อง หลังจากอ่านแล้วหมุด GPIO ควร "จอดอยู่" ในสถานะเอาต์พุตต่ำที่ใช้งาน (ปัจจุบันเป็นศูนย์) เพื่อหลีกเลี่ยงปัญหาอินพุตแบบลอยตัว

หมายเหตุ: เทคนิคนี้จะได้รับความไวของเสียงเล็กน้อยหากความยาวการติดตามยาวและเคลื่อนที่ผ่านบริเวณที่มีเสียงดัง เช่น R1 ควรอยู่ใกล้กับขาอินพุต อย่างไรก็ตามฉันไม่แนะนำให้ใช้สวิทช์ในระยะห่างจากแผงด้านหน้าที่ไหนสักแห่งเว้นแต่คุณจะเพิ่มความจุพิเศษใกล้กับพิน


1
นี่เป็นความเสี่ยงที่จะเกิดขึ้นกับอีเอ็มไออย่างแน่นอน หากรูปแบบใดของพลังงานคลื่นวิทยุเข้ามาในวงจรนั้นและฉันคิดว่าการเดิมพันทั้งหมดจะปิด สิ่งที่ดีไร้สายไม่ได้เป็นเรื่องปกติในทุกวันนี้ :)
Lundin

@Lundin มันไม่ได้แย่อย่างที่คุณคิด 30pF และ meg ทำให้ตัวกรองค่อนข้างดี
Trevor_G

8

หากปุ่มของคุณเป็นสวิตช์แบบ piezo พลังงานที่จำเป็นเพียงอย่างเดียวคือพลังงานที่สร้างขึ้นโดยการกดปุ่ม

ตัวอย่างเช่น: R2 / C1 รวบรวมพลังงานที่ผลิตโดยการกดปุ่มเพียโซ D1 ป้องกันไม่ให้แรงดัน C1 สูงเกินไป R1 ระบาย C1 เมื่อปล่อยปุ่ม MCU GPIO ต้องอยู่ในอินพุตไม่มีโหมดการดึง ตอนนี้, ตรวจจับปุ่มด้วยการดึงกระแสศูนย์จากแหล่งจ่าย

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab


3
อืมคุณสามารถสร้าง / ออกแบบต้นแบบการทำงานของมันและแสดงให้เห็นถึงประโยชน์จากการแก้ปัญหาด้วยสวิตช์ปกติที่เราเคยใช้มา 30 ปีแล้วหรือไม่?
Bimpelrekkie

แน่ใจ ฉันได้เพิ่มแผนผังตัวอย่าง เพียงแค่สร้าง ข้อดีคือไม่มีการดึงกระแสไฟฟ้าจากศูนย์ในสถานะปิดหรือสถานะเปิด ข้อเสียรวมถึงการควบคุมที่ไม่ดีของความพยายามที่จำเป็นในการเปิดใช้งานสวิทช์ (วงจรแอคทีฟจะดีขึ้น แต่นั่นจะเกียดผลประโยชน์ส่วนเพิ่มของวงจร) และเป็นการออกแบบใหม่เมื่อเปรียบเทียบกับการออกแบบสวิตช์ธรรมดาอายุ 30 ปี
Heath Raftery

ถึงกระนั้นเครื่องคิดเลขของฉันมีปุ่มจำนวนมากและทำงานอย่างน้อย 5 ปีในเซลล์เหรียญ ยังไม่เห็นว่าโซลูชันของคุณจะก่อให้เกิดประโยชน์ใด ๆ ฉันยังคิดว่ามันเป็น "วิธีแก้ปัญหา" สำหรับปัญหาที่ไม่มีอยู่ และมีราคาสูงขึ้นเช่นกัน
Bimpelrekkie

1
โอ้ฉันเห็นด้วย! มันตรงตามเกณฑ์ดั้งเดิม "ใช้พลังงานน้อยที่สุดเท่าที่จะเป็นไปได้" แต่ทำไมการประหยัดน้อยกว่ามิลลิจูลจึงมีประโยชน์จริงๆยากที่จะจินตนาการ
Heath Raftery

อิมพีแดนซ์อินพุตของ MCU ทำสิ่งที่น่ารังเกียจไม่ใช่เพราะความต้านทานเอาต์พุตสูงของ piezo หรือไม่?
Scott Seidman

5

หากอุปกรณ์จำเป็นต้องอยู่ในสถานะใดสถานะหนึ่งอย่างไม่ จำกัด การใช้สวิตช์ SPDT จะเป็นวิธีที่ใช้กำลังไฟต่ำที่สุดเนื่องจากวงจรแบบคงที่สามารถสร้างกระแสไฟฟ้าเกินกว่าการรั่วไหลภายในของตัวเองและสวิตช์ ข้อได้เปรียบเพิ่มเติมของสวิตช์ SPDT ก็คือพวกมันสามารถทำการ debounce ได้อย่างสมบูรณ์แบบไม่ว่าพวกมันจะทำงานเร็วแค่ไหนหรือว่าผู้ติดต่อนั้นจะร่วนรัวเพียงใดโดยที่ผู้ติดต่อเพียงคนเดียวหยุดกระเด้งก่อนที่คนอื่น ๆ

มีสองวิธีที่ดีในการเดินสายสวิตช์ดังกล่าว:

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab

วิธีแรกต้องการตัวต้านทานน้อยกว่าตัวที่สอง แต่ตัวที่สองจะทนต่อการทับซ้อนระหว่างขั้วทั้งสองได้มากขึ้น (มันจะดึงกระแสที่สูงกว่ากระแสปกติ แต่จะไม่ทำให้เกิดการลัดวงจรของแหล่งจ่าย) โปรดทราบว่าหากสวิตช์สามารถเข้าสู่สถานะที่มีความต้านทานปานกลางเป็นระยะเวลานานซึ่งสามารถเผาไหม้กระแสได้มากกว่าปกติอย่างมีนัยสำคัญ แต่ในระหว่างการใช้งานตามปกติไม่มีตัวต้านทานใด ๆ ที่จะมีกระแสสำคัญยกเว้นในช่วงเวลาสั้น ๆ ระหว่าง เวลาที่สวิตช์เปลี่ยนสถานะและเอาต์พุตตอบสนอง


2

ใช้การดึงภายในของไมโครคอนโทรลเลอร์และเมื่อตรวจพบการกดปิดการทำงานการดึงขึ้น จากนั้นเปิดใช้งานอีกครั้งในเวลาสั้น ๆ เพื่อตรวจสอบสถานะปุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.