3464|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

基于DSP的PID控制算法的实现 [复制链接]

     摘 要:按偏差的比例、积分和微分进行控制的调节器称为PID调节器,PID调节器是连续系统中技术成熟、应用最为广泛的一种调节器。它构简单,参数易于调整,在长期的应用中已积累了丰富的经验。特别在工业过程中,由于控制对象的精确数学模型难以建立,系统的参数又经常发生变化,运用现代控制理论分析综合要耗费很大的代价进行模型辨识,但往往不能得到预期的效果,所以人们常采用数字PID调节器,并根据经验进行在线整定。这次课程设计将综合用数字信号处理DSP以及自动控制方面的知识,使用CCS集成开发环境进行代码的编译,仿真,才能完成了本次设计。


      前言在数字PID算法是目前一般控制领域中经常使用的自动控制算法,它依据给定的设定值,反馈值,以及比例系数,积分和微分时间,计算出一定的控制量,使被控对象能保持在设定的工作范围,并且可以自动的消除外部扰动。由于软件系统的灵活性,经计算出的PID参数可以在调试过程中随时改变。能更精确的控制系统。得到较好的控制效果。PID 控制原理简单、实现方便,并且适应面广、鲁棒性强,其控制品质对被控对象特性的变化不是很敏感。随着计算机技术的发展,在 PID 控制的基础上,出现了很多改进的数字 PID 控制方法 ,如微分先行 PID 控制、积分分离 PID 控制、带死区的PID 控制等。对于数字PID 控制方法,又分为增量式 PID 控制算式和位置式 PID 控制算式。在绝大多数工业控制中,数字 PID 控制仍然是一种稳定的、可靠的、实现简单的、使用广泛的控制方法。

本设计以TI公司的TMS320VC5509和外接 D/ A芯片,实现数字 PID 控制器,采用的 PID 控制算法是增量式 PID 控制算法。TMS320VC5509 具有较高的运行速度和数据处理能力,能保证系统对多路模拟信号的实时采集和处理,提高系统的整体性能和集成度。在 DSP 内部设置参考输入量,通过DSP片上 10 位 A/ D 转换器采样,把控制对象的实际输出量采集到 DSP 中,经过DSP 的数字运算处理后,通过外部的 D/ A AD7237 进行数/ 模转换,得到实际的模拟控制量去控制被控对象,使之按照系统的设置运行工作。

1、模拟PID调节器

模拟PID控制系统组成如图1所示:

             图1 模拟PID控制系统原理框图

PID调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对控制对象进行控制。根据图1,可以推导出PID调节器的微分方程为:

                  


      式中   


u(t)——控制器(也称调节器)的输出;

e(t)——控制器的输入(常常是设定值与被控量之差,即e(t)=r(t)-c(t));

Kp——控制器的比例放大系数;

Ti ——控制器的积分时间;

Td —— 控制器的微分时间。

1.1 PID调节器各校正环节的作用

比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减小偏差。对于大多数调节器而言,都不采用比例增益kc作为刻度,而是用比例度来刻度,即δ=1/kc*100%. 也就是说比例度与调节器的放大倍数的倒数成比例。调节器的比例度越小,它的放大倍数越大,它把偏差放大的能力越大,反之亦然。

积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数TI,TI越大,积分作用越弱,反之则越强。调节器的积分作用就是为了消除自控系统的余差而设置的。所谓积分,就是随时间进行累积的意思,即当有偏差输入e存在时,积分调节器就要将偏差随时间不断累积起来,也就是积分累积的快慢与偏差e的大小和积分速度成正比。只要有偏差e存在,积分调节器的输出就要改变,也就是说积分作用总是起作用的,只有偏差不存在时,积分才会停止。

微分环节:能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。可见,微分分量对偏差的任何变化都会产生控制作用,以调整系统输出,阻止偏差变化,预见随后。偏差变化越快,则产生的阻止作用越大。对于一个固定不变的偏差e(t),不论其数值多大,根本不会有微分作用输出。

2、 数字PID控制器
2.1 模拟PID控制规律的离散化
模拟形式
离散化形式
根据上表和模拟PID的数学表达式,可以退出数字PID控制器的差分方程为:
式中                   称为比例项
                  称为积分项
          称为微分项
常用的控制方式有
    P控制         
PI控制         
PD控制         
PID控制         
2.2 PID算法的两种类型
2.2.1 位置型控制
                  
