กลับไปหน้ารวมไฟล์
motor-speed-control-with-one-transistor-f2d8a6.md

พื้นฐานเบื้องต้น:

ถ้าน้องอยากควบคุมความเร็วของมอเตอร์กระแสตรง (DC Motor) วิธีที่ง่ายที่สุดคือใช้ทรานซิสเตอร์ จัดการได้เพราะเรามี PWM นะตัวนี้ PWM (Pulse-Width Modulation) คือสัญญาณที่มีรอบหน้าที่แปรเปลี่ยนได้ (variable duty cycle) ถ้าเราเอาเจ้านี่คู่กับทรานซิสเตอร์ เราก็ควบคุมความเร็วมอเตอร์ได้สบายๆ

ดูวงจรตัวอย่างนี้หน่อย:

ในวงจรนี้ ขดลวด (inductor) นี่แทนตัวมอเตอร์เลย ขอบคุณสัญญาณ PWM ที่ทำให้มอเตอร์ไม่รู้สึกว่าได้ไฟ 12V เต็มๆ แต่แรงดันที่มันได้จะเป็นสัดส่วนกับค่า PWM พูดง่ายๆ แรงดันขึ้นอยู่กับรอบหน้าที่เราเรียกกันว่า δ (Duty Cycle)

รอบหน้าที่ว่าคืออันนี้แหละ:

มันคือตัวเลขตั้งแต่ 0 ถึง 1 แต่ส่วนใหญ่เราพูดเป็นเปอร์เซ็นต์ 0% ถึง 100% นั่นแหละ ตัวอย่างเช่น ถ้า δ = 0.5 (50%) และ Vmax = 12V มอเตอร์จะได้แรงดันประมาณ 6V แต่ถ้า δ = 1 (100%) มอเตอร์ก็จะได้ 12V เต็มๆ ซึ่ง δ = 1 นี่หมายความว่าสัญญาณมัน HIGH ตลอดเวลา ก็คือกลายเป็นไฟตรง (DC) ธรรมดา พลังงานก็จะเต็มที่สุดๆ ไปเลย

เจาะลึกเทคนิค (แบบเด็กช่าง)

  • BJT-Saturation & PWM Duty-Cycle Harmonics:

สืบสวนการสวิตช์ของ NPN: ทรานซิสเตอร์ 2N2222 ตัวนี้ทำหน้าที่เหมือนประตูเปิด-ปิดความเร็วสูงของเมคคาทรอนิกส์ หลักฐานสำคัญคือเราต้องขับเบส $(\text{Pin } 13)$ ผ่านตัวต้านทาน $1\text{k}\Omega$ เพื่อให้แน่ใจว่าทรานซิสเตอร์เข้าสู่สถานะ "อิ่มตัว (Saturation)" เมื่อ $PWM$ เป็น HIGH การวิเคราะห์จะโฟกัสที่รอบหน้าที่ $(\delta)$ โดยที่แรงดันเฉลี่ยที่มอเตอร์ $(V_{\text{avg}})$ เป็นผลคูณตรงๆ ของ $V_{\text{max}} \times \delta$

จัดการฮาร์ดแวร์ไทเมอร์ที่ 5kHz: เพื่อกำจัดเสียงหวีดรบกวนจากการสวิตช์ (audible switching-whine) และเพิ่มความแข็งแกร่งของแรงบิด (torque-stiffness) ระบบนี้จะไม่ใช้ไลบรารีมาตรฐาน แต่จะไปจัดการรีจิสเตอร์ของ TIMER0 $(\text{CTC mode})$ โดยตรงแทน โดยสร้างอินเตอร์รัพท์ $(\text{ISR})$ ทุกๆ $2\mu\text{s}$ ระบบจะสร้างสัญญาณ PWM แบบกำหนดเองที่ $5\text{kHz}$ ด้วยความแม่นยำระดับไมโครวินาทีย่อย ทำให้ได้ฮาร์มอนิกส์ของความเร็วที่เหนือกว่าในช่วงการทำงาน $(30\% - 100\%)$ ทั้งหมด

  • จัดการสไปค์จากขดลวด & ความสมบูรณ์ของสัญญาณ:

