บทเรียน 2.2 — Pull-up, pull-down และปุ่มกด

ต่อปุ่มแบบ active-low ด้วย pull-up และเห็นการเด้งของหน้าสัมผัสจริงบน logic analyzer

โมดูล 2 — วงจรดิจิทัล

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

เป้าหมาย

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

  1. อธิบายว่าทำไมขาเข้าที่ไม่มี pull-up หรือ pull-down จึงอ่านค่าไม่แน่นอน
  2. ต่อปุ่มแบบ active-low และอธิบายว่าทำไมกดแล้วอ่านได้ 0
  3. วัดระยะเวลาการเด้งของปุ่มด้วย logic analyzer แล้วเลือกเวลากันเด้งจากข้อมูลที่วัดได้
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม

  • รู้จัก V_IH และ V_IL จากบทเรียน ระดับลอจิกและเกตพื้นฐาน
  • แล็บ: TESAIoT Dev Kit ที่ flash QWA309 Header I/O Test, เบรดบอร์ด, ปุ่มกดขาเสียบ, ตัวต้านทาน 10 kΩ และ 1 kΩ, มัลติมิเตอร์, logic analyzer ราคาประหยัดที่ใช้กับ PulseView ได้
  • บทนี้เป็นครั้งแรกที่ใช้ logic analyzer
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ดูของจริงก่อน

รันโปรแกรมทดสอบ header แล้วกดปุ่ม GPIO In โดย ไม่ต่ออะไรเข้า header เลย ขาตั้งเป็นขาเข้าแบบไม่มี pull (high-Z)

ลองเอานิ้วแตะ หรือเอาสายจัมเปอร์ที่ต่อไว้ข้างเดียวแตะใกล้ ๆ ขาเหล่านั้น แล้วดูว่าค่าเปลี่ยนไหม

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

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

แนวคิด (1) — ขาลอย: ขาเข้าที่ไม่มีใครบอกค่า

ขาเข้าแบบ CMOS มีความต้านทานขาเข้าสูงมาก กระแสรั่วอยู่ในระดับ nA–µA ถ้าไม่มีอะไรต่อ ขาก็เหมือนตัวเก็บประจุเล็ก ๆ ที่ไม่มีใครคุม — ประจุจากนิ้ว สัญญาณข้างเคียง หรือสนามไฟฟ้ารอบตัว ทำให้แรงดันลอยไปที่ไหนก็ได้

ทางแก้: ให้ขาเข้ามี "ค่าเริ่มต้น" เสมอ

  • pull-up ตัวต้านทานจากขาไปไฟเลี้ยง — ไม่มีใครขับ ขาเป็น 1
  • pull-down ตัวต้านทานจากขาลง GND — ไม่มีใครขับ ขาเป็น 0

บน PSoC ต้องส่ง out-value = 1 ให้ Cy_GPIO_Pin_FastInit() เมื่อใช้โหมด CY_GPIO_DM_PULLUP — ถ้าส่ง 0 ขาจะอ่านได้ 0 ตลอดเหมือนปุ่มถูกกดค้าง

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

แนวคิด (2) — ปุ่มแบบ active-low

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

แนวคิด (3) — เลือกค่า R_pu

R_pu กระแสตอนกด ความเร็วขอบ (τ=R×10pF) แรงดันตกจากรั่ว 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 < V_IH)

10 kΩ เป็นค่าที่ใช้กันมากที่สุด — ช่วงราว 4.7 kΩ ถึง 47 kΩ ปลอดภัยทุกด้าน

ตัวต้านทาน 1 kΩ อนุกรมที่ขา ไม่จำเป็นต่อการทำงาน แต่เป็นประกัน — ถ้าโปรแกรมเผลอตั้งขาเป็นขาออกแล้วมีคนกดปุ่ม จำกัดกระแสไม่เกิน 3.3 mA

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

แนวคิด (4) — การเด้งของหน้าสัมผัส (contact bounce)

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

หลักเลือกเวลากันเด้งจากข้อมูล วัดหลายครั้ง (≥10–20) หาค่าที่นานที่สุด แล้วคูณเผื่อ 2–3 เท่า

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

ตัวอย่างสมบูรณ์ — ต่อปุ่มและเลือกเวลากันเด้ง

1. วงจร  3V3 → R_pu 10 kΩ → BTN_N → ปุ่ม → GND  และ BTN_N → 1 kΩ → P13.0
2. กระแสตอนกด  3.3 V / 10 kΩ = 0.33 mA  กำลัง = 1.09 mW
3. ระดับที่ขาเห็น  ปล่อย: 3.3 V   กด: 0 V  ห่างจาก V_IH และ V_IL มาก

4. ข้อมูลการเด้ง (ตัวอย่าง วัด 10 ครั้ง, ms)
   0.2  0.4  1.6  0.3  0.9  0.1  2.4  0.5  0.7  1.1
   ค่ามากที่สุด = 2.4 ms

5. เลือกเวลากันเด้ง  2.4 ms × 3 = 7.2 ms → ปัดเป็น 10 ms
6. ตรวจกับโค้ด  อ่านทุก 5 ms ยอมรับเมื่อค่าเดิมต่อเนื่องสองรอบ ≈ 10 ms ตรงตามที่เลือก
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ฝึกเติม / แล็บ

ฝึกเติม

  1. pull-up 4.7 kΩ ที่ 3.3 V ตอนกดปุ่มมีกระแสเท่าไร กำลังที่ตัวต้านทานเท่าไร
  2. วัดการเด้งได้ (ms) 0.6, 0.3, 3.1, 0.8, 1.2 ควรเลือกเวลากันเด้งเท่าไร เพราะอะไรจึงไม่ใช้ค่าเฉลี่ย

แล็บ ส่วน A ทดลองขาลอยกับขาที่มี pull-up — ไม่ใส่ R_pu แตะสาย BTN_N ด้วยนิ้ว จดว่าบิตเปลี่ยนกี่ครั้ง แล้วใส่ R_pu 10 kΩ ทำซ้ำ

แล็บ ส่วน B วัดการเด้งด้วย logic analyzer — ต่อ CH0 เข้า BTN_N, sample rate ≥ 1 MHz, trigger ที่ขอบขาลง วัดอย่างน้อย 10 ครั้งตอนกดและปล่อย

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

เช็กความเข้าใจ

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

    • ก) ขาลอยในบอร์ดนี้เป็น 0 เสมอ ใช้ได้ · ข) ค่าของขาลอยขึ้นกับประจุและสัญญาณรบกวนรอบตัว นิ่งตอนทดสอบไม่รับประกันว่าจะนิ่งตลอดไป · ค) ชิปมี pull-down ภายในเปิดอยู่แน่นอน · ง) ขานั้นเสีย
  2. ปุ่มต่อจากขาลง GND และมี pull-up 10 kΩ ไป 3.3 V เมื่อกดปุ่ม ขาอ่านได้อะไร และมีกระแสผ่าน pull-up เท่าไร

    • ก) อ่านได้ 1 กระแส 0 mA · ข) อ่านได้ 0 กระแส 0.33 mA · ค) อ่านได้ 0 กระแส 33 mA · ง) อ่านได้ 1 กระแส 0.33 mA
  3. วัดการเด้งของปุ่มได้ 0.3, 0.5, 2.8, 0.4 และ 1.0 ms ควรเลือกเวลากันเด้งเท่าไร

    • ก) 1 ms (ราวค่าเฉลี่ย) · ข) 2.8 ms พอดี · ค) ราว 6–10 ms (ค่ามากที่สุดคูณเผื่อ 2–3 เท่า) · ง) 500 ms
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ไปต่อ

โมดูลถัดไปเริ่มที่ วัดแรงดันและความต่อเนื่อง — ใช้มัลติมิเตอร์ให้คล่องและปลอดภัย

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

แหล่งที่มาและเครดิต

"อิเล็กทรอนิกส์และเครื่องมือวัดสำหรับนักพัฒนาระบบฝังตัว" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย
(Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program
สัญญาอนุญาต CC BY-NC 4.0

แผนภาพในบทเรียนนี้เป็นงานวาดของหลักสูตรนี้เอง (CC BY-NC 4.0)

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

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