Open loop stability: Bode - Pole zero plot mismatch

11 ビュー (過去 30 日間)
AC90
AC90 2018 年 4 月 22 日
回答済み: Paul 2024 年 12 月 8 日
I'm analyzing open loop stability of an amplifier. Plotting the bode diagram I can see a negative phase margin (PM) indicating the system is not stable. When I plot the pole/zero plot however all the poles still remain on the left half plane. See attached figure. Note that instability results due to the 3rd zero crossing where the PM is negative. I do not understand why the complex poles have not shifted to right half plane (RHP). Using SPICE however I can observe these poles locating to RHP. How come this cannot be observed in matlab? While this is very likely because the model in Matlab is just a simplification, I do not understand how the bode plot can show a negative PM while the poles reside within LHP. Any thoughts?
  3 件のコメント
Aquatris
Aquatris 2018 年 8 月 16 日
編集済み: Aquatris 2018 年 8 月 16 日
If you are referring to the ~-45 degree in the phase plot, it is not the phase margin. It is just the phase of the system. Phase margin is how much phase change is necessary for the magnitude 1 to become (-1 + 0i), which is equivalent to having a phase of 180. So if the systems phase is -45 degrees with magnitude of 1, it means the phase margin is 135 degrees.
Use the Matlab command "margin()" to calculate the margins.
AC90
AC90 2018 年 8 月 16 日
That is incorrect. Your definition of the phase margin is wrong. It's not where the phase is 180 degrees, rather where the total phase shift is 180 degrees. So, for an inverting system, for instance, a phase of 0 degrees at 0db means the total phase shift is 180. If it's a noninverting system, the total phase shift would be 0.
In this specific case here, it's an inverting system (the low frequencies are not shown in the plot, at dc the phase is 180 degrees). The phase margin at the 3rd 0db crossing is beyond 180 degrees.

サインインしてコメントする。

採用された回答

Arkadiy Turevskiy
Arkadiy Turevskiy 2018 年 8 月 17 日
編集済み: Arkadiy Turevskiy 2018 年 8 月 17 日
You did not post your system, so it is a bit hard to figure out what is going on, especially when you say that you see poles moving to RHP in Spice.
Going purely on the plots you provided (poe zero map primarily) I tried to construct a model that would create similar plots.
sys=zpk([2.4*10^9*j -2.4*10^9*j], [-0.0000001 -11.5*10^7+1.2*10^9*j -11.5*10^7-1.2*10^9*j],-100000000);
subplot(121);bode(sys);grid;
subplot(122);pzmap(sys);
xlim([-1.5e+8 2e+7]);
The first subplot shows full bode plot. If you focus on the region you are looking at, you will see similar plot to what you show:
subplot(121); bode(sys, {1e+9*0.1034 1e+9*2.8278}); grid;
Now if you zoom in bode plot magnitude that looks similar to your plot.
If you do
allmargin(sys)
you will see phase margins at first two crossovers are negative and phase margin at 3rd crossover is positive.
If you do
isstable(sys)
you will see the system is stable because all poles are in the left half plane, even though one of them is essentially at the origin.
Bottom line: even though you see negative phase margins, this system is stable, as all poles lie in the LHP. Hope this helps.
  1 件のコメント
AC90
AC90 2018 年 8 月 27 日
Arkadiy, thank you for your effort. To correct one thing, let me retract my previous comment on RHP poles in SPICE. I took a look at it again and there were no RHP poles. The system is in fact unstable when connected in a feedback configuration due to the negative phase margin. But the bode plot is of the open loop case hence in that mode the system is in fact stable.

サインインしてコメントする。

その他の回答 (1 件)

