← Về trang chủ
Cơ bản IC 15 tháng 6, 2026 ⟳ 9 phút đọc

Control theory trực quan: pole, zero và step response — hiểu để không sợ s-domain

Pole/zero là gì, vì sao real part quyết định sống-chết của hệ thống, và cách tính step response của một PLL bằng tay — kèm tool tương tác để tự kéo thử.

control-theorypllpole-zerostep-responsefundamentals
Nhận bài viết mới

Không spam. Chỉ bài kỹ thuật AMS đáng đọc — gửi qua email khi có bài mới.

Lần đầu mình nhìn vào một bài báo PLL design, gặp cụm “hệ thống có pole tại 2ζωn-2\zeta\omega_n và…” — mình gấp máy, đi pha cà phê. Nghe rất “toán”, rất xa rời với việc mình đang cần làm: tại sao cái loop filter này lại làm VCO settle chậm thế? Tại sao tăng KvcoK_{vco} lên thì PLL bắt đầu ring?

Sự thật là: pole và zero không phải là toán trừu tượng. Chúng là bản đồ dự báo hành vi của mạch — chỉ cần nhìn vào vị trí của chúng trên một mặt phẳng, mình đoán được hệ thống sẽ tắt dần êm ái, dao động mãi không dứt, hay nổ tung. Bài này mình sẽ đi từ con số cụ thể, không phải từ định nghĩa sách giáo khoa.

Mục lục

  1. Pole, zero và ý nghĩa của real/imaginary part
  2. Step response vs impulse response — khác nhau ở đâu, dùng khi nào
  3. Từ s-domain sang time-domain: phương pháp partial fraction (PFD)
  4. Ví dụ có số: tính step response của PLL bậc 2 bằng tay
  5. Bài học cho việc thiết kế loop filter
  6. Tổng kết
  7. Tham khảo

1. Pole, zero và ý nghĩa của real/imaginary part

Một hệ thống tuyến tính (mạch lọc, vòng hồi tiếp, PLL…) được mô tả bởi hàm truyền H(s)H(s) — tỉ số giữa output và input trong miền Laplace. (Nếu chưa quen dựng H(s)H(s) từ một mạch R/L/C cụ thể, xem trước Biến đổi Laplace: phân tích mạch trong miền s.)

H(s)=N(s)D(s)H(s) = \frac{N(s)}{D(s)}
  • Zero: nghiệm của N(s)=0N(s) = 0 — giá trị ss làm H(s)H(s) bằng 0.
  • Pole: nghiệm của D(s)=0D(s) = 0 — giá trị ss làm H(s)H(s) tiến tới vô cùng.

Nghe trừu tượng, nhưng pole chính là thứ quyết định hệ thống phản ứng theo thời gian như thế nào. Vì sao? Vì đáp ứng theo thời gian của hệ thống là tổng của các thành phần dạng este^{st}, với ss chính là… vị trí pole. Viết s=σ+jωs = \sigma + j\omega:

est=eσtejωt=eσtbao hıˋnh (envelope)(cosωt+jsinωt)dao độnge^{st} = e^{\sigma t} \cdot e^{j\omega t} = \underbrace{e^{\sigma t}}_{\text{bao hình (envelope)}} \cdot \underbrace{(\cos\omega t + j\sin\omega t)}_{\text{dao động}}

Tách ra hai phần rõ ràng:

  • Real part σ\sigma → quyết định bao hình tăng hay giảm. σ<0\sigma < 0: bao hình co lại theo thời gian (decay) — hệ thống ổn định. σ>0\sigma > 0: bao hình phình ra (growth) — hệ thống unstable, tín hiệu nổ tung. σ=0\sigma = 0: bao hình giữ nguyên — dao động mãi mãi không tắt.
  • Imaginary part ω\omega → quyết định tần số dao động. ω=0\omega = 0: không dao động, chỉ tăng/giảm đơn điệu. ω0\omega \neq 0: có ringing với tần số ω\omega rad/s.

