找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16984|回复: 18
收起左侧

基于DSP的PID控制算法的实现

  [复制链接]
ID:208023 发表于 2017-6-5 15:11 | 显示全部楼层 |阅读模式
《数字信号处理与DSP应用》
课程论文
题目:    基于DSP的PID控制算法的实现
学 号:   2011080911
姓 名:             蔡*威         
班 级:   6班         
专 业:          电路与系统        
课程老师:         黄*生         

二零一二年二月二十日

摘 要:按偏差的比例、积分和微分进行控制的调节器称为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.003.jpg

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

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

                   1.004.jpg

      式中   1.005.jpg

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控制规律的离散
模拟形式
离散化形式
1.006.jpg
1.007.jpg
1.008.jpg
1.009.jpg
1.010.jpg
1.011.jpg
根据上表和模拟PID的数学表达式,可以退出数字PID控制器的差分方程为:
1.012.jpg
式中   1.013.jpg                称为比例项
       1.014.jpg           称为积分项
       1.015.jpg   称为微分项
常用的控制方式有
    P控制          1.016.jpg
PI控制          1.017.jpg
PD控制          1.018.jpg
PID控制         1.019.jpg
2.2 PID算法的两种类
2.2.1 位置型控制
                  1.020.jpg
基本PID控制器的理想算式为
1.021.jpg               
式中 1.022.jpg

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

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

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

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

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

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

               1.023.jpg                                                

式中 1.024.jpg ,               1.025.jpg

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

1.026.jpg

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

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

2.2.2增量型控制
增量型PID算法的算式为:
1.027.jpg
或者写成
            1.028.jpg
        式中 1.029.jpg 1.030.jpg 1.031.jpg

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

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

1.033.jpg             

式中 1.034.jpg

进一步可以改写成

1.035.jpg                                                                                                 

式中 1.036.jpg 1.037.jpg 1.038.jpg

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

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

1.039.jpg

图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 。

1.040.jpg

图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工具,利用该工具可增强对代码的实时分析能力,减少开发人员对硬件资源熟悉程度的依赖性。

1.041.jpg

图5 代码调试与编译

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

1.042.jpg
                   图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控制中比例、积分和微分对控制系统的作用。
1.043.jpg
                   图7  Matlab中仿真图A
1.044.jpg
图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.

附录:源程序代码

  1. /*****************************************************************
  2. PID Function
  3. The PID (比例、积分、微分) function is used in mainly
  4. control applications. PIDCalc performs one iteration of the PID
  5. algorithm.
  6. While the PID function works, main is just a dummy program showing
  7. a typical usage.
  8. ****************************************************************/
  9. /****************************头文件******************************/
  10. #include "DSP28_Device.h"
  11. #include "System.h"
  12. #include "DSP28_Adc.h"

  13. typedef struct PID {
  14. double SetPoint;                        // 设定目标Desired value
  15. double Proportion;                      // 比例常数Proportional Const
  16. double Integral;                        // 积分常数Integral Const
  17. double Derivative;                      // 微分常数Derivative Const
  18. double LastError;                       // Error[-1]
  19. double PrevError;                       // Error[-2]
  20. double SumError;                       // Sums of Errors
  21. } PID;
  22. /*********************PID计算部分*********************************/
  23. double PIDCalc( PID *pp, double NextPoint )
  24. {
  25. double dError,
  26. Error;
  27. Error = pp->SetPoint - NextPoint;                          // 偏差
  28. pp->SumError += Error;                                  // 积分
  29. dError = pp->LastError - pp->PrevError;                    // 当前微分
  30. pp->PrevError = pp->LastError;
  31. pp->LastError = Error;
  32. return (pp->Proportion * Error                             // 比例项
  33. + pp->Integral * pp->SumError                            // 积分项
  34. + pp->Derivative * dError );                               // 微分项
  35. }

  36. /**********************Initialize PID Structure************************/
  37. void PIDInit (PID *pp)
  38. {
  39. memset ( pp,0,sizeof(PID));
  40. }

  41. /********************Main Program*********************************/
  42. double sensor (void)                                     // Dummy Sensor Function
  43. {
  44. return 100.0;
  45. }
  46. void actuator(double rDelta)                             // Dummy Actuator Function
  47. {}

  48. void InitAdc(void)
  49. {
  50. unsigned int i;
  51. AdcRegs.ADCTRL1.bit.RESET=1;
  52. NOP;
  53. AdcRegs.ADCTRL1.bit.RESET=0;                      //重新设置
  54. AdcRegs.ADCTRL1.bit.SUSMOD=3;              //设置仿真挂起模式 3,
  55. AdcRegs.ADCTRL1.bit.ACQ_PS=0;
  56. AdcRegs.ADCTRL1.bit.CPS=0;
  57. //对高速时钟 HSPCLK 分频,=0 时,不分频,=1 时,二分频
  58. AdcRegs.ADCTRL1.bit.CONT_RUN=0;             //开始-----停止模式
  59. AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
  60. //级联模式,SEQ1 和 SEQ2 作为一个 16 状态排序器工作。
  61. AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;           //带隙和参考电路上电for(i=0;i<10000;i++) NOP;
  62. AdcRegs.ADCTRL3.bit.ADCPWDN=1;
  63. //除带隙和参考电路外的 ADC 其它模拟电路上电
  64. for(i=0;i<5000;i++)  NOP;
  65. AdcRegs.ADCTRL3.bit.ADCCLKPS=15;
  66.                                             //时钟分频 ADCCLKPS=HSPCLKPS/[2*15*(ADCTRL1[7]+1)]
  67. AdcRegs.ADCTRL3.bit.SMODE_SEL=1;           //选择同步采样模式

  68. AdcRegs.MAX_CONV.bit.MAX_CONV=0;           //设置转换通道0
  69. AdcRegs.CHSELSEQ1.bit.CONV00=0;
  70. AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;   //清除 SEQ1 的中断标志位
  71. AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;   //清除 SEQ2 的中断标志位
  72. AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;      //无作用
  73. AdcRegs.ADCTRL2.bit.RST_SEQ1=0;      
  74. //将排序器立即复位到 CONV00 状态
  75. AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;  //使能 INT_SEQ1 的中断请求
  76. AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
  77.                                           //每个 SEQ1 序列结束时,INT_SEQ1 置位
  78. AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;    //EVA 的触发信号不启动 SEQ1
  79. AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;    //无操作
  80. AdcRegs.ADCTRL2.bit.RST_SEQ2=0;        //无操作
  81. AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;         //清除一个挂起的 SOC 触法
  82. AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;     //禁止 INT_SEQ2 产生的中断请求
  83. AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
  84. //每个 SEQ2 结束时,INT_SEQ2 置位
  85. AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;   
  86. //EVB 的触发信号不启动 SEQ2
  87. AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
  88. //软件触法,从当前停止的位置启动 SEQ1

  89. void main(void)
  90. {
  91. PID sPID;                                // PID Control Structure
  92. double rOut;                             // PID Response (Output)
  93. double rIn;                              // PID Feedback (Input)
  94. PIDInit ( &sPID );                        // Initialize Structure
  95. sPID.Proportion = 0.5;                    // Set PID Coefficients
  96. sPID.Integral = 0.5;
  97. sPID.Derivative = 0.0;
  98. sPID.SetPoint = 100.0;                    // Set PID Setpoint
  99. for (;;) {                                // Mock Up of PID Processing
  100. rIn = sensor ();                           // Read Input
  101. rOut = PIDCalc ( &sPID,rIn );               // Perform PID Interation
  102. actuator ( rOut );                         // Effect Needed Changes
  103. while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
  104. {
  105. AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
  106. }     //只要 SEQ1 不忙,那么就启动 SOC_SEQ1
  107. }
  108. /*********************AD 中断服*********************************/

  109. interrupt void ad(void)
  110. {      
  111.    PieCtrl.PIEACK.bit.ACK1=1;               //采集 ADC0 通道的数据     
  112. ADtemp[adflag]=(AdcRegs.RESULT0>>4)&0x0fff;
  113. //右移四位,减小误差
  114.                     //RESULT 寄存器的低四位为无效位,故应右移四位
  115.         adflag++;
  116.         if(adflag==MAX_DATA)
  117. {
  118.           adflag=0;
  119. }
  120.      AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;    //清除中断标志位
  121.      AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;      

  122. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式 可编辑):
基于DSP的PID控制算法的实现.doc (477 KB, 下载次数: 366)
回复

使用道具 举报

ID:88957 发表于 2017-7-10 22:54 | 显示全部楼层
学习了。谢谢!
回复

使用道具 举报

ID:325305 发表于 2018-5-8 18:37 | 显示全部楼层
良心大佬
回复

使用道具 举报

ID:247467 发表于 2018-5-11 09:02 | 显示全部楼层
谢谢分享资源
回复

使用道具 举报

ID:47428 发表于 2018-5-21 20:20 | 显示全部楼层
好东西
回复

使用道具 举报

ID:341109 发表于 2018-5-30 09:10 | 显示全部楼层
学习中!!!!
回复

使用道具 举报

ID:345500 发表于 2018-7-5 08:09 | 显示全部楼层
很不错,先Mark
回复

使用道具 举报

ID:367123 发表于 2018-7-8 02:27 | 显示全部楼层
资料不错  参考了
回复

使用道具 举报

ID:417534 发表于 2018-10-29 20:43 | 显示全部楼层
学习了。谢谢!
回复

使用道具 举报

ID:399475 发表于 2019-4-26 09:06 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:524173 发表于 2019-4-30 11:34 | 显示全部楼层
不错的资料!!!!!!!!!
回复

使用道具 举报

ID:517387 发表于 2019-5-29 16:20 | 显示全部楼层
System.h文件发一下呗。。这个在哪里找
回复

使用道具 举报

ID:552849 发表于 2019-6-2 10:08 | 显示全部楼层
请问一下作者利用MATLAB的LTI工具箱调试的时候,传递函数是自己尝试给的还是从电路图中看出来的,如果是来源于电路图,能不能有个大佬解释一下
回复

使用道具 举报

ID:636505 发表于 2019-11-6 09:45 | 显示全部楼层
很需要这个,谢谢,过几天再来下载
回复

使用道具 举报

ID:636605 发表于 2019-11-6 11:36 来自手机 | 显示全部楼层
受教了
回复

使用道具 举报

ID:438263 发表于 2020-6-13 17:05 | 显示全部楼层
学习先靠后,先整个文档
回复

使用道具 举报

ID:438263 发表于 2020-6-13 17:13 | 显示全部楼层
好像差点东西
回复

使用道具 举报

ID:806006 发表于 2020-7-20 20:29 | 显示全部楼层
学习了!!!想要下载文档来看
回复

使用道具 举报

ID:872450 发表于 2021-1-9 22:50 来自手机 | 显示全部楼层
这个不错!让后人受益匪浅。为你点赞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表