Pull-up, pull-down และปุ่มกด
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”เมื่อจบบทเรียนนี้ คุณจะ
- อธิบายว่าทำไมขาเข้าที่ไม่มี pull-up หรือ pull-down จึงอ่านค่าไม่แน่นอน
- ต่อปุ่มแบบ active-low และอธิบายว่าทำไมกดแล้วอ่านได้ 0
- วัดระยะเวลาการเด้งของปุ่มด้วย logic analyzer แล้วเลือกเวลากันเด้ง (debounce) จากข้อมูลที่วัดได้
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”- รู้จัก V_IH และ V_IL จากบทเรียน ระดับลอจิกและเกตพื้นฐาน
- สำหรับแล็บ: TESAIoT Dev Kit ที่ flash ตัวอย่าง QWA309 Header I/O Test ไว้ เบรดบอร์ด ปุ่มกดขาเสียบ (tactile switch) หนึ่งตัว ตัวต้านทาน 10 kΩ และ 1 kΩ มัลติมิเตอร์ และ logic analyzer ราคาประหยัดที่ใช้กับโปรแกรม PulseView ได้
- บทนี้เป็นครั้งแรกที่ใช้ logic analyzer ขั้นตอนในแล็บพอสำหรับงานนี้ รายละเอียดเรื่องอัตราสุ่มตัวอย่างอยู่ในบทเรียน จับสัญญาณดิจิทัลครั้งแรก
ดูของจริงก่อน
หัวข้อที่มีชื่อว่า “ดูของจริงก่อน”รันโปรแกรมทดสอบ header แล้วกดปุ่ม GPIO In โดย ไม่ต่ออะไรเข้า header เลย โปรแกรมตั้งขา P13.0, P13.3, P13.4, P13.5, P13.6, P13.7 เป็นขาเข้าแบบไม่มี pull (high-Z) อ่านทุก 100 ms นาน 8 s และพิมพ์ค่า mask ทุกครั้งที่ค่าเปลี่ยน
ระหว่างนั้นลองเอานิ้วแตะ หรือเอาสายจัมเปอร์ที่ต่อไว้ข้างเดียวแตะใกล้ ๆ ขาเหล่านั้น แล้วดูว่า mask เปลี่ยนไหม บางบอร์ดค่าจะแกว่งจนเห็นได้ชัด บางบอร์ดนิ่งอยู่ที่ 0 ทั้งที่ไม่มีอะไรต่อ ทั้งสองแบบบอกเรื่องเดียวกัน คือ ค่าที่อ่านจากขาลอยเชื่อถือไม่ได้ นิ่งวันนี้ไม่ได้แปลว่าจะนิ่งพรุ่งนี้ ตอนที่มือคนอยู่ใกล้ หรือตอนที่สายเส้นข้าง ๆ สลับสถานะ
1. ขาลอย: ขาเข้าที่ไม่มีใครบอกค่า
หัวข้อที่มีชื่อว่า “1. ขาลอย: ขาเข้าที่ไม่มีใครบอกค่า”ขาเข้าแบบ CMOS มีความต้านทานขาเข้าสูงมาก กระแสรั่ว (leakage) อยู่ในระดับ nA ถึง µA ถ้าไม่มีอะไรต่อ ขาเข้าก็เหมือนตัวเก็บประจุเล็ก ๆ ที่ไม่มีใครคุม ประจุจากนิ้ว สัญญาณจากสายข้าง ๆ หรือสนามไฟฟ้ารอบตัว ทำให้แรงดันของมันลอยไปที่ไหนก็ได้ รวมทั้งช่วงที่ไม่รับประกันระหว่าง V_IL กับ V_IH เมื่อแรงดันค้างอยู่กลางช่วง ทรานซิสเตอร์ในวงจรขาเข้าอาจนำไฟพร้อมกันทั้งคู่ กินกระแสมากกว่าปกติ ขาลอยจึงทั้งอ่านค่ามั่วและเปลืองไฟ
ทางแก้คือให้ขาเข้ามี “ค่าเริ่มต้น” เสมอ
- pull-up ตัวต้านทานจากขาไปไฟเลี้ยง เมื่อไม่มีใครขับ ขาเป็น 1
- pull-down ตัวต้านทานจากขาลง GND เมื่อไม่มีใครขับ ขาเป็น 0
ตัวต้านทานนี้ต้อง “อ่อน” พอที่อุปกรณ์อื่น (หรือปุ่ม) จะเอาชนะได้ง่าย และ “แข็ง” พอที่สัญญาณรบกวนเอาชนะไม่ได้
ไมโครคอนโทรลเลอร์ส่วนใหญ่มี pull-up และ pull-down อยู่ในชิป เปิดได้จากโปรแกรม ค่าจริงของมันต้องดูในเอกสารข้อมูล (ค่ามักคลาดเคลื่อนได้กว้าง)
บน PSoC ใช้ drive mode CY_GPIO_DM_PULLUP และมีรายละเอียดหนึ่งที่ SDK เตือนไว้ในตัวอย่าง cm33/io/04_gpio_led_button.c
ค่า out-value ที่ส่งให้ Cy_GPIO_Pin_FastInit() ต้องเป็น 1 เพราะในโหมดนี้ค่านั้นคือตัวที่เปิด pull-up ถ้าส่ง 0 ขาจะอ่านได้ 0 ตลอดเหมือนปุ่มถูกกดค้าง
ตัวอย่าง Button Monitor ของ Developer Hub ก็เรียก Cy_GPIO_Pin_FastInit(..., CY_GPIO_DM_PULLUP, 1UL, HSIOM_SEL_GPIO) ตามนี้
2. ปุ่มแบบ active-low และการเลือกค่า pull-up
หัวข้อที่มีชื่อว่า “2. ปุ่มแบบ active-low และการเลือกค่า pull-up”- ปล่อยปุ่ม สวิตช์เปิด ไม่มีกระแสไหลผ่าน R_pu แรงดันตกคร่อม R_pu เป็นศูนย์ ขาจึงเท่ากับ 3.3 V อ่านได้ 1
- กดปุ่ม สวิตช์ต่อขาลง GND โดยตรง ขาเป็น 0 V อ่านได้ 0 และมีกระแสไหลผ่าน R_pu = 3.3 V / R_pu
“กดแล้วเป็น 0” จึงเรียกว่า active-low ในโค้ดเราเขียน pressed = !pin หรือเทียบกับค่าคงที่ที่ BSP ให้มา เช่น CYBSP_BTN_PRESSED (มีค่าเป็น 0)
ทำไมนิยมแบบนี้ GND มีอยู่ทั่วบอร์ด สวิตช์ที่ต่อลง GND ไม่ต้องลากไฟเลี้ยงออกไปถึงตัวปุ่ม และหลักเดียวกันนี้คือพื้นฐานของบัส open-drain อย่าง I2C ในโมดูล 4
เลือกค่า R_pu มีสามเรื่องดึงกันอยู่
| R_pu | กระแสตอนกด (3.3 V / R) | ความเร็วขอบขาขึ้น (τ = R × 10 pF) | แรงดันตกจากกระแสรั่ว 1 µA |
|---|---|---|---|
| 1 kΩ | 3.3 mA (เปลืองไฟ) | 10 ns | 1 mV |
| 10 kΩ | 0.33 mA | 100 ns | 10 mV |
| 100 kΩ | 33 µA | 1 µs | 0.1 V |
| 1 MΩ | 3.3 µA | 10 µs | 1 V (ขาเหลือ 2.3 V) |
ความจุ 10 pF ของขาและลายวงจร กับกระแสรั่ว 1 µA ในตารางเป็นค่าสมมุติเพื่อให้เห็นแนวโน้ม ค่าจริงต้องดูจากเอกสารข้อมูล แถวสุดท้ายน่าสนใจ ที่ 1 MΩ กระแสรั่วทำให้ขาเหลือ 3.3 − 1.0 = 2.3 V ต่ำกว่า V_IH = 2.31 V ของกฎหยาบ 0.7 × VDD ขาอาจไม่อ่านเป็น 1 ทั้งที่ปล่อยปุ่มอยู่ สำหรับปุ่มทั่วไป ค่าในช่วงราว 4.7 kΩ ถึง 47 kΩ ปลอดภัยทุกด้าน 10 kΩ เป็นค่าที่ใช้กันมากที่สุด
ตัวต้านทาน 1 kΩ อนุกรมที่ขา ในภาพไม่จำเป็นต่อการทำงานของปุ่ม แต่เป็นประกัน ถ้าโปรแกรมเผลอตั้งขาเป็นขาออกสถานะ 1 แล้วมีคนกดปุ่ม ขาจะถูกลัดลง GND ตรง ๆ ตัวต้านทานนี้จำกัดกระแสให้ไม่เกิน 3.3 V / 1 kΩ = 3.3 mA ในแล็บเราจะใส่ไว้เสมอ
3. การเด้งของหน้าสัมผัส และการเลือกเวลากันเด้ง
หัวข้อที่มีชื่อว่า “3. การเด้งของหน้าสัมผัส และการเลือกเวลากันเด้ง”หน้าสัมผัสโลหะในปุ่มไม่ได้แตะกันครั้งเดียว มันกระทบแล้วเด้งหลายครั้งในเวลาสั้น ๆ ก่อนนิ่ง เรียกว่า การเด้งของหน้าสัมผัส (contact bounce)
ไมโครคอนโทรลเลอร์อ่านขาได้เร็วระดับไมโครวินาที มันจึงเห็นการกดหนึ่งครั้งเป็นหลายครั้ง ระยะเวลาการเด้งต่างกันมากตามชนิดปุ่ม อายุ และแรงกด บางตัวไม่ถึงมิลลิวินาที บางตัวหลายมิลลิวินาที จึงต้องวัดปุ่มที่ใช้จริง ไม่ใช่เดา
วิธีกันเด้งด้วยซอฟต์แวร์ที่ใช้บ่อยคือ “ยอมรับค่าใหม่เมื่อค่าเดิมคงอยู่นานพอ”
ตัวอย่าง Button Monitor ของ Developer Hub อ่านปุ่มทุก 25 ms และยอมรับค่าใหม่เมื่ออ่านได้ค่าเดิมต่อเนื่องอีกสองรอบ (BUTTON_DEBOUNCE_TICKS = 2) คือต้องนิ่งราว 50 ms
หลักเลือกเวลากันเด้งจากข้อมูล
- วัดการเด้งหลายครั้ง (อย่างน้อย 10 ถึง 20 ครั้ง ทั้งตอนกดและตอนปล่อย) แล้วหาค่าที่ นานที่สุด
- เวลากันเด้ง = ค่าที่นานที่สุด × ตัวคูณเผื่อ 2 ถึง 3 เท่า
- ตรวจว่าไม่นานจนผู้ใช้รู้สึกว่าปุ่มหน่วง โดยทั่วไปการหน่วงไม่กี่สิบมิลลิวินาทียังรู้สึกว่าทันที
กันเด้งด้วยฮาร์ดแวร์ ใส่ตัวเก็บประจุคร่อมปุ่ม เช่น 100 nF กับ pull-up 10 kΩ ตอนกด ตัวเก็บประจุคายผ่านปุ่มเร็วมาก ตอนปล่อยมันประจุผ่าน 10 kΩ ด้วย τ = 1 ms แรงดันจะถึง 0.7 × VDD ที่เวลา τ × ln(1 / 0.3) = 1.2 × τ = 1.2 ms ขอบที่ช้าแบบนี้ควรเข้าขาเข้าที่มี Schmitt trigger (มี hysteresis) ไม่อย่างนั้นอาจสลับไปมาตอนแรงดันผ่านช่วงกลาง
ตัวอย่างสมบูรณ์
หัวข้อที่มีชื่อว่า “ตัวอย่างสมบูรณ์”โจทย์ ต่อปุ่มภายนอกเข้าขา P13.0 บน header ของ TESAIoT Dev Kit ด้วย pull-up ภายนอก แล้วเลือกเวลากันเด้ง
- วงจร 3V3 → R_pu 10 kΩ → จุด BTN_N → ปุ่ม → GND และ BTN_N → 1 kΩ → P13.0 ตามภาพในหัวข้อ 2
- กระแสตอนกด 3.3 V / 10 kΩ = 0.33 mA กำลังที่ R_pu = 3.3 V × 0.33 mA = 1.09 mW
- ระดับที่ขาเห็น ปล่อย: 3.3 V (ลบกระแสรั่วของขาคูณ 11 kΩ ซึ่งน้อยมาก) กด: 0 V ห่างจากทั้ง V_IH และ V_IL มาก
- ข้อมูลการเด้ง สมมุติวัดกด 10 ครั้งด้วย logic analyzer ได้ระยะเวลาการเด้ง (ms) ดังนี้ (ข้อมูลตัวอย่าง ไม่ใช่ค่าจริงของปุ่มคุณ)
0.2 0.4 1.6 0.3 0.9 0.1 2.4 0.5 0.7 1.1ค่ามากที่สุด = 2.4 ms ค่าเฉลี่ย = 0.82 ms- เลือกเวลากันเด้ง ใช้ค่ามากที่สุด ไม่ใช่ค่าเฉลี่ย 2.4 ms × 3 = 7.2 ms ปัดเป็น 10 ms ยังเร็วพอที่ผู้ใช้ไม่รู้สึก
- ตรวจกับโค้ด ถ้าใช้วิธีอ่านทุก 5 ms และยอมรับเมื่อค่าเดิมต่อเนื่องสองรอบ จะได้ราว 10 ms ตรงตามที่เลือก
ฝึกเติม
หัวข้อที่มีชื่อว่า “ฝึกเติม”- pull-up 4.7 kΩ ที่ 3.3 V ตอนกดปุ่มมีกระแสเท่าไร กำลังที่ตัวต้านทานเท่าไร
- ขาเข้ามีกระแสรั่วสูงสุด 1 µA ใช้ pull-up (ก) 47 kΩ (ข) 470 kΩ ขาเหลือแรงดันเท่าไรตอนปล่อยปุ่ม ยังสูงกว่า V_IH = 2.31 V หรือไม่
- กันเด้งด้วย RC จาก pull-up 10 kΩ กับ 1 µF ตอนปล่อยปุ่ม ขาใช้เวลานานเท่าไรจึงถึง 0.7 × VDD
- วัดการเด้งได้ (ms) 0.6, 0.3, 3.1, 0.8, 1.2 ควรเลือกเวลากันเด้งเท่าไร เพราะอะไรจึงไม่ใช้ค่าเฉลี่ย
- ปุ่มต่อแบบ pull-down (ตัวต้านทานลง GND ปุ่มต่อไป 3.3 V) กดแล้วอ่านได้อะไร และเรียกว่าอะไร
- โปรแกรมอ่านขาทุก 100 ms เหมือนปุ่ม GPIO In ของโปรแกรมทดสอบ header จะเห็นการเด้งที่ยาว 2 ms ไหม
- I = 3.3 V / 4.7 kΩ = 0.702 mA และ P = 3.3 V × 0.702 mA = 2.32 mW
- (ก) 1 µA × 47 kΩ = 0.047 V เหลือ 3.25 V ผ่านสบาย (ข) 1 µA × 470 kΩ = 0.47 V เหลือ 2.83 V ยังผ่าน แต่ส่วนเผื่อลดลงมาก
- τ = 10 kΩ × 1 µF = 10 ms เวลาถึง 0.7 × VDD = 1.2 × 10 ms = 12 ms
- ค่ามากที่สุด 3.1 ms คูณเผื่อ 2 ถึง 3 เท่าได้ราว 6 ถึง 9 ms เลือก 10 ms ได้ ค่าเฉลี่ย (1.2 ms) ทำให้ครึ่งหนึ่งของการกดยังเด้งผ่านไปได้
- กดแล้วขาต่อกับ 3.3 V อ่านได้ 1 เรียกว่า active-high
- ไม่เห็น การอ่านทุก 100 ms เห็นเฉพาะสิ่งที่ยาวพอจะคร่อมจังหวะอ่าน การเด้ง 2 ms ส่วนใหญ่จะตกอยู่ระหว่างสองจังหวะอ่าน นี่คือเหตุผลที่ต้องใช้ logic analyzer ที่สุ่มเร็วกว่ามาก
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”ตอบคำถามใน quiz.yaml ให้ถูกอย่างน้อย 4 ใน 5 ข้อ และอธิบายด้วยคำพูดของตัวเองว่าทำไม “นิ่งตอนทดสอบ” ไม่ใช่หลักฐานว่าขาลอยใช้ได้
ส่วน A: ขาลอยกับขาที่มี pull-up
- ถอด USB ต่อวงจรตามตัวอย่างสมบูรณ์ แต่ ยังไม่ใส่ R_pu 10 kΩ (มีแค่ปุ่มกับ 1 kΩ เข้า P13.0)
- เสียบ USB กด GPIO In แล้วแตะสาย BTN_N ด้วยนิ้ว จดว่าบิต 0 (P13.0) เปลี่ยนกี่ครั้งใน 8 s
- ถอด USB ใส่ R_pu 10 kΩ แล้วทำซ้ำ บิต 0 ควรนิ่งที่ 1 ทั้งที่แตะสาย
- กด GPIO In อีกครั้ง แล้วกดปุ่มค้างสลับกับปล่อยช้า ๆ บิต 0 ควรเป็น 0 ตอนกด เป็น 1 ตอนปล่อย
- วัดแรงดันที่ BTN_N ด้วยมัลติมิเตอร์ทั้งตอนกดและปล่อย แล้วคำนวณกระแสผ่าน R_pu ตอนกด
ส่วน B: วัดการเด้งด้วย logic analyzer
- ต่อสาย GND ของ logic analyzer เข้า GND ของบอร์ดก่อน แล้วต่อช่อง 0 (CH0) เข้าจุด BTN_N
- เปิด PulseView เลือกอุปกรณ์ ตั้งอัตราสุ่มอย่างน้อย 1 MHz (ความละเอียด 1 µs) และจำนวนตัวอย่างให้พอสำหรับหลายวินาที
- ตั้ง trigger ที่ขอบขาลง (falling edge) ของ CH0 กด Run แล้วกดปุ่มหนึ่งครั้ง
- ซูมที่ขอบแรก ใช้เครื่องมือวัดเวลา (cursor) วัดจากขอบแรกถึงขอบสุดท้ายก่อนนิ่ง นั่นคือระยะเวลาการเด้ง
- ทำซ้ำอย่างน้อย 10 ครั้งตอนกด และ 10 ครั้งตอนปล่อย (trigger ขอบขาขึ้น) จดลงตาราง แล้วเลือกเวลากันเด้งตามหลักในหัวข้อ 3
| ครั้งที่ | เด้งตอนกด (ms) | เด้งตอนปล่อย (ms) |
|---|---|---|
| 1 | ||
| 2 | ||
| … | ||
| ค่ามากที่สุด |
ส่วน C: เทียบกับตัวอย่าง Button Monitor รันตัวอย่าง QWA309 Push Button Monitor ซึ่งอ่านปุ่มที่ต่อกับขา P17.7 และ P17.5 แบบ active-low ด้วย pull-up ภายในชิป (ถ้าบอร์ดของคุณยังไม่มีปุ่มที่สองขานี้ ให้ดูวิธีต่อใน README ของตัวอย่าง) กดปุ่มเร็ว ๆ แล้วดูว่าตัวนับจำนวนครั้งนับตรงกับที่คุณกดไหม เวลากันเด้งราว 50 ms ของตัวอย่างนี้ยาวกว่าค่าที่คุณเลือกในส่วน B หรือไม่ ถ้ายาวกว่ามาก ข้อดีข้อเสียคืออะไร
ถ้าใช้ Eva Kit ต่อวงจรปุ่มเดียวกันเข้าขาว่างหนึ่งขาของบอร์ด เขียนโปรแกรมสั้น ๆ ตั้งขานั้นเป็นขาเข้าแบบไม่มี pull แล้วพิมพ์ค่าเมื่อเปลี่ยน ส่วน B ทำได้เหมือนเดิมทุกขั้น
โมดูลถัดไปเริ่มที่ วัดแรงดันและความต่อเนื่อง เราจะใช้มัลติมิเตอร์ให้คล่องและปลอดภัย ถ้าอยากเห็นการใช้ปุ่มบนบอร์ดในโปรแกรมภาษา C ต่อ ดูบทเรียน ปุ่มและเมนูในหลักสูตร TESAIoT Firmware Stack
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”ก่อนเรียนบทนี้ ถ้าปุ่มในโปรแกรมของคุณนับเกินบ้างเป็นบางครั้ง คุณจะสงสัยโค้ดหรือฮาร์ดแวร์ก่อน ตอนนี้คุณจะพิสูจน์อย่างไรว่าอันไหนผิด
แหล่งอ้างอิง
หัวข้อที่มีชื่อว่า “แหล่งอ้างอิง”- AIoT in Action: examples/s03/04_button_active_low.py
- AIoT in Action: examples/s03/05_debounce_count.py
- SDK: cm33/io/04_gpio_led_button.c (drive mode ของปุ่ม)
- sigrok PulseView
- README ของ QWA309 Push Button Monitor (Developer Hub, commit 372d0d8)
- Pull-up resistor (Wikipedia)
- Switch: contact bounce (Wikipedia)
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
ขาเข้าที่ไม่ได้ต่ออะไรและไม่ได้เปิด pull-up หรือ pull-down อ่านได้ 0 นิ่งตลอดการทดสอบ ข้อสรุปใดถูกต้อง (เป้าหมายข้อ 1)
- ขาลอยในบอร์ดนี้เป็น 0 เสมอ ใช้ได้
- ค่าของขาลอยขึ้นกับประจุและสัญญาณรบกวนรอบตัว นิ่งตอนทดสอบไม่ได้รับประกันว่าจะนิ่งตลอดไป
- ชิปมี pull-down ภายในเปิดอยู่แน่นอน
- ขานั้นเสีย
ดูเฉลย
คำตอบ: B. ค่าของขาลอยขึ้นกับประจุและสัญญาณรบกวนรอบตัว นิ่งตอนทดสอบไม่ได้รับประกันว่าจะนิ่งตลอดไป
ขาเข้า CMOS มีความต้านทานสูงมาก แรงดันของมันลอยไปตามประจุรอบตัว บางครั้งนิ่ง บางครั้งแกว่ง ต้องมี pull-up หรือ pull-down กำหนดค่าเริ่มต้นเสมอ
-
ปุ่มต่อจากขาลง GND และมี pull-up 10 kΩ ไป 3.3 V เมื่อกดปุ่ม ขาอ่านได้อะไร และมีกระแสผ่าน pull-up เท่าไร (เป้าหมายข้อ 2)
- อ่านได้ 1 กระแส 0 mA
- อ่านได้ 0 กระแส 0.33 mA
- อ่านได้ 0 กระแส 33 mA
- อ่านได้ 1 กระแส 0.33 mA
ดูเฉลย
คำตอบ: B. อ่านได้ 0 กระแส 0.33 mA
ปุ่มต่อขาลง GND โดยตรง ขาจึงเป็น 0 V อ่านได้ 0 (active-low) และแรงดันทั้งหมด 3.3 V ตกคร่อม pull-up กระแส = 3.3 V / 10 kΩ = 0.33 mA
-
ใน PSoC ถ้าตั้งขาเป็น CY_GPIO_DM_PULLUP แต่ส่งค่า out-value เป็น 0 ให้ Cy_GPIO_Pin_FastInit() จะเกิดอะไรขึ้นกับปุ่มแบบ active-low (เป้าหมายข้อ 2)
- ทำงานปกติ ค่า out-value ไม่มีผลกับขาเข้า
- ขาอ่านได้ 0 ตลอดเหมือนปุ่มถูกกดค้าง เพราะในโหมดนี้ out-value คือตัวที่เปิด pull-up
- ขากลายเป็นขาออก
- ปุ่มกลายเป็น active-high
ดูเฉลย
คำตอบ: B. ขาอ่านได้ 0 ตลอดเหมือนปุ่มถูกกดค้าง เพราะในโหมดนี้ out-value คือตัวที่เปิด pull-up
SDK เตือนไว้ในตัวอย่าง cm33/io/04_gpio_led_button.c ว่าในโหมด pull-up ค่า out-value ต้องเป็น 1 ถ้าเป็น 0 ขาจะถูกดึงลง และโปรแกรมจะเห็นปุ่มถูกกดตลอดเวลา
-
วัดการเด้งของปุ่มได้ 0.3, 0.5, 2.8, 0.4 และ 1.0 ms ควรเลือกเวลากันเด้งเท่าไร (เป้าหมายข้อ 3)
- 1 ms (ราวค่าเฉลี่ย)
- 2.8 ms พอดี
- ราว 6 ถึง 10 ms (ค่ามากที่สุดคูณเผื่อ 2 ถึง 3 เท่า)
- 500 ms
ดูเฉลย
คำตอบ: C. ราว 6 ถึง 10 ms (ค่ามากที่สุดคูณเผื่อ 2 ถึง 3 เท่า)
ต้องออกแบบจากกรณีที่แย่ที่สุด (2.8 ms) แล้วเผื่อ เพราะปุ่มอาจเด้งนานขึ้นเมื่อเก่าลง ค่าเฉลี่ยทำให้การกดบางครั้งนับซ้ำ ส่วน 500 ms นานจนผู้ใช้รู้สึกว่าปุ่มหน่วง
-
ต้องการเห็นการเด้งที่มีพัลส์สั้นที่สุดราว 20 µs อัตราสุ่มของ logic analyzer ข้อใดเหมาะที่สุด (เป้าหมายข้อ 3)
- 10 kHz
- 50 kHz
- 1 MHz
- 10 Hz
ดูเฉลย
คำตอบ: C. 1 MHz
ที่ 1 MHz หนึ่งตัวอย่างห่างกัน 1 µs พัลส์ 20 µs จะมีราว 20 ตัวอย่าง เห็นชัดและวัดเวลาได้ ที่ 50 kHz (20 µs ต่อตัวอย่าง) พัลส์นี้อาจหายไปทั้งพัลส์หรือเหลือตัวอย่างเดียว
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"Pull-up, pull-down และปุ่มกด" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Pull-ups, pull-downs and buttons" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA