Skip to content

Pull-Up และ Pull-Down Resistor

ในวงจรดิจิทัล การใช้ Pull-Up และ Pull-Down Resistor เป็นเทคนิคสำคัญที่ช่วยกำหนดสถานะของสัญญาณให้ชัดเจน ป้องกันสัญญาณลอย (Floating) ที่อาจทำให้วงจรทำงานผิดพลาด


ปัญหา: สัญญาณลอย (Floating State)

เมื่อขา Input ของไมโครคอนโทรลเลอร์ไม่ได้เชื่อมต่อกับอะไรเลย (หรือเชื่อมกับสวิตช์ที่เปิดอยู่) ขานั้นจะอยู่ในสถานะ ลอย ซึ่ง:

  • อ่านค่าได้ทั้ง HIGH และ LOW สลับกันไปมาแบบสุ่ม
  • รับสัญญาณรบกวนจากสิ่งแวดล้อม (EMI, สัญญาณคลื่นวิทยุ)
  • ทำให้โปรแกรมทำงานผิดพลาด

1. Pull-Up Resistor (ดึงขึ้น)

หลักการทำงาน

ต่อตัวต้านทานระหว่าง ขา Input กับ VCC (แรงดันบวก) เพื่อให้ขานั้นมีค่าเริ่มต้นเป็น HIGH (1) เมื่อไม่มีการกด

วงจรพื้นฐาน

VCC (5V/3.3V)
    |
   [R] 10kΩ (Pull-Up Resistor)
    |
    ├─── Input Pin (ไมโครคอนโทรลเลอร์)
    |
 [Switch]
    |
   GND

การทำงาน

  • สวิตช์เปิด (ไม่กด): ขา Input ได้รับแรงดันจาก VCC ผ่านตัวต้านทาน → อ่านค่า HIGH
  • สวิตช์ปิด (กด): ขา Input ต่อกับ GND โดยตรง → อ่านค่า LOW

ตัวอย่างโค้ด Arduino

// ใช้ Pull-Up ภายใน (Internal Pull-Up)
pinMode(2, INPUT_PULLUP);

void loop() {
  int buttonState = digitalRead(2);
  if (buttonState == LOW) {  // กดปุ่ม
    Serial.println("Button Pressed!");
  }
}

การใช้งาน

  • ปุ่มกด (Push Button)
  • สวิตช์ต่างๆ
  • I2C Communication (SDA, SCL ต้องมี Pull-Up เสมอ)
  • Reset Pin

2. Pull-Down Resistor (ดึงลง)

หลักการทำงาน

ต่อตัวต้านทานระหว่าง ขา Input กับ GND (กราวด์) เพื่อให้ขานั้นมีค่าเริ่มต้นเป็น LOW (0) เมื่อไม่มีการกด

วงจรพื้นฐาน

VCC (5V/3.3V)
    |
 [Switch]
    |
    ├─── Input Pin (ไมโครคอนโทรลเลอร์)
    |
   [R] 10kΩ (Pull-Down Resistor)
    |
   GND

การทำงาน

  • สวิตช์เปิด (ไม่กด): ขา Input ต่อกับ GND ผ่านตัวต้านทาน → อ่านค่า LOW
  • สวิตช์ปิด (กด): ขา Input ได้รับแรงดันจาก VCC โดยตรง → อ่านค่า HIGH

ตัวอย่างโค้ด Arduino

// Arduino ไม่มี Internal Pull-Down ต้องต่อภายนอก
pinMode(2, INPUT);

void loop() {
  int buttonState = digitalRead(2);
  if (buttonState == HIGH) {  // กดปุ่ม
    Serial.println("Button Pressed!");
  }
}

การใช้งาน

  • ปุ่มกดที่ต้องการให้อ่านค่า HIGH เมื่อกด
  • วงจร Logic ที่ต้องการสถานะเริ่มต้นเป็น LOW
  • Enable/Disable Pins

ตารางเปรียบเทียบ Pull-Up vs Pull-Down

หัวข้อ Pull-Up Pull-Down
ต่อตัวต้านทานกับ VCC GND
สถานะเริ่มต้น HIGH (1) LOW (0)
เมื่อกดปุ่ม LOW (0) HIGH (1)
ความนิยม มากกว่า (มี Internal Pull-Up) น้อยกว่า
การใช้งาน I2C, Reset, ปุ่มทั่วไป Enable Pins, Logic Control

การเลือกค่าตัวต้านทาน

ค่ามาตรฐาน

  • 10kΩ: ค่ายอดนิยมที่สุด เหมาะกับงานทั่วไป
  • 4.7kΩ: สำหรับ I2C (ความเร็วสูง)
  • 47kΩ - 100kΩ: ประหยัดพลังงาน (แต่อ่อนไหวต่อสัญญาณรบกวน)

สูตรคำนวณ (เบื้องต้น)

R = (VCC - V_input) / I_leak
  • VCC: แรงดันจ่าย (5V หรือ 3.3V)
  • V_input: แรงดันที่ต้องการ
  • I_leak: กระแสรั่วไหล (โดยทั่วไป < 1µA)

Internal Pull-Up/Pull-Down

Arduino/ESP32

  • Arduino: มี Internal Pull-Up (20-50kΩ) ใช้ INPUT_PULLUP
  • ESP32: มีทั้ง Pull-Up และ Pull-Down ใช้ INPUT_PULLUP หรือ INPUT_PULLDOWN

ข้อดี

  • ประหยัดชิ้นส่วน ไม่ต้องต่อตัวต้านทานภายนอก
  • ลดความซับซ้อนของวงจร

ข้อเสีย

  • ค่าความต้านทานไม่แน่นอน (20-50kΩ)
  • อาจไม่เหมาะกับวงจรที่ต้องการความแม่นยำสูง

กรณีพิเศษ: I2C Communication

I2C ต้องมี Pull-Up Resistor เสมอ ที่ขา SDA และ SCL เพราะ:

  • I2C ใช้ Open-Drain ซึ่งดึงสัญญาณลงเป็น LOW เท่านั้น
  • ต้องพึ่ง Pull-Up เพื่อดึงสัญญาณกลับเป็น HIGH

ค่าแนะนำสำหรับ I2C

ความเร็ว ค่าตัวต้านทาน
100 kHz (Standard) 10kΩ
400 kHz (Fast) 4.7kΩ
1 MHz (Fast Plus) 2.2kΩ

เคล็ดลับการใช้งาน

  1. ใช้ Internal Pull-Up เมื่อไหร่ก็ได้: ถ้าไม่ต้องการความแม่นยำสูง
  2. I2C ต้องมี Pull-Up ภายนอก: แม้จะใช้ Internal Pull-Up แล้ว ก็ควรต่อภายนอกด้วย
  3. ตรวจสอบ Datasheet: บางชิปมีข้อกำหนดเฉพาะเรื่องค่า Pull-Up/Pull-Down
  4. ระวังกระแส: ถ้าใช้ค่าต้านทานต่ำเกินไป จะกินกระแสมากเมื่อกดปุ่ม

[!TIP] เคล็ดลับ: หากไม่แน่ใจว่าควรใช้ Pull-Up หรือ Pull-Down ให้เลือก Pull-Up เพราะส่วนใหญ่ไมโครคอนโทรลเลอร์มี Internal Pull-Up ในตัว ทำให้ประหยัดชิ้นส่วนได้