pr控制C语言程序,PR控制(含代码)
`转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控制(含代码)相关推荐
- c语言程序流程控制(下)
c语言程序流程控制 嵌套 switch分支结构 语法 例题 switch细节 练习 switch与if语句的比较 循环控制 for循环 练习题 while循环控制 do while 循环 多重循环控制 ...
- c语言程序电机,直流电机控制C语言程序
直流电机控制C语言程序 /***********************************************************************/ /************* ...
- 动图图解C语言插入排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;
跪求,8255控制数码管,单片机c语言程序: 答案:3 信息版本:手机版 解决时间 2021-04-29 04:56 已解决 2021-04-28 12:39 8255 PA口--数码管的段选,82 ...
- dac0832三角波c语言程序,单片机控制DAC0832输出正弦波三角波汇编程序
org 0000h LJMP MAIN ORG 0003H LJMP L0 MAIN:MOV R2,#0aH ;调幅倍数 MOV R4,#01H ...
- c 语言程序流程控制应用实验报告,程序流程控制实验报告.doc
.net程序设计实验报告 2011年 11 月 19日 学 号1008114082姓 名左雪敬时 间下午7-8节专 业计算机科学与技术班 级10级2班实验题目: 程序流程控制实验目的: 1:掌握常量和 ...
- 直流电机c语言驱动程序,直流电机的控制C语言程序
关于直流电机的加速减速和正反转C语言程序 直流电机正反转.加速.减速程序 (基于L298n驱动芯片 ) #include #define uchar unsigned char #define uin ...
- 51单片机蜂鸣器演奏《小苹果》C语言程序,单片机控制蜂鸣器演奏音阶实例
单片机可以控制蜂鸣器发声音 蜂鸣器是非常常见的发音元器,音乐卡.报警装置.电子琴.各种小家电等都会用到.单片机的PWM功能可以设置输出不同频率的信号,所以我们可以利用单片机的PWM控制三极管的通断来推 ...
- 路灯控制C语言程序,PT2007C 智能路灯控制系统
PT2007C 智能路灯控制系统 智能路灯控制系统巨川电气是基于计算机技术.自动控制.网络通信.现场总线,嵌入式软件等多方面技术组成的分布式控制管理系统,来实现照明设备智能化集中管理和控制,具有定时控 ...
- ----流程控制-条件控制/循环控制\错误控制/程序终止控制
----------流程控制 1 条件控制 if/elseif 语句 可以有选择的运行程序块 . switch/case 表达式是值有多个不同,有多个选择的时候. 编辑器 function m ...
最新文章
- BZOJ 1003: [ZJOI2006]物流运输trans
- linux设置逻辑卷进不了图形界面,LVM逻辑卷管理器图形界面操作
- Cpp 对象模型探索 / 系列文章的索引
- Entity Framework升级
- jenkins 新手入门安装失败_树莓派安装jenkins,安安静静做个持续集成打包机
- IDEA 热部署 仅支持jdk1.6,1.7
- 跳一跳python_微信跳一跳python怎么刷分?跳一跳python怎么使用?
- mysql中常见错误代码汇总
- c语言文件读入到链表函数fscanf,【求解答】c关于把文件数据放进链表,并将链表遍历...
- 音阶频率对照表_八度音阶和频率的关
- 金刚石结构的各向异性
- gl linux qt 库_Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)
- Response.WriteFile 无法下载大文件解决方法
- Windows杀死端口进程
- JS函数curry(柯里化)
- c语言表达式(a b)的值,C语言中,假设所有变量均为整型,表达式(a=5,b=2,++a,b++,a+ - 问答库...
- 多媒体计算机探索 教案,浅论关于多媒体教学的思考和探索
- 《区块链:定义未来金融与经济新格局》摘抄笔记
- 八种常用激光雷达和视觉SLAM算法的评估与比较
- 脚本图片循环识别执行可设置热键
热门文章
- Vulnhub Typhoon-v1.02提权
- php的seeder是什么,laravel利用seeder实现数据表中填充数据
- Exchange高危0day漏洞 -- 直接拿下你的域控和服务器 -- 立即行动!CVE-2021-26855
- 【小白福利—初级DBA入门必看】MySQL常用工具介绍(八)——客户端工具MySQL_import
- vue随笔之二类型判断一
- 网络地址转换--PAT配置
- loj 1224 - DNA Prefix
- Qt 3D 官方实例1 simple-qml
- Debian搭建PPTP
- 【历史上的今天】4 月 3 日:亚马逊卖出第一本书;世界上第一通手机电话;IBM 计算机先驱出生