topbar
Hướng dẫn chọn và sử dụng Encoder cho người mới

Hướng dẫn chọn và sử dụng Encoder cho người mới

28/09/2026

🛠️ [GÓC KỸ THUẬT] TẤT TẦN TẬT VỀ ENCODER: TỪ CHỌN LOẠI, ĐẤU NỐI ARDUINO/PLC ĐẾN CÔNG THỨC TÍNH VẬN TỐC (RPM) KHÔNG LỆCH XUNG

Chào anh em kỹ thuật và tự động hóa!

Encoder (bộ mã hóa xung vòng quay) là thiết bị kinh điển trong điều khiển vòng kín (closed-loop), từ đo chiều dài băng tải, tính vận tốc vòng tua (RPM) động cơ đến định vị chính xác bàn trục servo/stepper.

Tuy nhiên, rất nhiều anh em khi chuyển từ vi điều khiển (Arduino/STM32) sang lập trình PLC công nghiệp thường vướng các lỗi: ❌ Đấu nhầm cực âm/dương tín hiệu giữa chuẩn Sink và Source làm PLC không nhận xung. ❌ Đọc ngõ vào DI thường thay vì chân High Speed Counter (HSC) khiến xung bị xén, đọc sai bét nhè khi chạy tốc độ cao. ❌ Chưa nắm rõ thuật toán tính RPM từ xung ngắt định thời.

Bài viết này tổng hợp toàn bộ từ cách chọn loại, sơ đồ đấu nối thực tế và công thức tính tốc độ chuẩn chỉ trên Arduino, PLC Mitsubishi FX3U và Siemens S7-1200! 👇

━━━━━━━━━━━━━━━━━━━ 📌 PHẦN 1: PHÂN LOẠI & NGUYÊN TẮC CHỌN ENCODER

1️⃣ Theo nguyên lý đo:

• Incremental Encoder (Tương đối):

  • Phát xung liên tục theo góc quay (Pha A, B và Z). Mất điện là mất vị trí hiện tại (muốn xác định lại vị trí phải có chu trình về mốc Home).

  • Ứng dụng: Đo tốc độ vòng tua (RPM), đo khoảng cách/chiều dài, định vị cơ bản.

  • Dòng phổ biến: Omron E6B2-CWZ, Autonics E50S8.

• Absolute Encoder (Tuyệt đối):

  • Mã hóa góc quay bằng mã Gray hoặc Nhị phân theo từng phân vùng đĩa quang. Mất điện bật lại vẫn biết chính xác trục đang ở góc bao nhiêu độ mà không cần quay về Home.

  • Ứng dụng: Khớp cánh tay robot, van góc xoay công nghiệp, bàn xoay CNC.

2️⃣ Dạng ngõ ra tín hiệu (Cực kỳ quan trọng khi chọn mua ghép với PLC):

• NPN Open Collector (Cực thu hở):

  • Tín hiệu kéo xuống Mass (0V). Rất phổ biến tại thị trường châu Á, phối ghép chuẩn chỉnh nhất với PLC Mitsubishi, Delta, Omron (chế độ Sink).

• PNP Open Collector:

  • Tín hiệu kích lên nguồn (+24V). Phổ biến theo chuẩn châu Âu, cực kỳ thuận tiện khi ghép với PLC Siemens S7-1200.

• Line Driver (RS422 - Vi sai A/A đảo, B/B đảo):

  • Điện áp vi sai 5V, chống nhiễu tuyệt đối khi truyền xa trên 20 mét hoặc trong môi trường biến tần công suất lớn. Cần dùng Module đếm HSC vi sai chuyên dụng của PLC.

━━━━━━━━━━━━━━━━━━━ 📌 PHẦN 2: QUY CHUẨN MÀU DÂY TIÊU CHUẨN

Dây cáp encoder công nghiệp thông thường có 5 đến 8 sợi:

🟤 Dây Nâu (Brown): Cấp nguồn dương +Vcc (+5V hoặc 12 - 24V DC tùy dòng) 🔵 Dây Xanh dương (Blue): Nối Mass (0V / GND) ⚫ Dây Đen (Black): Tín hiệu Pha A ⚪ Dây Trắng (White): Tín hiệu Pha B (lệch pha 90 độ so với pha A để xác định chiều quay) 🟠 Dây Cam / Vàng (Orange/Yellow): Tín hiệu Pha Z (phát 1 xung duy nhất mỗi vòng để làm mốc reset) 🛡️ Dây Chống nhiễu (Shield): Lớp lưới bọc bạc chống nhiễu, đấu trực tiếp vào cọc nối đất tủ điện (PE)

━━━━━━━━━━━━━━━━━━━ 📌 PHẦN 3: ĐẤU NỐI & TÍNH TỐC ĐỘ TRÊN PLC MITSUBISHI (FX3U / FX5U)

1️⃣ Sơ đồ đấu dây (Với Encoder NPN Open Collector 24V): PLC Mitsubishi dòng FX mặc định chạy chế độ SINK (kích âm):

  • Nối nguồn +24V vào chân chung [S/S] của PLC.

  • Dây Nâu encoder nối vào nguồn [+24V].

  • Dây Xanh encoder nối vào nguồn [0V].

  • Dây Đen (Pha A) nối vào ngõ vào xung cao tốc [X0].

  • Dây Trắng (Pha B) nối vào ngõ vào xung cao tốc [X1].

2️⃣ Thuật toán tính vận tốc (RPM):