Quy về một bức tranh duy nhất — mặt phẳng ss (s-plane):

  • Pole nằm bên trái trục ảo (left-half plane, LHP, σ<0\sigma < 0) → ổn định, decay.
  • Pole nằm bên phải (RHP, σ>0\sigma > 0) → unstable.
  • Pole nằm đúng trên trục ảo (σ=0\sigma = 0) → biên giới, dao động không tắt — marginal.

(Kéo thử pole trên s-plane ở tool cuối bài để thấy trực tiếp ba vùng này.)

Còn zero thì sao? Zero không quyết định sống-chết của hệ thống (đó là việc của pole), nhưng nó định hình lại đáp ứng — thường làm overshoot tăng lên hoặc đẩy nhanh phần đầu của response. Trong loop filter của PLL, người ta cố tình thêm zero để bù pha — mình sẽ thấy rõ ở phần ví dụ.

Trực giác để nhớ: pole ở càng xa bên trái trục ảo → decay càng nhanh (system “chốt” giá trị cuối nhanh hơn). Pole càng gần trục ảo (dù vẫn bên trái) → decay chậm, response “lừ đừ”, dễ bị nhiễu làm trôi.

2. Step response vs impulse response

Hai khái niệm hay bị nhầm — nhưng thực ra liên hệ rất gọn:

  • Impulse response h(t)h(t): hệ thống phản ứng thế nào khi input là một xung cực ngắn, cực mạnh (về lý thuyết là hàm Dirac δ(t)\delta(t)). Đây chính là “chữ ký” của hệ thống — biết h(t)h(t) là biết tất cả.
  • Step response: hệ thống phản ứng thế nào khi input nhảy bậc từ 0 lên 1 và giữ nguyên — mô phỏng đúng tình huống thực tế nhất: PLL được lệnh nhảy tần số, regulator đột ngột có tải, ADC input đổi mức.

Quan hệ giữa hai cái: step response chính là tích phân của impulse response theo thời gian (vì step = tích phân của impulse). Trong miền Laplace, quan hệ này gọn hơn nhiều:

Ystep(s)=H(s)1sY_{step}(s) = H(s) \cdot \frac{1}{s}

— nhân thêm 1/s1/s chính là phép tích phân. Đây là lý do vì sao trong thiết kế, người ta hay dùng step response làm thước đo chính: nó vừa phản ánh tốc độ (settling time), vừa phản ánh độ ổn định (overshoot, ringing) — hai thứ engineer quan tâm nhất khi tune loop filter.

3. Từ s-domain sang time-domain: partial fraction decomposition

Đây là kỹ năng tay nghề quan trọng nhất của bài này — vì mọi phân tích PLL, regulator, filter đều quay về bước này. Quy trình 5 bước:

  1. Xác định H(s)H(s) của hệ thống.
  2. Nhân với input để ra Y(s)Y(s) — với step input thì Y(s)=H(s)/sY(s) = H(s)/s.
  3. Phân tích Y(s)Y(s) thành tổng các phân thức đơn giản (partial fraction decomposition — PFD): mỗi pole tương ứng với một số hạng dạng Asp\frac{A}{s - p} hoặc Bs+C(sσ)2+ω2\frac{Bs + C}{(s-\sigma)^2 + \omega^2} với pole phức.
  4. Tra bảng biến đổi Laplace ngược cho từng số hạng — đây là lý do PFD hữu dụng: mỗi phân thức đơn ứng với một dạng sóng đã biết sẵn (eate^{-at}, eσtcosωte^{-\sigma t}\cos\omega t,…).
  5. Cộng tất cả lại → ra y(t)y(t).

Bảng tra nhanh hay dùng nhất:

Y(s)Y(s)y(t)y(t)
As+a\dfrac{A}{s+a}AeatA e^{-at}
As\dfrac{A}{s}AA (hằng số — DC level)
Bs+C(s+σ)2+ω2\dfrac{Bs + C}{(s+\sigma)^2 + \omega^2}eσt[Bcosωt+CBσωsinωt]e^{-\sigma t}\left[B\cos\omega t + \dfrac{C - B\sigma}{\omega}\sin\omega t\right]

Nghe có vẻ máy móc, nhưng một khi quen tay, nhìn H(s)H(s) là mình đoán được dạng sóng ngay — không cần phải PFD đầy đủ mỗi lần.

4. Ví dụ có số: step response của PLL bậc 2

