diff --git a/lib/ControlSystemsBase/src/pid_design.jl b/lib/ControlSystemsBase/src/pid_design.jl index 81c0bbd52..6e75ab45b 100644 --- a/lib/ControlSystemsBase/src/pid_design.jl +++ b/lib/ControlSystemsBase/src/pid_design.jl @@ -68,7 +68,7 @@ function pid_tf(param_p, param_i, param_d=zero(typeof(param_p)); form=:standard, else if Ki == 0 if filter_order == 1 - tf([Kd*Tf + Kd, Kd], [Tf, 1]) + return tf([Kd + Kp*Tf, Kp], [Tf, 1]) else return tf([Kd, Kp], [Tf^2/(4d^2), Tf, 1]) end diff --git a/lib/ControlSystemsBase/test/test_pid_design.jl b/lib/ControlSystemsBase/test/test_pid_design.jl index 4bab4aeea..0e30c5438 100644 --- a/lib/ControlSystemsBase/test/test_pid_design.jl +++ b/lib/ControlSystemsBase/test/test_pid_design.jl @@ -77,6 +77,13 @@ Ctf = pid(1.1, 1.2, 0, Tf=0.1, filter_order=1) Css = pid(1.1, 1.2, 0, Tf=0.1, filter_order=1, state_space=true) @test freqresptest(Ctf, Css) < 1e-10 +# Regression for #1058: pid_tf for Ki=0 and filter_order=1 used to emit +# tf([Kd*Tf + Kd, Kd], [Tf, 1]) — Kp dropped and replaced with Kd. +Ctf = pid(1.1, 0, 1.5, Tf=0.1, filter_order=1, form=:parallel) +Css = pid(1.1, 0, 1.5, Tf=0.1, filter_order=1, form=:parallel, state_space=true) +@test freqresptest(Ctf, Css) < 1e-10 +@test Ctf ≈ tf([1.5 + 1.1*0.1, 1.1], [0.1, 1]) + # bodeplot([Ctf, Css])