基本PID控制器的理想算式为
               
式中

u(t)——控制器(也称调节器)的输出;

e(t)——控制器的输入(常常是设定值与被控量之差,即e(t)=r(t)-c(t));

Kp——控制器的比例放大系数;

Ti ——控制器的积分时间;

Td——控制器的微分时间。

设u(k)为第k次采样时刻控制器的输出值,可得离散的PID算式

               

                                               

式中

,               

由于计算机的输出u(k)直接控制执行机构(如阀门),u(k)的值与执行机构的位置(如阀门开度),所以通常称上式为位置式PID控制算法。


图2 位置式PID控制器流程图

位置式PID控制算法的缺点:当前采样时刻的输出与过去的各个状态有关,计算时要对e(k)进行累加,运算量大;而且控制器的输出u(k)对应的是执行机构的实际位置,如果计算机出现故障,u(k)的大幅度变化会引起执行机构位置的大幅度变化。

2.2.2增量型控制
增量型PID算法的算式为:
或者写成
            
        式中

增量式PID是指数字控制器的输出只是控制量的增量Δu(k)。采用增量式算法时,计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量,而不是对应执行机构的实际位置,因此要求执行机构必须具有对控制量增量的累积功能,才能完成对被控对象的控制操作。执行机构的累积功能可以采用硬件的方法实现;也可以采用软件来实现,如利用算式

程序化来完成。

由上式可得增量式PID控制算式

            

式中


进一步可以改写成

                                                                                                

式中


一般计算机控制系统的采样周期T在选定后就不再改变,所以,一旦确定了Kp、Ti、Td,只要使用前后3次测量的偏差值即可求出控制增量。

根据上述分析,其程序流程图如下:


图3 增量型控制算法路程图

增量式算法优点:①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;②DSP每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程。

经过综合比较,最终选择了增量式控制算法。

3.系统软硬件设计
3.1硬件设计

为了实现上述控制算法,还需要硬件电路才行,设计电路原理图如图4所示:

从图4 中可以看出,模拟量输入,也即被控电机的实际输出转速,通过一个限流电阻 R 送到由 AD8041 构成的电压跟随器里,经过放大后,再经二极管D1 和 D2嵌位以及电阻 R 限流,送到TMS320VC5509片上的 A/D 转换其中使得 A/D 的输入限制在 0~3 300 mV。TMS320VC5509 一共有16 路复用的片上 A/D 转换器,本实例只采用第 0 通道的A/D转换。由DSP计算出控制量,通过外部数据总线送给D/ A 转换器,采用 AD 公司的 AD7237 芯片,他是 8 位 D/ A 转换器,由DSP的外部地址总线A2 ,A1 ,A0 构成D/ A转换器的译码电路,D/ A转换器的输出采用AD7237 的A相输出。TMS320VC5509 由外部提供复位信号,由无源晶振提供6 MHz时钟。片上 A/D 转换器的参考电压高电平 V 接DSP电源+3.3 V 。

图4  DSP实现数字PID控制器的电路原理图

3.2 软件设计

本设计运用了CCSV3.3软件,它是一个完整的DSP集成开发环境,CCS支持软仿真器、各种型号的硬仿真器、各种DSK和EVM板。

[11]CCS主要特点有:集成可视化代码编辑界面,可以方便地直接编写C、汇编、.h文件、.cmd文件等;集成代码生成工具,包括汇编器、优化的C编译器和连接器等;具有完整的基本调试工具,可以载入执行文件(.out),查看寄存器窗口、存储器窗口和变量窗口、反汇编窗口等,支持在C源代码级进行调试;支持多片DSP联合调试;

断点工具,支持硬件断点、数据空间读/写断点、条件断点等;探针工具(probe points),用于进行算法仿真,数据监视等;剖析工具(profile pionts),用于评估代码执行的时间;数据图形显示工具,可绘制时域/频域波形、眼图、星座图等,并可以自动刷新;提供GEI二工具,用户可以根据需要编写自己的控制面板/菜单,从而方便直观地修改变量,配置参数。支持RTDX(Real time date exchange)技术,利用该技术可以在不中断目标系统运行的情况下,实现DSP与其它应用程序(OLE)实现数据交换,具有开放式的plug-ins技术,支持其它第三方的ActiveX插件。提供DSP、BIOS工具,利用该工具可增强对代码的实时分析能力,减少开发人员对硬件资源熟悉程度的依赖性。