สืบสวนไดโอดฟลายแบ็ก 1N4007: มอเตอร์กระแสตรงเป็นโหลดแบบขดลวด (inductive load) ที่สร้างสไปค์แรงดันย้อนกลับมหาศาล $(-L \cdot di/dt)$ ขณะสวิตช์ความถี่สูง การวิเคราะห์ต้องรวมไดโอด 1N4007 ในรูปแบบต่อต้านขนาน (anti-parallel configuration) สะพานไดโอดแบบสืบสวนนี้จะอนุญาตให้กระแสจากขดลวดไหลวนได้อย่างปลอดภัยเมื่อ BJT ปิดอยู่ ป้องกันไม่ให้ฮาร์มอนิกส์ของแรงดันชั่วขณะ (transient-voltage harmonics) มาทำลายรอยต่อเซมิคอนดักเตอร์แบบย่อยยับ

ฮิวริสติกส์การลดคลื่นรบกวนบนเรลไฟ: เพื่อรักษาเสถียรภาพให้กับเรลไฟที่แชร์กันระหว่างลอจิกและแอคชูเอเตอร์ เราใส่ตัวเก็บประจุ $100\mu\text{F}$ ไว้ การวิเคราะห์เกี่ยวข้องกับการดูดซับกระแสริปเปิล (ripple-currents) ที่เกิดจากการเปลี่ยนขั้วของมอเตอร์ (commutation) เพื่อให้แน่ใจว่าการอ่านค่า $ADC$ ของ Arduino จากโพเทนชิออมิเตอร์จะปราศจากสัญญาณรบกวนและมีค่าแน่นอน

วิธีทำ! (จัดไปวัยรุ่น)

  • ฮาร์ดแวร์

ฮาร์ดแวร์ไม่ต้องใช้อะไรมาก ประกอบด้วย:

  • ทรานซิสเตอร์ 1 ตัว: เพื่อผลลัพธ์ที่ดีควรเป็นทรานซิสเตอร์สวิตช์ความเร็วสูง เช่น 2n2222
  • ไดโอด (D1) 1 ตัว: ในกรณีนี้จำเป็นเพราะเราใช้มอเตอร์ซึ่งมันก็คือขดลวดชนิดนึง พอเราควบคุมขดลวดด้วยคลื่นสี่เหลี่ยม มันจะสร้างสไปค์แรงดันสูงขึ้นมาได้ ซึ่งอาจทำลายทรานซิสเตอร์ได้ ไดโอดตัวนี้จะจัดการสไปค์พวกนั้นให้
  • ตัวต้านทานเบสสำหรับทรานซิสเตอร์ 1 ตัว: ตัวอย่างใช้ 1KΩ แต่ค่าที่ใกล้เคียงกันก็ใช้ได้เหมือนกัน ห้ามช็อตนะตัวนี้
  • ซอฟต์แวร์

ในกรณีนี้เราอาจใช้สัญญาณ PWM ของ Arduino ได้ แต่มันมีความถี่ประมาณ 1kHz ซึ่งอาจได้ยินเสียงมอเตอร์ดังเอี๊ยดๆ ดังนั้นใช้ความถี่ที่สูงกว่านี้จะดีกว่า พี่จะใช้ Internal Timer ของ Arduino เองเพื่อสร้าง สัญญาณ PWM แบบเฉพาะของเราเอง สู้งานนะน้อง

ถ้าอยากรู้เรื่อง Timer มากขึ้น ลองไปดูโปรเจคของพี่ได้: Internal Timer

พี่สร้าง PWM ความถี่ 5kHz จาก Arduino ด้วย TIMER0 นี่แหละ

 TCCR0A = (1 << WGM01); //Set the CTC mode