Lấy ví dụ cụ thể: một PLL bậc 2 (loại type-II phổ biến nhất trong thiết kế — loop filter là một bộ lọc PI) có hàm truyền closed-loop chuẩn:

H(s)=2ζωns+ωn2s2+2ζωns+ωn2H(s) = \frac{2\zeta\omega_n s + \omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}

Giả sử mình đang thiết kế với ωn=2π×100kHz628300 rad/s\omega_n = 2\pi \times 100\,\text{kHz} \approx 628300\ \text{rad/s} (tức fn=100f_n = 100 kHz) và ζ=0.707\zeta = 0.707 (giá trị kinh điển — cân bằng giữa tốc độ và overshoot). Bước đầu tiên: tìm pole — giải s2+2ζωns+ωn2=0s^2 + 2\zeta\omega_n s + \omega_n^2 = 0:

s=ζωn±jωn1ζ2=444300±j444300 rad/ss = -\zeta\omega_n \pm j\omega_n\sqrt{1-\zeta^2} = -444300 \pm j\,444300\ \text{rad/s}

Hai pole phức liên hợp, nằm sâu trong LHP (σ=444300<0\sigma = -444300 < 0) → hệ ổn định, có ringing với tần số ωd=ωn1ζ2444300 rad/s\omega_d = \omega_n\sqrt{1-\zeta^2} \approx 444300\ \text{rad/s} (tức khoảng 70.7 kHz).

Bây giờ tính step response — Y(s)=H(s)/sY(s) = H(s)/s, rồi PFD. Đặt ωd=ωn1ζ2\omega_d = \omega_n\sqrt{1-\zeta^2}, sau khi PFD (mình bỏ qua phần đại số chi tiết — kết quả mới là thứ cần nhớ):

y(t)=1eζωnt[cos(ωdt)ζ1ζ2sin(ωdt)]y(t) = 1 - e^{-\zeta\omega_n t}\left[\cos(\omega_d t) - \frac{\zeta}{\sqrt{1-\zeta^2}}\sin(\omega_d t)\right]

Thay số vào — với ζ=0.707\zeta = 0.707 thì ζ/1ζ21\zeta/\sqrt{1-\zeta^2} \approx 1:

y(t)1e444300t[cos(444300t)sin(444300t)]y(t) \approx 1 - e^{-444300\, t}\left[\cos(444300\,t) - \sin(444300\,t)\right]

Đọc con số này ra thành ngôn ngữ thiết kế:

  • Settling time (về trong ±2% của giá trị cuối): công thức xấp xỉ 4/(ζωn)9.0 μs4/(\zeta\omega_n) \approx 9.0\ \mu\text{s}; tính chính xác từ y(t)y(t) ở trên thì zero làm settle nhanh hơn chút — ~7.8 µs (≈ 4.9/ωn4.9/\omega_n).
  • Overshoot: ~21% — và đây là chỗ dễ bẫy: con số này không phải 4.3%4.3\% của hệ bậc 2 all-pole (chỉ có pole, không zero). Zero ở tử số (tại ωn/2ζ-\omega_n/2\zeta) gây peaking: chính y(t)y(t) phía trên đạt đỉnh ~1.21. Type-II PLL luôn overshoot nhiều hơn prototype không zero — đừng dùng công thức eπζ/1ζ2e^{-\pi\zeta/\sqrt{1-\zeta^2}} ở đây.
  • Tần số ringing: fd=ωd/2π70.7 kHzf_d = \omega_d / 2\pi \approx 70.7\ \text{kHz} — nếu nhìn trên scope, mình sẽ thấy dao động tắt dần với chu kỳ khoảng 14 μs14\ \mu\text{s}.

Nếu đổi ζ\zeta xuống 0.30.3 (loop filter “lỏng” hơn), overshoot nhảy vọt lên ~45%, ring rất mạnh và settle lâu (~21 µs) — dễ làm VCO bị kéo méo. Ngược lại ζ=1.2\zeta = 1.2 (overdamped) thì hết dao động (ring), nhưng zero vẫn để lại overshoot ~10% (một bướu vọt lố, không phải dao động) và settling (~8.9 µs) không nhanh hơn vùng ζ0.7\zeta \approx 0.7 (~7.8 µs). Settling đạt nhanh nhất quanh ζ0.7\zeta \approx 0.7 — đây chính là trade-off mà engineer phải cân khi chọn RR, CC của loop filter.

