深入浅出PID控制算法(二)——PID算法离散化和增量式PID算法原理及Matlab实现

GitHub 微信公众号 知乎 B站 CSDN

引言

上篇介绍了连续系统的PID算法,但是计算机控制是一种采样控制,他只能根据采样时刻的偏差来计算控制量,因此计算机控制系统中,必须对公式进行离散化,具体就是用求和代替积分,用向后差分来代替微分,使模拟PID离散化为数字形式的差分方程。

1 准备工作

在采样周期足够小时,可以作如下近似:
在这里插入图片描述式中

  • T————为采样周期
  • k————为采样序号,k=0,1,2….

用这种近似方法,可以得到两种形式数字PID控制算法

1.1 位置式PID算法

由前面推倒很容易得到离散化后的表达式
在这里插入图片描述

由此式可以看出数字调节的输出u(k)跟过去的所有偏差信号有关,计算机需要对e(i)进行累加,运算量太大,一般不用,重点说明增量式PID算法。

1.2 增量式PID算法

由于位置式PID的算法不够方便,不仅对偏差进行累加,占用过多的存储单元,而且不方便写程序,所以需要进行一些改进,对位置式取增量,方法如下:
在这里插入图片描述


2 Matlab仿真

分析过程

  1. 对G(s)进行离散化即进行Z变换得到Z传递函数G(Z);
  2. 分子分母除以z的最高次数即除以z的最高次得到;
  3. 由z的位移定理Z[e(t-kt)]=z^k*E(z)逆变换得到差分方程;
  4. PID编程实现