OCR0A = 0x04; //Value for ORC0A for 2us
TIMSK0 |= (1 << OCIE0A); //Set the interrupt request
sei(); //Enable interrupt
TCCR0B |= (1 << CS01); //Set the prescale 1/8 clock
TCCR0B |= (0 << CS00); //Now timer is on

เสร็จแล้วพี่ก็สร้าง ISR (Interrupt Request Service) ให้ทำงานทุกๆ 2μs

ISR(TIMER0_COMPA_vect) {   //This is the interrupt request
timer++; //+1 every 2 us
if (timer <= (percent * 2)) // The duty cycle depends on the value
// of "percent" which represent the per cent
// of duty cylce that we have requested
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
if (timer >= 200) timer = 0; //Every 200us reset the timer value
}

เราจะมีโพเทนชิโอมิเตอร์ (Potentiometer) ไว้วบค่า Duty Cycle กับมีปุ่มกดสำหรับควบคุมสถานะ ในชุด Elegoo's kit พี่เจอจอยสติ๊กที่มีปุ่มกดกับโพเทนชิโอมิเตอร์สองตัว เลยเอามาใช้เลยจ้า

วิศวกรรมและการนำไปใช้ (Engineering & Implementation)

  • การชดเชยแรงบิดและการวินิจฉัยตอนเริ่มต้น (Torque-Compensation & Startup Diagnostics):

การลดผลกระทบจากฮาร์มอนิกส์ที่จุดหยุดนิ่ง (Stall-Point Mitigation Harmonics): มอเตอร์ DC ส่วนใหญ่จะมีแรงเสียดทานที่ไม่เป็นเชิงเส้น $(\text{มักจะต่ำกว่า } 30\% \delta)$ วิธีแก้คือเขียนโค้ด "Kick-Start" วินิจฉัย โดยให้มอเตอร์ทำงานที่ Duty Cycle $100\%$ สั้นๆ ประมาณ $100\text{ms}$ ก่อนจะปรับไปที่ความถี่ PWM ที่ผู้ใช้เลือก

การวิเคราะห์การแปลงสัญญาณอนาล็อกเป็นดิจิทัล (Analog-to-Digital Mapping Analytics): ความเร็วควบคุมผ่านโพเทนชิโอมิเตอร์แบบหมุน ต้องทำการแมปค่าอินพุตอนาล็อก 10-bit $(\text{0-1023})$ ให้เข้ากับช่วง Duty Cycle PWM ที่เฉพาะเจาะจง เพื่อให้อินเทอร์เฟซระหว่างคนกับเครื่อง (HMI) ให้ความรู้สึกเร่งแบบเส้นตรง (linear-acceleration harmonics) โดยไม่มีจุดตาย (dead-zones)

  • การจัดการความร้อนความเร็วสูง (High-Speed Thermal Management):

การนำไปใช้เน้นที่ขีดจำกัดความร้อนของทรานซิสเตอร์ 2N2222 ต้องตรวจสอบความถี่ PWM ให้แน่ใจว่าการสูญเสียจากการสวิตช์ (switching-losses) ไม่ทำให้อุณหภูมิรอยต่อ $T_j$ (Junction Temperature) สูงเกินไป เพื่อรักษาประสิทธิภาพสูงสุดระหว่างการทำงานของมอเตอร์ภายใต้โหลดสูงต่อเนื่อง

ตอนนี้มีปัญหานะเฟ้ย! (NOW THERE IS A PROBLEM!)

