ข้ามไปยังเนื้อหา

Pull-up, pull-down และปุ่มกด

เมื่อจบบทเรียนนี้ คุณจะ

  1. อธิบายว่าทำไมขาเข้าที่ไม่มี pull-up หรือ pull-down จึงอ่านค่าไม่แน่นอน
  2. ต่อปุ่มแบบ active-low และอธิบายว่าทำไมกดแล้วอ่านได้ 0
  3. วัดระยะเวลาการเด้งของปุ่มด้วย 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 ทั้งที่ไม่มีอะไรต่อ ทั้งสองแบบบอกเรื่องเดียวกัน คือ ค่าที่อ่านจากขาลอยเชื่อถือไม่ได้ นิ่งวันนี้ไม่ได้แปลว่าจะนิ่งพรุ่งนี้ ตอนที่มือคนอยู่ใกล้ หรือตอนที่สายเส้นข้าง ๆ สลับสถานะ

ขาเข้าแบบ 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) ตามนี้

3V3 R_pu 10 kΩ 1 kΩ input pin (P13.0) BTN_N SW released: pin = 1 (3.3 V) pressed: pin = 0 (0 V)
ปุ่มแบบ active-low: ปล่อยปุ่ม pull-up ดึงขาขึ้นเป็น 1 กดปุ่ม สวิตช์ต่อขาลงกราวด์เป็น 0 ตัวต้านทาน 1 kΩ อนุกรมกันขาเสียถ้าโปรแกรมตั้งขาเป็นขาออกโดยไม่ตั้งใจ
  • ปล่อยปุ่ม สวิตช์เปิด ไม่มีกระแสไหลผ่าน 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)

bounce pin (released = 1) pressed = 0 debounce time > worst bounce you measured
ภาพจาก logic analyzer ตอนกดปุ่ม: ขาเปลี่ยนไปมาหลายครั้งในเวลาสั้น ๆ ก่อนนิ่ง ช่วงนี้คือการเด้งของหน้าสัมผัส (contact bounce)

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

วิธีกันเด้งด้วยซอฟต์แวร์ที่ใช้บ่อยคือ “ยอมรับค่าใหม่เมื่อค่าเดิมคงอยู่นานพอ” ตัวอย่าง Button Monitor ของ Developer Hub อ่านปุ่มทุก 25 ms และยอมรับค่าใหม่เมื่ออ่านได้ค่าเดิมต่อเนื่องอีกสองรอบ (BUTTON_DEBOUNCE_TICKS = 2) คือต้องนิ่งราว 50 ms