图5 代码调试与编译

为了验证算法的可行性,现建立数字PID直流电机控制模型,然后用Matlab的LTI状态分析工具箱进行仿真,并绘制转速及控制电压变化图形。

                   图6 数字PID仿真模型
            
              利用Matlab软件和 LTI工具箱函数,仿真源程序代码如下:
clear all;
close all;
ts=0.01;                      %采样时间=0.001s
sys=tf(2652,[1,25,490]);      %建立被控对象传递函数
dsys=c2d(sys,ts,'z');         %把传递函数离散化
[num,den]=tfdata(dsys,'v');   %离散化后提取分子、分母
e_1=0                         %上一偏差      
Ee=0;                         %偏差累计
u_1=0.0;                      %上一状态电压
u_2=0.0;
y_1=0;                        %上一状态输出
y_2=0;
kp=2.5;                       %PID参数
ki=0.04;                        
kd=0.28;                        
for k=1:100
time(k)=k*ts;                  %时间参数
r(k)=500;                     %给定值
    y(k)=-1*den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
    e(k)=r(k)-y(k);          %偏差
    u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1);   
    if u(k)>220
        u(k)=220;
    end
    if u(k)<=0
        u(k)=0;
    end      
    Ee=Ee+e(k);   
    u_2=u_1;
    u_1=u(k);   
    y_2=y_1;
    y_1=y(k);   
    e_2=e_1;
    e_1=e(k);
end
hold on;
plot(time,r,'r',time,y,'b',time,u,'r');
[kp,ki,kd];
程序调试好后,分别改变kp、ki和kd的参数值,看输出图形有何变化,理解PID控制中比例、积分和微分对控制系统的作用。
                   图7  Matlab中仿真图A
图8 Matlab中仿真图B
4 分析与结论
通过本次课程设计的软件仿真与调试,才更加深刻的领悟了数字PID控制算法的精髓,使得理论得到了很好的验证,从而是我巩固了所学知识,得到了专业技能的锻炼和提高。
5 参考文献
[1] 胡寿松  自动控制原理  北京:科学出版社
[2] 童诗白、华成英  模拟电子技术基础  北京:高等教育出版社
[3] 黄忠霖 控制系统MATLAB设计与仿真 北京:国防工业出版社
[4] 谢剑英、贾青 微型计算机控制技术 北京:国防工业出版社
[5]赵洪亮.TMS320C55X DSP 应用系统设计[M].北京:北京航空航天大学出版社,2008.
[6]王献峰,石东.基于DSP的FIR数字滤波器设计与实现[J].通信电源技术,2006,23(4):38-40.
[7]张雄伟.DSP芯片的原理与开发应用(第三版)[M].北京:电子工业出版社,2003.
[8]丁玉美.数字信号处理(第二版)[M].西安:西安电子科技大学出版社,2005.
[9]杨大柱.基于TMS320C5510的FIR滤波器设计与实现[J].微计算机信息,2008,24(17).
[10]陈怀琛.MATLAB及其在理工课程中的应用指南[M].西安:西安电子科技大学出版社,2007.

