完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、位置式PID
按照模拟PID控制算法,以一系列采样时刻点KT代替连续时间t,用矩形法数值积分代替积分,以一阶向后差分代替微分。 1、一系列采样时刻点KT代替连续时间t 2、用矩形法数值积分代替积分 3、以一阶向后差分代替微分 最后可得离散化的PID表达式 式中T为采样时间(采样周期) %设一被控对象G(s)=523500/(s^3+87.35s^2+10470S) %采样时间为1ms,采用z变换进行离散化 clc clear ts=0.001; %采样时间 sys=tf(523500,[1 87.35 10470 0]); %tf是传递函数 即被控对象函数G(); dsys=c2d(sys,ts,'z'); %把控制函数离散化取Z变换n阶定常离散系统差分方程 %在零初始条件下取Z变换: %dsys即Y(z)/U(z) [num,den]=tfdata(dsys,'v');% 离散化后提取分子、分母 u_1=0.0; u_2=0.0; u_3=0.0; %z变换之后的系数 y_1=0.0; y_2=0.0; y_3=0.0; x=[0,0,0]'; %分别误差e,误差e的差分,误差e的积分 error_1=0; %上一时刻误差 time=zeros(1,1000); %预分配内存 yd=zeros(1,1000); u=zeros(1,1000); y=zeros(1,1000); error=zeros(1,1000); for k=1:1:1000 time(k)=k*ts;%离散化的时间代表连续时间 yd(k)=1.0;%目标量 kp=0.5; ki=0.001; kd=0.001; u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID输出 if u(k)>=10 u(k)=10; end if u(k)<=-10 u(k)=-10; end %Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。 y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3; %实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。 error(k)=yd(k)-y(k); % 误差=输入-输出 u_3=u_2; u_2=u_1; %保存上上次输入 为下次计算 u_1=u(k); %保存上一次控制系数 为下次计算 y_3=y_2; y_2=y_1; %保存上上次次输出 为下次计算 y_1=y(k); %保存上一次输出 为下次计算 x(1)=error(k); %KP的系数 x(2)=(error(k)-error_1)/ts; %KD的系数 x(3)=x(3)+error(k)*ts; %KI的系数 error_1=error(k); end figure(1); plot(time,yd,'b',time,y,'r'); %输入和实际控制输出 xlabel('time(s)'),ylabel('y,yd'); title('输入/输出图像对比') figure(2); plot(time,error,'r') %时间误差输出曲线 xlabel('time(s)');ylabel('error'); title('误差变化') 二、增量式P u(k+1)=u(k)+ %设一被控对象G(s)=400/(s^2+50s) %采样时间为1ms,采用z变换进行离散化 clc clear ts=0.001;%采样时间 sys=tf(400,[1 50 0]); dsys=c2d(sys,ts,'z');%采用z变换进行离散化 %把控制函数离散化取Z变换n阶定常离散系统差分方程 %在零初始条件下取Z变换: %dsys即Y(z)/U(z) [num,den]=tfdata(dsys,'v');%强制tfdata直接将分子和分母作为行向量而不是单元格数组返回 u1=0;u2=0;u3=0;%z变换之后的系数 y1=0;y2=0;y3=0; x=[0 0 0]';%分别误差e,误差e的差分,误差e的积分 error1=0; error2=0; time=zeros(3000,1);%与分配内存 yd=zeros(3000,1); u=zeros(3000,1); y=zeros(3000,1); for k=1:1:3000 time(k)=k*ts;%离散化的时间代表连续时间 yd(k)=1.0;%目标量 kp=8; ki=0.10; kd=10; u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID输出 u(k)=u1+u(k); if u(k)>=10 u(k)=10; end if u(k)<=-10 u(k)=-10; end %难点就是把传递函数转化为差分方程,以实现PID控制 y(k)=-den(2)*y1-den(3)*y2+num(2)*u1+num(3)*u2; %离散表达式输出 %如果传感器发生故障,u(k)发生大幅度变化,引起输出的变化 error=yd(k)-y(k);%误差=输入-输出 u1=u(k);u2=u1;u3=u2; y1=y(k);y2=y1;y3=y2; x(1)=error-error1; x(2)=error-2*error1+error2; x(3)=error; error2=error1; error1=error; end figure(1); plot(time,yd,'r',time,y,'k','linewidth',2); xlabel('time(s)'); ylabel('yd,y'); legend('Ideal Position value','tracking position value'); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1877 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1661 浏览 1 评论
1145 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
760 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
789浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
612浏览 3评论
629浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
590浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-12 02:53 , Processed in 0.732980 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号
|