หลักเลือกเวลากันเด้งจากข้อมูล

  1. วัดการเด้งหลายครั้ง (อย่างน้อย 10 ถึง 20 ครั้ง ทั้งตอนกดและตอนปล่อย) แล้วหาค่าที่ นานที่สุด
  2. เวลากันเด้ง = ค่าที่นานที่สุด × ตัวคูณเผื่อ 2 ถึง 3 เท่า
  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 ภายนอก แล้วเลือกเวลากันเด้ง

  1. วงจร 3V3 → R_pu 10 kΩ → จุด BTN_N → ปุ่ม → GND และ BTN_N → 1 kΩ → P13.0 ตามภาพในหัวข้อ 2
  2. กระแสตอนกด 3.3 V / 10 kΩ = 0.33 mA กำลังที่ R_pu = 3.3 V × 0.33 mA = 1.09 mW
  3. ระดับที่ขาเห็น ปล่อย: 3.3 V (ลบกระแสรั่วของขาคูณ 11 kΩ ซึ่งน้อยมาก) กด: 0 V ห่างจากทั้ง V_IH และ V_IL มาก
  4. ข้อมูลการเด้ง สมมุติวัดกด 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
  1. เลือกเวลากันเด้ง ใช้ค่ามากที่สุด ไม่ใช่ค่าเฉลี่ย 2.4 ms × 3 = 7.2 ms ปัดเป็น 10 ms ยังเร็วพอที่ผู้ใช้ไม่รู้สึก
  2. ตรวจกับโค้ด ถ้าใช้วิธีอ่านทุก 5 ms และยอมรับเมื่อค่าเดิมต่อเนื่องสองรอบ จะได้ราว 10 ms ตรงตามที่เลือก
  1. pull-up 4.7 kΩ ที่ 3.3 V ตอนกดปุ่มมีกระแสเท่าไร กำลังที่ตัวต้านทานเท่าไร
  2. ขาเข้ามีกระแสรั่วสูงสุด 1 µA ใช้ pull-up (ก) 47 kΩ (ข) 470 kΩ ขาเหลือแรงดันเท่าไรตอนปล่อยปุ่ม ยังสูงกว่า V_IH = 2.31 V หรือไม่
  3. กันเด้งด้วย RC จาก pull-up 10 kΩ กับ 1 µF ตอนปล่อยปุ่ม ขาใช้เวลานานเท่าไรจึงถึง 0.7 × VDD
  4. วัดการเด้งได้ (ms) 0.6, 0.3, 3.1, 0.8, 1.2 ควรเลือกเวลากันเด้งเท่าไร เพราะอะไรจึงไม่ใช้ค่าเฉลี่ย
  5. ปุ่มต่อแบบ pull-down (ตัวต้านทานลง GND ปุ่มต่อไป 3.3 V) กดแล้วอ่านได้อะไร และเรียกว่าอะไร
  6. โปรแกรมอ่านขาทุก 100 ms เหมือนปุ่ม GPIO In ของโปรแกรมทดสอบ header จะเห็นการเด้งที่ยาว 2 ms ไหม
  1. I = 3.3 V / 4.7 kΩ = 0.702 mA และ P = 3.3 V × 0.702 mA = 2.32 mW
  2. (ก) 1 µA × 47 kΩ = 0.047 V เหลือ 3.25 V ผ่านสบาย (ข) 1 µA × 470 kΩ = 0.47 V เหลือ 2.83 V ยังผ่าน แต่ส่วนเผื่อลดลงมาก
  3. τ = 10 kΩ × 1 µF = 10 ms เวลาถึง 0.7 × VDD = 1.2 × 10 ms = 12 ms
  4. ค่ามากที่สุด 3.1 ms คูณเผื่อ 2 ถึง 3 เท่าได้ราว 6 ถึง 9 ms เลือก 10 ms ได้ ค่าเฉลี่ย (1.2 ms) ทำให้ครึ่งหนึ่งของการกดยังเด้งผ่านไปได้
  5. กดแล้วขาต่อกับ 3.3 V อ่านได้ 1 เรียกว่า active-high
  6. ไม่เห็น การอ่านทุก 100 ms เห็นเฉพาะสิ่งที่ยาวพอจะคร่อมจังหวะอ่าน การเด้ง 2 ms ส่วนใหญ่จะตกอยู่ระหว่างสองจังหวะอ่าน นี่คือเหตุผลที่ต้องใช้ logic analyzer ที่สุ่มเร็วกว่ามาก

ตอบคำถามใน quiz.yaml ให้ถูกอย่างน้อย 4 ใน 5 ข้อ และอธิบายด้วยคำพูดของตัวเองว่าทำไม “นิ่งตอนทดสอบ” ไม่ใช่หลักฐานว่าขาลอยใช้ได้

ส่วน A: ขาลอยกับขาที่มี pull-up

  1. ถอด USB ต่อวงจรตามตัวอย่างสมบูรณ์ แต่ ยังไม่ใส่ R_pu 10 kΩ (มีแค่ปุ่มกับ 1 kΩ เข้า P13.0)
  2. เสียบ USB กด GPIO In แล้วแตะสาย BTN_N ด้วยนิ้ว จดว่าบิต 0 (P13.0) เปลี่ยนกี่ครั้งใน 8 s
  3. ถอด USB ใส่ R_pu 10 kΩ แล้วทำซ้ำ บิต 0 ควรนิ่งที่ 1 ทั้งที่แตะสาย
  4. กด GPIO In อีกครั้ง แล้วกดปุ่มค้างสลับกับปล่อยช้า ๆ บิต 0 ควรเป็น 0 ตอนกด เป็น 1 ตอนปล่อย
  5. วัดแรงดันที่ BTN_N ด้วยมัลติมิเตอร์ทั้งตอนกดและปล่อย แล้วคำนวณกระแสผ่าน R_pu ตอนกด

ส่วน B: วัดการเด้งด้วย logic analyzer

  1. ต่อสาย GND ของ logic analyzer เข้า GND ของบอร์ดก่อน แล้วต่อช่อง 0 (CH0) เข้าจุด BTN_N
  2. เปิด PulseView เลือกอุปกรณ์ ตั้งอัตราสุ่มอย่างน้อย 1 MHz (ความละเอียด 1 µs) และจำนวนตัวอย่างให้พอสำหรับหลายวินาที
  3. ตั้ง trigger ที่ขอบขาลง (falling edge) ของ CH0 กด Run แล้วกดปุ่มหนึ่งครั้ง
  4. ซูมที่ขอบแรก ใช้เครื่องมือวัดเวลา (cursor) วัดจากขอบแรกถึงขอบสุดท้ายก่อนนิ่ง นั่นคือระยะเวลาการเด้ง
  5. ทำซ้ำอย่างน้อย 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

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