ตอนนี้ซอฟต์แวร์ต้องคำนวณให้สอดคล้องกับความเป็นจริง เพราะฉะนั้นมีข้อจำกัดสำคัญสองข้อ:

  • เราใช้ช่วง PWM ไม่ได้เต็ม 100% แต่ใช้ได้แค่จาก 100% ถึง 30% เพราะต่ำกว่า 30% มอเตอร์จะหยุด (อันนี้ขึ้นอยู่กับชนิดของมอเตอร์นะ)
  • เราต้องสร้างฟังก์ชันที่สตาร์ทมอเตอร์โดยไม่ใช้ PWM ก่อน เช่น ให้มอเตอร์วิ่งที่ความเร็วสูงสุด 1 วินาที แล้วค่อยควบคุมด้วย PWM เพราะเราไม่สามารถสตาร์ทมอเตอร์ด้วย PWM 30% ได้นั่นเอง

ด้วยเหตุผลเหล่านี้ พี่เลยย้ายโค้ดควบคุม PWM ออกจาก ISR ไปไว้ในฟังก์ชัน loop() แทน ใน ISR พี่เหลือแค่ timer++ เท่านั้น ดูโค้ดเต็มๆ ด้านล่างเลย

และนี่คือผลลัพธ์สุดท้าย จัดไปวัยรุ่น!

สรุปสั้นๆ อย่าให้ยาว

Transistor-Torque นี่แหละตัวดี จัดเต็มในเรื่อง Elementary Power-Drive Design เลยนะตัวนี้ พอเจอเขยิบมาเจาะลึก BJT-Switching Forensics กับ 5kHz Hardware-Timer Orchestration แบบนี้ Marcazzan_M ก็เลยปั้นคอนโทรลเลอร์ควบคุมความเร็วออกมาได้แบบจัดจ้าน ระดับมืออาชีพเลยทีเดียว งานนี้บอกเลยว่าควบคุมการเคลื่อนไหวได้แม่นยำสุดๆ ด้วยการวินิจฉัยฮาร์ดแวร์ขั้นสูง


Kinetic Precision: ควบคุมมอเตอร์ให้อยู่หมัดด้วยการสืบสวน BJT แบบสายช่างตัวจริง


ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "Marcazzan_M"
category: ""
components:
  - "1x DC motor (generic)"
  - "1x Rotary potentiometer (generic)"
  - "2x LED (generic)"
  - "1x Pushbutton switch 12mm"
  - "1x Breadboard (generic)"
  - "1x General Purpose Transistor NPN"
  - "2x Resistor 1k ohm"
  - "1x Arduino UNO"
  - "2x Resistor 221 ohm"
  - "1x Capacitor 100 µF"
  - "1x Elegoo Starter Kit"
  - "1x 1N4007 – High Voltage, High Current Rated Diode"
description: "มาดูกันว่าพี่จะสอนน้องควบคุมความเร็วมอเตอร์ยังไง ด้วยทรานซิสเตอร์แค่ตัวเดียวและสัญญาณ PWM ที่เราจัดทำเองแบบตึงๆ"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/4dba8db2-e234-4bf8-a600-49fcad9cebba.ino"
  - "https://projects.arduinocontent.cc/4dba8db2-e234-4bf8-a600-49fcad9cebba.ino"
encryptedPayload: "U2FsdGVkX1+nQm6Kpbnsm+0teHTc1PU6j6ylK0Q0FDLQ08TLQcqzr9YD0CSCrB9hewaF36aRNBul6QaiuUoynenjwNE53gI5Xtk1o0qJGL8="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/motor-speed-control-with-one-transistor-f2d8a6_cover.jpg"
lang: "en"
likes: 5
passwordHash: "64ff318b59912d0298f7f5207828af343e1cb1c7f6166bd24f8d90490e03d7bb"
price: 2
seoDescription: "Learn how to control Motor Speed using a single Transistor and a PWM Signal for your Arduino projects. Simple and effective guide."
tags:
  - "speed"
  - "clocks"
  - "pwm"
  - "dcmotor"
title: "ควบคุมความเร็วมอเตอร์ด้วยทรานซิสเตอร์ตัวเดียว งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/Nx6HbPP7xXg"
views: 27069