Paul
Paul 2024 年 12 月 8 日
Use the open-loop system developed by @Arkadiy Turevskiy in this comment
sys=zpk([2.4*10^9*j -2.4*10^9*j], [-0.0000001 -11.5*10^7+1.2*10^9*j -11.5*10^7-1.2*10^9*j],-100000000);
The open-loop system is stable as all of its poles are in the open, left-half-plane
format short e
pole(sys)
ans =
-1.0000e-07 + 0.0000e+00i -1.1500e+08 + 1.2000e+09i -1.1500e+08 - 1.2000e+09i
Assuming unity, negative feedback, the closed-loop system is unstable. We can determine that this is true in one of two ways. We can apply the Nyquist criteria based on the Nyquist plot of the open-loop system, or we can compute the closed-loop poles and determine where they are located in the complex plane. The fact that the open-loop system has "negative phase margins" as returned from allmargin is, in general, not a criterion for determining closed-loop stability, i.e., a stable, closed-loop system can have negative phase margin (and negative gain margin for that matter).
To apply the Nyquist criteria we have to determine two things: the number (P) of unstable poles of the open-loop system, and the number of clockwise encirclements (N) of the -1 point of the Nyquist plot of the open-loop system. Then, the number unstable, closed-loop poles (Z), is determined by: N = Z - P.
We've already seen above that P = 0, hence, the number of unstable, closed-loop, poles is the same as number of clockwise encirclements of the -1 point.
The Nyquist plot of the open-loop system is
figure
nyquistplot(sys)
We have to zoom in around the origin to see what's happening there
w = linspace(1e7,3e8,5000)*2*pi;
figure
nyquistplot(sys,w),grid,axis equal
Based on those two plots, it is apparent that the Nyquist plot encircles the the -1 point one time (N = 1), hence we must have one unstable, closed-loop pole, which is, in fact, the case.
pole(feedback(sys,1))
ans =
-2.4224e+08 + 1.2515e+09i -2.4224e+08 - 1.2515e+09i 3.5447e+08 + 0.0000e+00i
Now that we have established that the closed-loop system is unstable, we are in position to interpret the results from allmargin
m = allmargin(sys)
m = struct with fields:
GainMargin: 2.5230e-16 GMFrequency: 0 PhaseMargin: [-9.4602e+01 -1.2146e+02 1.5261e+02] PMFrequency: [4.4067e+08 1.0321e+09 1.2666e+09] DelayMargin: [0 0 2.1030e-09] DMFrequency: [4.4067e+08 1.0321e+09 1.2666e+09] Stable: 0
The last field ('Stable') tells us that the closed-loop system is unstable, which we already knew. The phase margins only tell us how much the phase of the open-loop system has to change to rotate its Nyquist plot to touch the -1 point and change the number of encirclements. Here is the Nyquist plot after applying a bit more than the phase margin to the open-loop system
figure
nyquistplot(sys*exp(1j*-m.PhaseMargin(1)*1.0001*pi/180),[-flip(w) w]),axis equal
Now N = 0, so the closed-loop system is stable (I think the pole with Re(s) = -9.1e4 would be considered "close" to the imaginary axis for how this system is scaled).
pole(feedback(sys*exp(1j*-m.PhaseMargin(1)*1.0001*pi/180),1))
ans =
-9.0996e+07 - 1.3188e+09i -1.4695e+08 + 9.7784e+08i -9.7197e+04 + 4.4065e+08i
Now let's look at adding the phase indicated by the second phase margin
figure
nyquistplot(sys*exp(1j*-m.PhaseMargin(2)*1.0001*pi/180),[-flip(w) w]),axis equal
Now we're back to N = 1, so the closed-loop system has one unstable pole
pole(feedback(sys*exp(1j*-m.PhaseMargin(2)*1.0001*pi/180),1))
ans =
-4.6128e+07 - 1.3036e+09i 3.5674e+04 + 1.0321e+09i -2.3611e+08 + 3.5678e+08i
Doing the same for the third "phase margin"
figure
nyquistplot(sys*exp(1j*-m.PhaseMargin(3)*1.0001*pi/180),[-flip(w) w]),axis equal
Now we have N = 2, so we have two unstable, closed-loop poles
pole(feedback(sys*exp(1j*-m.PhaseMargin(3)*1.0001*pi/180),1))
ans =
2.7788e+04 + 1.2665e+09i 4.0793e+07 - 1.1423e+09i -3.5962e+08 - 1.7024e+08i
In summary: The open-loop system is stable. The closed-loop system is unstable. The "margins" returned by allmargin only tell us how much the gain or phase, for positive frequencies (if the system has real coefficients) needs to change (assuming unity, negative feedback) in order to change the number of encirclements of the -1 point. If the closed-loop system is stable, then those "margins" are truly margins, i.e., they tell us how much the gain or phase of the open-loop system has to change, which could increase or decrease, to induce instability of the closed-loop system. But, if the closed-loop system is unstable, then the effect of those "margins" have to be interpreted in terms of how they change the number of encirclements of the -1 point and the number of unstable, open-loop poles.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by