精华内容
下载资源
问答
  • 增量pid
    万次阅读 多人点赞
    2020-10-27 16:09:57

    1、P - 比例部分

    比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。

    2、I - 积分部分

    从积分部分的数学表达式可以知道, 只要存在偏差, 则它的控制作用就不断的增加; 只有在偏差e(t)=0时, 它的积分才能是一个常数,控制作用才是一个不会增加的常数。 可见,积分部分可以消除系统的偏差。

    积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。

    当 Ti 较小时, 则积分的作用较强,这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定Ti 。

    3、D - 微分部分

    实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可在 PI 控制器的基础上加入微分环节,形成 PID 控制器。

    微分环节的作用使阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入, 将有助于减小超调量, 克服振荡, 使系统趋于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。

    位置式PID:△u(k)=Kp * e(k)+Ki / T * ∫ e(k) dt+Kd*d e(k);

    求导

    增量式PID:△u(k)=Kp * e(k-1)+Ki *e(k) +Kd *(e(k)-2e(k-1)+e(k-2));

    实际PID输出:u(k)=Kp * e(k-1)+Ki *e(k) +Kd *(e(k)-2e(k-1)+e(k-2))+u(k-1);

    u(k):本次实际输出量

    u(k-1):上次的输出量

    △u(k):输出变化量

    Kp : 比例系数

    Ki : 积分系数

    Kd :微分系数

    e(k-1):上一次的目标和实际的误差值

    e(k) :这次的目标和实际的误差值

    e(k-2):上上次目标和实际的误差值

    
    增量式PID:u(k)=Kp * e(k-1)+Ki *e(t) +Kd *(e(k)-2e(k-1)+e(k-2))typedef struct{
    	float kp ;		//比例系数
    	float ki ;		//积分系数
    	float kd ;	    //微分系数
    	float error;    //误差值
    	float lastError;	//上一个误差值
    	float dError;        //上次误差和这次误差的变化值
    	float ddError;       //上次误差变化值和这次误差的变化值的变化值
    	float dError_last;   //上上次误差和上次次误差的变化值
    	float output;         //输出值
    	float output_last;    //上次的输出值
    	float output_new;
    }pid_info;
    
    void reset_pid(pid_info *pid,float kp,float ki,float kd)
    {
    	pid->kp = kp;
    	pid->ki = ki;
    	pid->kd = kd;
    	pid->error = 0;
    	pid->lastError = 0;
    	pid->dError = 0 ;
    	pid->ddError = 0;
    	pid->dError_last = 0;
    	pid->output = 0 ;
    	pid->output_last = 0;
    }
    
    float increment_pid(float error,pid_info *pid)//增量式PID
    {
    	pid->error = error;
    	pid->dError = error - pid->lastError;
    	pid->ddError = pid->dError - pid->dError_last;
    	pid->lastError = error;
    	pid->dError_last = pid->dError;
    	pid->output =(pid->kp*pid->dError)+(pid->ki*error)+(pid->kd*pid->ddError) + pid->output_last; 
    	pid->output_last = pid->output;	
       // int32_t pidoutput= (int32_t)pid->output;
    	return pid->output;
    }
    
    更多相关内容
  • 增量PID matlab控制例程,可以尝试调节Kp/Ki/Kd
  • 增量式控制PID算法,一种PID控制算法代码,适合参考使用
  • 增量式控制算法可以使存储空间减小,运行更迅速
  • MATLAB simulink模块下的PID计算代码及模型仿真
  • 在MTLAB中实现增量式的PID算法,已经通过验证,仿真良好。
  • 锅炉主汽温度的大滞后,pid增量控制 锅炉主汽温度的大滞后,pid增量控制
  • 增量PID控制算法及仿真。M文件,希望对大家有帮助。
  • 基于FPGA的增量PID设计方法,Matlab、Simulink, Xilinx Block set
  • LabView编程环境下PID增量式算法(已实验通过,放心下载)
  • 本代码采用的是温控式PID模型,内容简介,可移植性强,不需要大量的存储空间
  • PID控制算法:增量PID控制算法及仿真
  • 在labview中实现增量PID算法,形成子VI方便使用
  • STM32单片机增量PID控制子程序库源代码
  • Incremental PID Control增量PID算法C语言实现C implementation of Incremental PID Control
  • AB相编码器程序,这是AB相编码器程序,AB相编码器程序AB相编码器程序
  • 数字增量PID simulink模型
  • labview PID控制程序 增量PID温度测量,很好用,有说明
  • 自编增量PID

    2014-09-18 09:47:49
    自编增量PID,介绍PID的实际应用和编写说明,提高模拟量控制精度。
  • 增量PIDsimulink程序

    2018-09-11 16:22:04
    增量PID控制器仿真程序,使用simulink仿真,MATLAB版本2014a
  • 增量pid调节

    2017-05-09 22:14:46
    pid学习
  • AB编码器增量PID控制,数字pid位置型控制算法和增量型,CC++源码.zip
  • 在分析增量式数字 PID基本算法的基础上,讨论了PID调节器参数对控制性能的影响及PID调节器控制参数的整定,并利用具有积分分离和消除设定值变化冲击的PID控制算法来实现具有最佳组合的PID控制。仿真实验结果表明,经...
  • 基于增量PID算法的智能帆板系统.pdf
  • 增量pid_labview_pid_

    2021-09-29 03:27:56
    此vi属于增量pid,用于设备之间的闭环控制。
  • PID的C语言例程
  • 基于STM32和增量PID的旋转倒立摆的设计
  • 一、位置式PID 按照模拟PID控制算法,以一系列采样时刻点KT代替连续时间t,用矩形法数值积分代替积分,以一阶向后差分代替微分。 1、一系列采样时刻点KT代替连续时间t 2、用矩形法数值积分代替积分 3、以...

    一、位置式PID

      按照模拟PID控制算法,以一系列采样时刻点KT代替连续时间t,用矩形法数值积分代替积分,以一阶向后差分代替微分。

    1、一系列采样时刻点KT代替连续时间t

    t=KT,(k=1、2、3.... 

    2、用矩形法数值积分代替积分

    \int_{0}^{t}error(t)d(t)\approx T\sum_{j=0}^{k}error(jT)=T\sum_{j=0}^{k}error(j)   

    3、以一阶向后差分代替微分

    d(error)/d(t)=[error(k)-error(k-1)]/T

    最后可得离散化的PID表达式

    u(k)=kp*error(k)+ki\sum_{j=0}^{k}error(j)T+kd\frac{error(k)-error(k-1)}{T}

    式中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

    \bigtriangleup u(k)=u(k)-u(k-1)=

    error(k)-error(k-1))+ki*error(k)+kd(error(k)-error(k-1)+error(k-2))

    u(k+1)=u(k)+🔺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');

     

    展开全文
  • 基于STM32和增量PID的旋转倒立摆的设计.pdf
  • 利用增量PID控制策略,抑制电机启动电流,改善动态性能;将采集的视频信息通过无线图传发送给控制台,利用遥控器对移动平台进行实时控制。测试结果表明,移动平台运动灵活,越障能力强,实时性和可控性满足项目设计要求

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,830
精华内容 10,332
关键字:

增量pid

友情链接: 原版.zip