具体实现细节在代码注释中已经给出

    %设一被控对象G(s)=50/(0.125s^2+7s),  
    %用增量式PID控制算法编写仿真程序  
    %(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-3,3],  
    %  仿真曲线包括系统输出及误差曲线)。  

    ts=0.001;                 %采样时间  
    sys=tf(50,[0.125,7, 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;  
    y_1=0.0;  
    y_2=0.0;  
    x=[0,0,0]';  
    error_1=0;  
    error_2=0;  
    %核心代码

    for k=1:1:1000  
    time(k)=k*ts;                        %采样次数  
    S=1;  
    if S==1                              %阶跃输入
        kp=6.5;ki=0.1;kd=1;              %初始化PID    
        rin(k)=1;                        %Step Signal   
    elseif S==2                          %正弦输入
        kp=10;ki=0.1;kd=15;             
        rin(k)=0.5*sin(2*pi*k*ts);       %Sine Signal 即实际输入      
    end 

    du(k)=kp*x(1)+kd*x(2)+ki*x(3);       %PID Controller   控制系数    
    u(k)=u_1+du(k);                      %真正的PID输出应该为du+前一时刻的输出
    if u(k)>=3         
       u(k)=3;  
    end  
    if u(k)<=-3  
       u(k)=-3;  
    end  

    %Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。 
    yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;          %实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。
    error(k)=rin(k)-yout(k);                        % 误差=输入-输出 
    u_2=u_1;                                        %保存上上次输入   为下次计算  
    u_1=u(k);                                       %保存上一次控制系数   为下次计算  
    y_2=y_1;                                        %保存上上次次输出   为下次计算  
    y_1=yout(k);                                    %保存上一次输出   为下次计算  

    x(1)=error(k)-error_1;                          %KP的系数  
    x(2)=error(k)-2*error_1+error_2;                %KD的系数  
    x(3)=error(k);                                  %KI的系数
    error_2=error_1;                                %上次的变上上次误差
    error_1=error(k);                               %这次的变上次的误差
    end 


    figure(1);  
    plot(time,rin,'b',time,yout,'r');               %输入和实际控制输出  
    xlabel('time(s)'),ylabel('rin,yout');   
   figure(2);  
    plot(time,error,'r')                            %时间误差输出曲线  
    xlabel('time(s)');ylabel('error'); 

2.1 仿真效果(PID调参后)

在这里插入图片描述
在这里插入图片描述

2.2 调参过程

  • Step 1
    确定比例系数Kp

    确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为

    纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。

  • Step 2
    确定积分时间常数Ti

    比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。

  • Step 3
    确定微分时间常数Td;
    微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。

  • Step 4
    系统空载、带载联调;
    对PID参数进行微调,直到满足性能要求。

2.3 Simulink仿真部分

这里使用Simulink仿真也非常的方便,只需要设定好PID控制器的参数和传递函数即可
在这里插入图片描述
这里注意Filter coefficient这个参数起前向滤波作用,这里取得1
在这里插入图片描述

微分环节的缺点,就是误差e变化微弱的时候,如果D过大会产生过大的修正量,导致震动不但不减小反而扩大。
滤波器的作用就是滤除高频修正,使D更好用,说白了是一个改进型

在这里插入图片描述

在这里插入图片描述

运行后双击示波器查看结果
在这里插入图片描述
在这里插入图片描述

3 结论

(1)对于PID 参数采用 MATLAB 进行整定和仿真,使用起来不仅快捷、方便,而且更为直观,同时也避免了传统方法反复修改参数调试。
  (2)系统的响应速度会随Kp值的增大而加快,同时也有助于静差的减小,而Kp值过大则会使系统有较大超调,稳定性变坏;此外,系统的动作会因为过小的Kp值减慢。
  (3)超调的减小、振荡变小以及系统稳定性的增加都取决于积分时间Ti的增大,但是系统静差消除时间会因为Ti的增大而变长。
  (4)增大微分时间Td对于系统的稳定性、系统响应速度的加快以及系统超调量的减小都会有所帮助。但是如果Td过大,则会使得调节时间较长,超调量也会增大;如果Td过小,同样地也会发生以上状况。
  (5)总之PID 参数的整定必须考虑在不同时刻三个参数的作用以及彼此之间的作用关系。

相关Matlab代码和Simulink仿真文件请关注公众号:迈微电子研发社(左侧或下方微信扫码即可)回复“PID算法”,获取免费下载链接

相关阅读

  1. 深入浅出PID控制算法(一)————连续控制系统的PID算法及MATLAB仿真 原文链接:https://blog.csdn.net/Charmve/article/details/104538102
  2. 深入浅出PID控制算法(三)————增量式与位置式PID算法的C语言实现与电机控制经验总结 原文链接:https://blog.csdn.net/Charmve/article/details/104536504
  3. 单片机应用系统课程设计——基于PID的直流电机调速控制系统 原文链接:https://blog.csdn.net/Charmve/article/details/103466831
  4. 2015 年全国电赛题——风力摆控制系统(B 题)原文链接:https://blog.csdn.net/Charmve/article/details/103922460

-END-

知识星球


在这里插入图片描述

△微信扫一扫关注「迈微AI研习社」公众号

在这里插入图片描述

### 增量式PID算法控制电机实现方法 增量式PID算法通过计算当前时刻与前一时刻之间的误差变化来调整控制信号。对于电机控制系统而言,这种算法能够更精确地调节速度或位置。 #### 理论基础 增量式PID控制器的核心在于其输出的是相对于上一次操作量的变化值而非绝对值。这意味着每次更新时只会增加或减少一定的比例,从而使得系统响应更加平稳[^2]。 #### 数学模型 设\( e(k)=r(k)-y(k) \),其中 \( r(k) \) 是设定的目标值(期望转速),而 \( y(k) \) 表示测量得到的实际反馈值(当前转速)。那么,在第 k 步的增量可以表示为: \[ u(k) = K_p[e(k)-e(k-1)] + K_i*e(k)+K_d*[e(k)-2e(k-1)+e(k-2)] \] 这里, - \( u(k) \): 当前步长下的增量; - \( K_p,K_i,K_d \): 比例系数、积分时间常数以及微分时间常数; - \( e(k),e(k-1),e(k-2)\): 不同时间段内的偏差。 此表达式的含义是在每一个新的采样点到来之时,基于最新的三个误差样本计算出一个新的修正项并加到之前的PWM占空比上去形成最终的驱动指令。 #### C语言代码示例 下面给出一段简单的C语言伪代码用于说明如何利用上述原理编写针对PLC平台上的增量型PID控制逻辑: ```c float kp=1.0; // P gain float ki=0.5; // I gain float kd=0.1; // D gain int prev_error = 0; int integral = 0; void pid_control(int setpoint, int measured_value){ static float last_output = 0; int error = setpoint - measured_value; integral += (error * dt); float derivative = (error - prev_error)/dt; float output_change = kp*(error-prev_error) + ki*error*dt +kd*(derivative); float new_output = last_output +output_change ; if(new_output>MAX_OUTPUT)new_output=MAX_OUTPUT; else if(new_output<MIN_OUTPUT)new_output=MIN_OUTPUT; apply_pwm_to_motor(new_output); prev_error = error; last_output=new_output; } ``` 该函数接收目标值`setpoint` 测得的速度 `measured_value`, 计算所需的 PWM 占空比,并将其应用于电机以达到预期效果[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值