PR控制(含代码)

本文深入探讨比例谐振(PR)控制器的原理及应用,详细分析了PR控制器的参数调节方法,包括Kp、Kr、wc的作用及影响,通过MATLAB代码演示不同参数下控制器的Bode图变化,最后提供了C语言实现的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

`转csdn的‘ xx健’,原文链接如下:
比例谐振PR控制器的学习记录
和博客园里‘Hao的杂货店’的文章。原文链接:
比例谐振的一种实现
写的都蛮好,非常感谢。
再贴一篇百度里的:
比例谐振控制算法分析
下面贴一下我自己改动过的代码,哈哈哈写的比较乱也就我勉强看的懂了。
根据控制理论只是,我们取谐振峰增益衰减到3dB处的频率作为频带宽。也就是增益值为0.707倍。经过推导,可以得到两个频率点的计算公式:
在这里插入图片描述
具体可以见下面那张图。
因此,可以看出,频带宽只和wc有关。
从数学的角度来分析,PR控制器传递函数相当于在PI控制器的传递函数的jw轴上加入了两个闭环极点,这两个极点的频率固定,并且会在此频率上发生谐振,此频率处的增益也会很大。因此PR控制器可以用来跟踪正弦指令信号,从数学的本质上讲,比例谐振控制器中的谐振频率相当于同步旋转的角速度,而传统的PI控制则由于少利用了一个角速度条件,因此系统会出现静态误差。

%s = tf([1, 0], 1) ;%等效于s=tf('s');
s=tf('s');
Kp = 4 ;
Kr = 100 ;
wr = 50 * 2 * pi ;
wi = pi ;
Ki=Kr;
Kd=10

G_PI=Kp+Ki/s;%PI
% bode(G_PI)
% hold on;

G_PR = Kp + Kr * s / (s^2 +  wr^2);%谐振
% bode(G_PR)
% hold on;

G_QPR = Kp +   2*wi * Kr * s / (s^2 + 2* wi * s +  wr^2);%准谐振
% bode(G_QPR)
% hold on;

G_QPRD = Kp + 2*wi * Kr * s / (s^2 + 2* wi * s +  wr^2)+Kd*s;%准谐振微分
% bode(G_QPRD)
% hold on;


%matlab code
%s = tf([1, 0], 1) ;%等效于s=tf('s');
s=tf('s');
Kp = 15 ;
Kr = 2000 ;
wr = 50 * 2 * pi ;
wi = pi ;

G_QPR = Kp + Kr * s / (s^2 +  wr^2)
bode(G_QPR)
hold on;


G_QPR1 = Kp +   wi * Kr * s / (s^2 +  wi * s +  wr^2)
bode(G_QPR1)
hold on;
G_QPR2 = Kp + 0.5* wi * Kr * s / (s^2 + 0.5* wi * s +  wr^2)
bode(G_QPR2)
hold on;
G_QPR3 = Kp + 2 * (2*wi) * Kr * s / (s^2 + 2 * (2*wi) * s +  (wr)^2)
bode(G_QPR3)
hold on;

for alpha=1:0.3:1.9
  G_QPR1 = Kp + alpha* wi * Kr * s / (s^2 + alpha* wi  * s +  wr^2)
bode(G_QPR1)
hold on;  
end
G_PR = Kp + Kr * s / (s^2 + wr^2)
figure
bode(G_PR)
hold on;

在这里插入图片描述
分析PR控制器参数调节以及各个参数对所对控制器的影响。
Kp:谐振控制器在特定的谐振频率处可以获得很大的开环增益,但是在
Kr=256,wi=pi的时候,不同的Kp的PR控制器的bode图:
在这里插入图片描述
不同Kr下的bode图:
在这里插入图片描述
可以看出,当其他因素不变时,Kr增大,系统带宽不变,但控制器的增益会随之增大,且与Kr成正比。
在这里插入图片描述
wc主要是控制系统带宽,当然,更高的带宽会降低系统增益,因此带宽不能过大。
总结一下就是:
wc值的确定,主要与系统截止频率的带宽需求有关;
Kr值的确定,主要是根据系统所需要的峰值增益大小来确定;
Kp的确定,主要是以对比例增益的要求的大小来确定;
C语言实现:
记录一下项目中具体实现时的方法:
首先进行控制参数的初始化:

/************************************************************
**  控制系数初始化
准谐振控制 G(s)=(2*wi*Kr*s)/(s^2+2*wi*s+w0^2);
tustin离散化 G(z)= (4*Kr*Ts*wi*z^2 - 4*Kr*Ts*wi)/((Ts^2*w0^2 + 4*wi*Ts + 4)*z^2 + (2*Ts^2*w0^2 - 8)*z + Ts^2*w0^2 - 4*wi*Ts + 4)
系数:
b0 = (4*Kr*Ts*wi)/(Ts^2*w0^2 + 4*wi*Ts + 4);
b2 = -b0;
a1 = (2*Ts^2*w0^2 - 8)/(Ts^2*w0^2 + 4*wi*Ts + 4);
a2 = (Ts^2*w0^2 - 4*wi*Ts + 4)/(Ts^2*w0^2 + 4*wi*Ts + 4);
其中,wi=1.5*pi;
************************************************************/
		EpsVoltCon_Reg.f32VoltCoff.a1 = -1.999439;//-1.9995648;
		EpsVoltCon_Reg.f32VoltCoff.a2 = 0.9996859;//0.9998115;
		EpsVoltCon_Reg.f32VoltCoff.b0 = 0.06020359;//0.04020359		// gain=256     wi = 1.5pi Ts= 1/20k
		EpsVoltCon_Reg.f32VoltCoff.b1 = 0;
		EpsVoltCon_Reg.f32VoltCoff.b2 = -0.06020359;//-0.04020359       //  改变Kr时改变b0和b2就可以,且正比关系;


PR控制器:

/* 计算R控制器 */
#define CNTL_RC_F_C(v, c, x)			\
	v.errn2 = v.errn1;			\
	v.errn1 = v.err;			\
	v.err = x;					\
	\
	v.outn2 = v.outn1;		\
	v.outn1 = v.out;		\
	v.out = (c.b0 * v.err + c.b2 * v.errn2)		\
				- (c.a1 * v.outn1 + c.a2 * v.outn2);

具体实现:

			// PR控制
			CNTL_RC_F_C(	EpsVoltCon_Reg.f32VoltCNTL,
										EpsVoltCon_Reg.f32VoltCoff,
										EpsVoltCon_Reg.f32VoltInstant_Ref - (ADValue.f32VINV));

加比例环节:

			CNTL_RC_F_C(	EpsVoltCon_Reg.f32VoltCNTL,
										EpsVoltCon_Reg.f32VoltCoff,
										EpsVoltCon_Reg.f32VoltInstant_Ref - (ADValue.f32VINV));
//			EpsVoltCon_Reg.f32PIOut += (EpsVoltCon_Reg.kvp + EpsVoltCon_Reg.kvi) * EpsVoltCon_Reg.f32VoltCNTL.err
//																- EpsVoltCon_Reg.kvp * EpsVoltCon_Reg.f32VoltCNTL.errn1;
			EpsVoltCon_Reg.f32PIOut = (EpsVoltCon_Reg.kvp) * EpsVoltCon_Reg.f32VoltCNTL.err;

			EpsVoltCon_Reg.f32CurrRef = EpsVoltCon_Reg.f32PIOut + EpsVoltCon_Reg.f32VoltCNTL.out;

上述是直接根据离散化的方法来进行离散化,还有一种方法是可以将比例谐振控制器拆分成简单的积分组合,引进中间变量,以便于算法实现:
在这里插入图片描述

### PR 控制器的 C 语言实现 比例谐振 (Proportional Resonant, PR) 控制器是一种用于控制交流信号系统的控制器,广泛应用于电力电子领域。其核心思想是通过比例项和共振项来调节系统响应。以下是基于离散时间模型的一个简单 PR 控制器的 C 实现。 #### 离散化 PR 控制器公式 PR 控制器可以表示为以下形式: \[ u(k) = K_p e(k) + \frac{K_r}{T} \int_{0}^{k} e(i) \sin(\omega T_s i) di \] 其中 \( K_p \) 是比例增益,\( K_r \) 是谐振增益,\( T_s \) 是采样周期,\( \omega \) 是目标频率[^3]。 为了便于计算,在实际应用中通常采用梯形积分法近似求解积分部分。 #### C 代码实现 下面是一个简单的 PR 控制器的 C 代码实现: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 #define KP 1.0 // Proportional gain #define KR 0.5 // Resonant gain #define TS 0.001 // Sampling time (seconds) #define OMEGA (2 * PI * 50) // Target frequency (rad/s) typedef struct { double prev_error; double integral_term; } pr_controller_t; void init_pr(pr_controller_t *controller) { controller->prev_error = 0.0; controller->integral_term = 0.0; } double calculate_pr_output(double error, pr_controller_t *controller) { double proportional_term = KP * error; // Update the resonant term using trapezoidal integration approximation double sin_value = sin(OMEGA * TS); double new_integral_part = controller->integral_term + ((error + controller->prev_error) / 2.0) * sin_value * TS; double resonant_term = (KR / TS) * new_integral_part; // Store current values for next iteration controller->prev_error = error; controller->integral_term = new_integral_part; return proportional_term + resonant_term; } int main() { pr_controller_t controller; init_pr(&controller); double setpoint = 1.0; // Desired value double process_variable = 0.0; // Current system output double control_signal; for (int k = 0; k < 1000; ++k) { // Simulate 1 second with sampling rate defined by TS double error = setpoint - process_variable; control_signal = calculate_pr_output(error, &controller); // Example update rule for a simple first-order plant model process_variable += control_signal * TS; printf("Time: %.3f s, Control Signal: %.6f, Process Variable: %.6f\n", k * TS, control_signal, process_variable); } return 0; } ``` 此代码定义了一个结构体 `pr_controller_t` 来存储必要的状态变量,并实现了初始化函数 `init_pr()` 和输出计算函数 `calculate_pr_output()`。程序模拟了一秒钟内的控制系统行为并打印每一步的结果。 #### 关键点解释 - **比例项**:由当前误差乘以比例增益得到。 - **谐振项**:利用梯形法则近似积分,并结合正弦波调制完成。 - **参数调整**:根据具体应用场景设置合适的 \( K_p \), \( K_r \),以及目标角频率 \( \omega \)[^3]。 #### 注意事项 在嵌入式环境中部署该算法时需注意浮点运算性能开销较大;如果硬件资源有限,则可能需要考虑定点数替代方案或者优化现有逻辑减少不必要的操作次数。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值