附录:源程序代码

  • /*****************************************************************
  • PID Function
  • The PID (比例、积分、微分) function is used in mainly
  • control applications. PIDCalc performs one iteration of the PID
  • algorithm.
  • While the PID function works, main is just a dummy program showing
  • a typical usage.
  • ****************************************************************/
  • /****************************头文件******************************/
  • #include "DSP28_Device.h"
  • #include "System.h"
  • #include "DSP28_Adc.h"
  • typedef struct PID {
  • double SetPoint;                        // 设定目标Desired value
  • double Proportion;                      // 比例常数Proportional Const
  • double Integral;                        // 积分常数Integral Const
  • double Derivative;                      // 微分常数Derivative Const
  • double LastError;                       // Error[-1]
  • double PrevError;                       // Error[-2]
  • double SumError;                       // Sums of Errors
  • } PID;
  • /*********************PID计算部分*********************************/
  • double PIDCalc( PID *pp, double NextPoint )
  • {
  • double dError,
  • Error;
  • Error = pp->SetPoint - NextPoint;                          // 偏差
  • pp->SumError += Error;                                  // 积分
  • dError = pp->LastError - pp->PrevError;                    // 当前微分
  • pp->PrevError = pp->LastError;
  • pp->LastError = Error;
  • return (pp->Proportion * Error                             // 比例项
  • + pp->Integral * pp->SumError                            // 积分项
  • + pp->Derivative * dError );                               // 微分项
  • }
  • /**********************Initialize PID Structure************************/
  • void PIDInit (PID *pp)
  • {
  • memset ( pp,0,sizeof(PID));
  • }
  • /********************Main Program*********************************/
  • double sensor (void)                                     // Dummy Sensor Function
  • {
  • return 100.0;
  • }
  • void actuator(double rDelta)                             // Dummy Actuator Function
  • {}
  • void InitAdc(void)
  • {
  • unsigned int i;
  • AdcRegs.ADCTRL1.bit.RESET=1;
  • NOP;
  • AdcRegs.ADCTRL1.bit.RESET=0;                      //重新设置
  • AdcRegs.ADCTRL1.bit.SUSMOD=3;              //设置仿真挂起模式 3,
  • AdcRegs.ADCTRL1.bit.ACQ_PS=0;
  • AdcRegs.ADCTRL1.bit.CPS=0;
  • //对高速时钟 HSPCLK 分频,=0 时,不分频,=1 时,二分频
  • AdcRegs.ADCTRL1.bit.CONT_RUN=0;             //开始-----停止模式
  • AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
  • //级联模式,SEQ1 和 SEQ2 作为一个 16 状态排序器工作。
  • AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;           //带隙和参考电路上电for(i=0;i<10000;i++) NOP;
  • AdcRegs.ADCTRL3.bit.ADCPWDN=1;
  • //除带隙和参考电路外的 ADC 其它模拟电路上电
  • for(i=0;i<5000;i++)  NOP;
  • AdcRegs.ADCTRL3.bit.ADCCLKPS=15;
  •                                             //时钟分频 ADCCLKPS=HSPCLKPS/[2*15*(ADCTRL1[7]+1)]
  • AdcRegs.ADCTRL3.bit.SMODE_SEL=1;           //选择同步采样模式
  • AdcRegs.MAX_CONV.bit.MAX_CONV=0;           //设置转换通道0
  • AdcRegs.CHSELSEQ1.bit.CONV00=0;
  • AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;   //清除 SEQ1 的中断标志位
  • AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;   //清除 SEQ2 的中断标志位
  • AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;      //无作用
  • AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
  • //将排序器立即复位到 CONV00 状态
  • AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;  //使能 INT_SEQ1 的中断请求
  • AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
  •                                           //每个 SEQ1 序列结束时,INT_SEQ1 置位
  • AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;    //EVA 的触发信号不启动 SEQ1
  • AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;    //无操作
  • AdcRegs.ADCTRL2.bit.RST_SEQ2=0;        //无操作
  • AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;         //清除一个挂起的 SOC 触法
  • AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;     //禁止 INT_SEQ2 产生的中断请求
  • AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
  • //每个 SEQ2 结束时,INT_SEQ2 置位
  • AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
  • //EVB 的触发信号不启动 SEQ2
  • AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
  • //软件触法,从当前停止的位置启动 SEQ1
  • void main(void)
  • {
  • PID sPID;                                // PID Control Structure
  • double rOut;                             // PID Response (Output)
  • double rIn;                              // PID Feedback (Input)
  • PIDInit ( &sPID );                        // Initialize Structure
  • sPID.Proportion = 0.5;                    // Set PID Coefficients
  • sPID.Integral = 0.5;
  • sPID.Derivative = 0.0;
  • sPID.SetPoint = 100.0;                    // Set PID Setpoint
  • for (;;) {                                // Mock Up of PID Processing
  • rIn = sensor ();                           // Read Input
  • rOut = PIDCalc ( &sPID,rIn );               // Perform PID Interation
  • actuator ( rOut );                         // Effect Needed Changes
  • while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
  • {
  • AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
  • }     //只要 SEQ1 不忙,那么就启动 SOC_SEQ1
  • }
  • /*********************AD 中断服*********************************/
  • interrupt void ad(void)
  • {
  •    PieCtrl.PIEACK.bit.ACK1=1;               //采集 ADC0 通道的数据
  • ADtemp[adflag]=(AdcRegs.RESULT0>>4)&0x0fff;
  • //右移四位,减小误差
  •                     //RESULT 寄存器的低四位为无效位,故应右移四位
  •         adflag++;
  •         if(adflag==MAX_DATA)
  • {
  •           adflag=0;
  • }
  •      AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;    //清除中断标志位
  •      AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;




点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表