คำถามทบทวน

ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย

  1. ขาเข้าที่ไม่ได้ต่ออะไรและไม่ได้เปิด pull-up หรือ pull-down อ่านได้ 0 นิ่งตลอดการทดสอบ ข้อสรุปใดถูกต้อง (เป้าหมายข้อ 1)

    1. ขาลอยในบอร์ดนี้เป็น 0 เสมอ ใช้ได้
    2. ค่าของขาลอยขึ้นกับประจุและสัญญาณรบกวนรอบตัว นิ่งตอนทดสอบไม่ได้รับประกันว่าจะนิ่งตลอดไป
    3. ชิปมี pull-down ภายในเปิดอยู่แน่นอน
    4. ขานั้นเสีย
    ดูเฉลย

    คำตอบ: B. ค่าของขาลอยขึ้นกับประจุและสัญญาณรบกวนรอบตัว นิ่งตอนทดสอบไม่ได้รับประกันว่าจะนิ่งตลอดไป

    ขาเข้า CMOS มีความต้านทานสูงมาก แรงดันของมันลอยไปตามประจุรอบตัว บางครั้งนิ่ง บางครั้งแกว่ง ต้องมี pull-up หรือ pull-down กำหนดค่าเริ่มต้นเสมอ

  2. ปุ่มต่อจากขาลง GND และมี pull-up 10 kΩ ไป 3.3 V เมื่อกดปุ่ม ขาอ่านได้อะไร และมีกระแสผ่าน pull-up เท่าไร (เป้าหมายข้อ 2)

    1. อ่านได้ 1 กระแส 0 mA
    2. อ่านได้ 0 กระแส 0.33 mA
    3. อ่านได้ 0 กระแส 33 mA
    4. อ่านได้ 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

  3. ใน PSoC ถ้าตั้งขาเป็น CY_GPIO_DM_PULLUP แต่ส่งค่า out-value เป็น 0 ให้ Cy_GPIO_Pin_FastInit() จะเกิดอะไรขึ้นกับปุ่มแบบ active-low (เป้าหมายข้อ 2)

    1. ทำงานปกติ ค่า out-value ไม่มีผลกับขาเข้า
    2. ขาอ่านได้ 0 ตลอดเหมือนปุ่มถูกกดค้าง เพราะในโหมดนี้ out-value คือตัวที่เปิด pull-up
    3. ขากลายเป็นขาออก
    4. ปุ่มกลายเป็น active-high
    ดูเฉลย

    คำตอบ: B. ขาอ่านได้ 0 ตลอดเหมือนปุ่มถูกกดค้าง เพราะในโหมดนี้ out-value คือตัวที่เปิด pull-up

    SDK เตือนไว้ในตัวอย่าง cm33/io/04_gpio_led_button.c ว่าในโหมด pull-up ค่า out-value ต้องเป็น 1 ถ้าเป็น 0 ขาจะถูกดึงลง และโปรแกรมจะเห็นปุ่มถูกกดตลอดเวลา

  4. วัดการเด้งของปุ่มได้ 0.3, 0.5, 2.8, 0.4 และ 1.0 ms ควรเลือกเวลากันเด้งเท่าไร (เป้าหมายข้อ 3)

    1. 1 ms (ราวค่าเฉลี่ย)
    2. 2.8 ms พอดี
    3. ราว 6 ถึง 10 ms (ค่ามากที่สุดคูณเผื่อ 2 ถึง 3 เท่า)
    4. 500 ms
    ดูเฉลย

    คำตอบ: C. ราว 6 ถึง 10 ms (ค่ามากที่สุดคูณเผื่อ 2 ถึง 3 เท่า)

    ต้องออกแบบจากกรณีที่แย่ที่สุด (2.8 ms) แล้วเผื่อ เพราะปุ่มอาจเด้งนานขึ้นเมื่อเก่าลง ค่าเฉลี่ยทำให้การกดบางครั้งนับซ้ำ ส่วน 500 ms นานจนผู้ใช้รู้สึกว่าปุ่มหน่วง

  5. ต้องการเห็นการเด้งที่มีพัลส์สั้นที่สุดราว 20 µs อัตราสุ่มของ logic analyzer ข้อใดเหมาะที่สุด (เป้าหมายข้อ 3)

    1. 10 kHz
    2. 50 kHz
    3. 1 MHz
    4. 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

ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/electronics-and-instruments/m02-digital-logic/l02-pullups-and-buttons/

วิธีอ้างอิง TESA ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA