`转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语言程序,PR控制(含代码)相关推荐

  1. c语言程序流程控制(下)

    c语言程序流程控制 嵌套 switch分支结构 语法 例题 switch细节 练习 switch与if语句的比较 循环控制 for循环 练习题 while循环控制 do while 循环 多重循环控制 ...

  2. c语言程序电机,直流电机控制C语言程序

    直流电机控制C语言程序 /***********************************************************************/ /************* ...

  3. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  4. 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;

    跪求,8255控制数码管,单片机c语言程序: 答案:3  信息版本:手机版 解决时间 2021-04-29 04:56 已解决 2021-04-28 12:39 8255 PA口--数码管的段选,82 ...

  5. dac0832三角波c语言程序,单片机控制DAC0832输出正弦波三角波汇编程序

    org 0000h LJMP MAIN ORG 0003H LJMP L0 MAIN:MOV R2,#0aH                    ;调幅倍数 MOV R4,#01H          ...

  6. c 语言程序流程控制应用实验报告,程序流程控制实验报告.doc

    .net程序设计实验报告 2011年 11 月 19日 学 号1008114082姓 名左雪敬时 间下午7-8节专 业计算机科学与技术班 级10级2班实验题目: 程序流程控制实验目的: 1:掌握常量和 ...

  7. 直流电机c语言驱动程序,直流电机的控制C语言程序

    关于直流电机的加速减速和正反转C语言程序 直流电机正反转.加速.减速程序 (基于L298n驱动芯片 ) #include #define uchar unsigned char #define uin ...

  8. 51单片机蜂鸣器演奏《小苹果》C语言程序,单片机控制蜂鸣器演奏音阶实例

    单片机可以控制蜂鸣器发声音 蜂鸣器是非常常见的发音元器,音乐卡.报警装置.电子琴.各种小家电等都会用到.单片机的PWM功能可以设置输出不同频率的信号,所以我们可以利用单片机的PWM控制三极管的通断来推 ...

  9. 路灯控制C语言程序,PT2007C 智能路灯控制系统

    PT2007C 智能路灯控制系统 智能路灯控制系统巨川电气是基于计算机技术.自动控制.网络通信.现场总线,嵌入式软件等多方面技术组成的分布式控制管理系统,来实现照明设备智能化集中管理和控制,具有定时控 ...

  10. ----流程控制-条件控制/循环控制\错误控制/程序终止控制

    ----------流程控制 1 条件控制 if/elseif  语句  可以有选择的运行程序块 . switch/case   表达式是值有多个不同,有多个选择的时候. 编辑器 function m ...

最新文章

  1. BZOJ 1003: [ZJOI2006]物流运输trans
  2. linux设置逻辑卷进不了图形界面,LVM逻辑卷管理器图形界面操作
  3. Cpp 对象模型探索 / 系列文章的索引
  4. Entity Framework升级
  5. jenkins 新手入门安装失败_树莓派安装jenkins,安安静静做个持续集成打包机
  6. IDEA 热部署 仅支持jdk1.6,1.7
  7. 跳一跳python_微信跳一跳python怎么刷分?跳一跳python怎么使用?
  8. mysql中常见错误代码汇总
  9. c语言文件读入到链表函数fscanf,【求解答】c关于把文件数据放进链表,并将链表遍历...
  10. 音阶频率对照表_八度音阶和频率的关
  11. 金刚石结构的各向异性
  12. gl linux qt 库_Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)
  13. Response.WriteFile 无法下载大文件解决方法
  14. Windows杀死端口进程
  15. JS函数curry(柯里化)
  16. c语言表达式(a b)的值,C语言中,假设所有变量均为整型,表达式(a=5,b=2,++a,b++,a+ - 问答库...
  17. 多媒体计算机探索 教案,浅论关于多媒体教学的思考和探索
  18. 《区块链:定义未来金融与经济新格局》摘抄笔记
  19. 八种常用激光雷达和视觉SLAM算法的评估与比较
  20. 脚本图片循环识别执行可设置热键

热门文章

  1. Vulnhub Typhoon-v1.02提权
  2. php的seeder是什么,laravel利用seeder实现数据表中填充数据
  3. Exchange高危0day漏洞 -- 直接拿下你的域控和服务器 -- 立即行动!CVE-2021-26855
  4. 【小白福利—初级DBA入门必看】MySQL常用工具介绍(八)——客户端工具MySQL_import
  5. vue随笔之二类型判断一
  6. 网络地址转换--PAT配置
  7. loj 1224 - DNA Prefix
  8. Qt 3D 官方实例1 simple-qml
  9. Debian搭建PPTP
  10. 【历史上的今天】4 月 3 日:亚马逊卖出第一本书;世界上第一通手机电话;IBM 计算机先驱出生