👉 Cách 1: Dùng trực tiếp lệnh SPD (Speed Detection) Cú pháp lệnh: [SPD X000 K1000 D0]

  • Ý nghĩa: Đếm số lượng xung chân X0 ghi nhận được trong khoảng thời gian T = 1000ms (1 giây), kết quả lưu vào thanh ghi D0.

  • Công thức tính RPM: RPM = (D0 * 60) / PPR (Trong đó PPR là số xung/vòng in trên nhãn encoder, ví dụ 1000 PPR).

👉 Cách 2: Dùng bộ đếm tốc độ cao 2 pha A-B (C251) Bộ đếm C251 tự động đọc chân X0 và X1, tự đảo chiều tăng/giảm theo chiều quay: [ M8000 ] ---- [ DCNT C251 K0 ]

Lập trình ngắt chu kỳ 100ms (0.1 giây): Delta_Pulse = C251_hientai - C251_truocdo RPM = (Delta_Pulse * 600) / (PPR * 4)

  • Lưu ý: C251 tự động nhân 4 lần cạnh xung (chế độ AB 4x) để tăng độ mịn nên mẫu số phải nhân thêm 4.

━━━━━━━━━━━━━━━━━━━ 📌 PHẦN 4: ĐẤU NỐI & TÍNH TỐC ĐỘ TRÊN SIEMENS S7-1200 (TIA PORTAL)

1️⃣ Sơ đồ đấu dây: PLC S7-1200 cho phép chọn chế độ Sink hoặc Source thông qua chân chung 1M:

• Dùng Encoder PNP (Kéo dương +24V - Khuyên dùng cho Siemens):

  • Chân 1M của PLC nối vào nguồn [0V].

  • Dây Nâu encoder nối [+24V], dây Xanh nối [0V].

  • Dây Đen (Pha A) nối vào ngõ vào [%I0.0].

  • Dây Trắng (Pha B) nối vào ngõ vào [%I0.1].

• Dùng Encoder NPN (Kéo âm 0V):

  • Chân 1M của PLC nối vào nguồn [+24V].

  • Dây Đen nối vào [%I0.0], dây Trắng nối vào [%I0.1].

2️⃣ Cấu hình & Tính toán trên TIA Portal:

👉 Cách 1: Cấu hình HSC ở chế độ Frequency (Đo tần số - Rất nhàn, độ chính xác cao)

  • Vào Device Configuration -> Chọn CPU -> Bật High Speed Counters (HSC1).

  • Mục Type of counting: Chọn [Frequency].

  • Mục Operating phase: Chọn [A/B counter] hoặc [Single phase].

  • PLC sẽ tự động tính tần số ngõ vào theo đơn vị Hz (xung/giây) và lưu vào thanh ghi vùng nhớ (ví dụ %ID1000).

Công thức tính: RPM = (%ID1000 * 60) / PPR

👉 Cách 2: Cấu hình HSC ở chế độ Counting (Đếm xung)

  • Tạo khối ngắt chu kỳ Cyclic Interrupt OB30 với chu kỳ cài đặt T = 50ms (0.05s).

  • Trong OB30 đọc giá trị đếm xung: RPM = ((Current_Pulse - Last_Pulse) * 60) / (PPR * 0.05) Last_Pulse := Current_Pulse;

━━━━━━━━━━━━━━━━━━━ 📌 PHẦN 5: CODE MẪU ARDUINO ĐỌC XUNG KHÔNG SÓT (DÙNG NGẮT NGOÀI)

Đối với anh em chế cháo mạch Arduino Uno/Nano:

// Chân ngắt Uno: D2 (INT0), D3 (INT1) const int pinA = 2; const int pinB = 3;

volatile long pulseCount = 0; long lastPulseCount = 0; unsigned long prevTime = 0; const int PPR = 600; // Thay đổi theo thông số encoder

void setup() { Serial.begin(115200); pinMode(pinA, INPUT_PULLUP); pinMode(pinB, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(pinA), readEncoder, RISING); }

void loop() { unsigned long currentTime = millis(); // Tính toán vận tốc mỗi 100ms (0.1s) if (currentTime - prevTime >= 100) { long currentPulses = pulseCount; long deltaPulses = currentPulses - lastPulseCount;

// RPM = (xung trong 0.1s / PPR) * (60s / 0.1s)
float rpm = (float)(deltaPulses * 600) / PPR;

Serial.print("Xung: ");
Serial.print(currentPulses);
Serial.print(" | Toc do: ");
Serial.print(rpm);
Serial.println(" RPM");

lastPulseCount = currentPulses;
prevTime = currentTime;

} }

void readEncoder() { if (digitalRead(pinB) == LOW) { pulseCount++; } else { pulseCount--; } }

---------------------------------------------------------------------------------------

Anh em trong nghề thường chọn đo tốc độ bằng Frequency hay dùng ngắt thời gian delta xung? Để lại bình luận cùng chia sẻ kinh nghiệm nhé! 💬👇

#TuDongHoa #CoDienTu #PLC #Siemens #Mitsubishi #Arduino #Encoder #HSC #LapTrinhPLC

Ghi Chú: Vinadenki sử dụng AI để tổng hợp. Các bạn tham khảo rồi để lại bình luận, góp ý nếu có nội dung nào chưa đúng nhé, Xin cảm ơn!

VIẾT BÌNH LUẬN CỦA BẠN:

Sản phẩm đã được thêm vào giỏ hàng

popup

Số lượng:

Tổng tiền:

Gọi ngay
zalo Chat Zalo