Thử kéo thanh trượt ζ\zeta trong tool dưới đây để cảm nhận trực tiếp — chú ý xem pole di chuyển trên s-plane thế nào khi overshoot thay đổi:

Tool tương tác — kéo thử để cảm nhận

Kéo hai thanh trượt để di chuyển pole trên mặt phẳng s — quan sát dạng sóng e^(σt)·cos(ωt) phản ứng tương ứng.

Ổn định (decay)

Pole tại s = -1.20 + j2.0. σ < 0 → bao hình co lại theo thời gian, hệ thống tự ổn định.

ReIm0××t = 0t = 6 s

Đường nét đứt = bao hình eσt — chính là thứ σ điều khiển.

5. Bài học cho thiết kế loop filter

Từ ví dụ trên, rút ra vài nguyên tắc thực dụng:

Bài học 1: ζ\zeta không phải con số trừu tượng — nó là núm vặn giữa “nhanh nhưng ring” và “êm nhưng chậm”. Với hầu hết ứng dụng PLL tổng quát, ζ0.707\zeta \approx 0.707 là điểm khởi đầu hợp lý; với clock recovery cần ổn định cao, người ta thường kéo lên ζ1\zeta \approx 1.

Bài học 2: Vị trí pole trên s-plane là “X-quang” của hệ thống — không cần chạy simulation, chỉ cần nhìn σ\sigmaω\omega của pole là đoán được decay rate và tần số ring. Khi debug PLL bị ring quá mức, việc đầu tiên nên làm là tính lại pole, xem σ\sigma có đủ âm (đủ sâu trong LHP) không.

Bài học 3: ωn\omega_n quyết định “thước đo thời gian” của cả hệ — tăng ωn\omega_n (bằng cách tăng gain loop KK) thì mọi thứ nhanh lên theo cùng tỉ lệ, kể cả ringing. Đây là lý do tăng bandwidth PLL không phải lúc nào cũng tốt — nó cũng khuếch đại các thành phần nhiễu tần số cao đi qua.

6. Tổng kết

  • Pole quyết định ổn định và tốc độ (qua real part σ\sigma) và tần số dao động (qua imaginary part ω\omega); zero định hình lại đáp ứng nhưng không quyết định sống-chết.
  • Step response = impulse response tích phân theo thời gian; trong Laplace chỉ là nhân thêm 1/s1/s — và đây là thước đo thực dụng nhất để đánh giá tốc độ lẫn độ ổn định.
  • PFD là kỹ năng cốt lõi: biến H(s)H(s) phức tạp thành tổng các dạng sóng cơ bản đã biết — một khi quen, nhìn H(s)H(s) là đoán được dạng sóng.
  • Với PLL bậc 2, ζ\zetaωn\omega_n là hai núm vặn chính: ζ\zeta kiểm soát overshoot/ringing, ωn\omega_n kiểm soát tốc độ tổng thể (và cả độ nhạy với nhiễu).

Ở bài tiếp theo, mình sẽ đi tiếp với PLL bậc cao hơn — khi PFD bằng tay không còn khả thi nữa, và phải chuyển sang state-space + numerical methods, rồi dùng root locus để thiết kế loop filter một cách có hệ thống thay vì dò mò.

Tham khảo

  • Razavi, RF Microelectronics, chương về PLL — trình bày rõ quan hệ giữa ζ\zeta, ωn\omega_n và đáp ứng bậc 2, là nền tảng cho mọi phân tích PLL phía sau.
  • Best, Phase-Locked Loops: Design, Simulation, and Applications — sách chuẩn cho ai muốn đi sâu vào thiết kế loop filter thực tế, có nhiều ví dụ số cụ thể giống cách mình trình bày ở trên.
  • Nise, Control Systems Engineering, chương Time Response — nguồn tham khảo tốt cho phần PFD và bảng tra Laplace transform, trình bày theo hướng dễ tiếp cận cho người mới.