PID算法C语言_第1页
PID算法C语言_第2页
PID算法C语言_第3页
PID算法C语言_第4页
PID算法C语言_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、pid算法(c语言)#include <stdio.h>#include<math.h>struct _pidint pv; /integer that contains the process value 过程量int sp; /integer that contains the set point   设定值float integral; / 积分值 偏差累计值float pgain;float igain;float dgain;int deadband;    /死区int last_error;struct _

2、pid warm,*pid;int process_ point, set_point, dead_band;float p_gain, i_gain, d_gain, integral_val,new_integ;/pid_init description this function initializes the pointers in the _pid structure to the process variable and the setpoint. *pv and *sp are integer pointers./void pid_init(struct _pid *warm,

3、int process_point, int set_point)struct _pid *pid;pid = warm;pid->pv = process_point;pid->sp = set_point;/pid_tune description sets the proportional gain (p_gain), integral gain (i_gain),derivitive gain (d_gain), and the dead band (dead_band) of a pid control structure _pid. 设定pid参数 p,i,d

4、,死区/void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)pid->pgain = p_gain;pid->igain = i_gain;pid->dgain = d_gain;pid->deadband = dead_band;pid->integral= integral_val;pid->last_error=0;/pid_setinteg description set a new value for the integral

5、 term of the pid equation.this is useful for setting the initial output of the pid controller at start up.设定输出初始值/void pid_setinteg(struct _pid *pid,float new_integ)pid->integral = new_integ;pid->last_error = 0;/pid_bumpless description bumpless transfer algorithim.when suddenly changing setpo

6、ints, or when restarting the pid equation after an extended pause,the derivative of the equation can cause a bump in the controller output. this function will help smooth out that bump.the process value in *pv should be the updated just before this function is used.pid_bumpless 实现无扰切换当突然改变设定值时,或重新启动

7、后,将引起扰动输出。这个函数将能实现平顺扰动,在调用该函数之前需要先更新pv值/void pid_bumpless(struct _pid *pid)pid->last_error = (pid->sp)-(pid->pv);  /设定值与反馈值偏差/pid_calc description performs pid calculations for the _pid structure *a.this function uses the positional form of the pid equation, and incorporates an integra

8、l windup prevention algorithim.rectangular integration is used, so this function must be repeated on a consistent time basis for accurate control.return value the new output value for the pid loop. usage #include "control.h"本函数使用位置式pid计算方式,并且采取了积分饱和限制运算pid计算/float pid_calc(struct _pid *pid

9、)int err;float pterm, dterm, result, ferror;/ 计算偏差err = (pid->sp) - (pid->pv);/ 判断是否大于死区if (abs(err) > pid->deadband)ferror = (float) err;   /do integer to float conversion only once 数据类型转换/ 比例项pterm = pid->pgain * ferror;if (pterm > 100 | pterm < -100)pid->integral

10、 = 0.0;else/ 积分项pid->integral += pid->igain * ferror;/ 输出为0100%/ 如果计算结果大于100,则等于100if (pid->integral > 100.0)pid->integral = 100.0;/ 如果计算结果小于0.0,则等于0else if (pid->integral < 0.0)pid->integral = 0.0;/ 微分项dterm = (float)(err - pid->last_error) * pid->dgain;result = pterm

11、+ pid->integral + dterm;elseresult = pid->integral; / 在死区范围内,保持现有输出/ 保存上次偏差pid->last_error = err;/ 输出pid值(0-100)return (result);/void main(void)float display_value;int count=0;pid = &warm;/ printf("enter the values of process point, set point, p gain, i gain, d gain n");/ scan

12、f("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain);/ 初始化参数process_point = 30;set_point = 40;p_gain = (float)(5.2);i_gain = (float)(0.77);d_gain = (float)(0.18);dead_band = 2;integral_val =(float)(0.01);printf("the values of process point, set po

13、int, p gain, i gain, d gain n");printf(" %6d %6d %4f %4f %4fn", process_point, set_point, p_gain, i_gain, d_gain);printf("enter the values of process pointn");while(count<=20)scanf("%d",&process_point);/ 设定pv,sp值pid_init(&warm, process_point, set_point);

14、/ 初始化pid参数值pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);/ 初始化pid输出值pid_setinteg(&warm,0.0);/pid_setinteg(&warm,30.0);/get input value for process pointpid_bumpless(&warm);/ how to display outputdisplay_value = pid_calc(&warm);printf("%fn", display_value);/printf(&quo

15、t;n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain);count+;基本的数字滤波方法及算法实现1、限幅滤波法(又称程序判断滤波法)a、方法:根据经验判断,确定两次采样允许的最大偏差值(设为a);每次检测到新值时判断:如果本次值与上次值之差<=a,则本次值有效;如果本次值与上次值之差>a,则本次值无效,放弃本次值,用上次值代替本次值;b、优点:能有效克服因偶然因素引起的脉冲干扰;c、缺点无法抑制那种周期性的干扰;平滑度差;d、算法:/*  a值可根据实际情况调整    value为有

16、效值,new_value为当前采样值      滤波程序返回有效的实际值  */#define a 10char value;char filter()   char  new_value;   new_value = get_ad();   if ( ( new_value - value > a ) | ( value - new_value > a )      return value; 

17、0; return new_value;         2、中位值滤波法a、方法:连续采样n次(n取奇数)把n次采样值按大小排列取中间值为本次有效值b、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果c、缺点:对流量、速度等快速变化的参数不宜,非常占用时间,如果不使用冒泡算法的话相对会快一点。d、算法/*  n值可根据实际情况调整    排序采用冒泡法*/#define n  11char filter() 

18、60; char value_bufn;   char count,i,j,temp;   for ( count=0;count<n;count+)         value_bufcount = get_ad();      delay();      for (j=0;j<n-1;j+)         fo

19、r (i=0;i<n-j;i+)               if ( value_bufi>value_bufi+1 )                     temp = value_bufi;     

20、0;      value_bufi = value_bufi+1;              value_bufi+1 = temp;                     return value_buf(n-1)/2;   

21、;  e、实际的效果通过中间值选取,可以将信号压缩,这样针对缓慢变化的信号可以利用这个方法对信号进行时间轴上的压缩处理这样就自然的将干扰脉冲清除干净。3、算术平均滤波法a、方法:连续取n个采样值进行算术平均运算n值较大时:信号平滑度较高,但灵敏度较低n值较小时:信号平滑度较低,但灵敏度较高n值的选取:一般流量,n=12;压力:n=4b、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动c、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费ramd、算法:#define n 12char filter() 

22、;  int  sum = 0;   for ( count=0;count<n;count+)         sum + = get_ad();      delay();      return (char)(sum/n);e、实际的效果于中间值滤波效果类是,但是速度会快很多。4、递推平均滤波法(又称滑动平均滤波法)a、方法:把连续取n个采样值看成一个队列队列的长度固定为n每次采样到一

23、个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的n个数据进行算术平均运算,就可获得新的滤波结果n值的选取:流量,n=12;压力:n=4;液面,n=412;温度,n=14b、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统c、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费ramd、算法:#define n 12 char value_bufn;char i=0;char filter()   char count;   int 

24、sum=0;   value_bufi+ = get_ad();   if ( i = n )   i = 0;   for ( count=0;count<n,count+)      sum+ = value_bufcount;   return (char)(sum/n);5、中位值平均滤波法(又称防脉冲干扰平均滤波法)a、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样n个数据,去掉一个最大值和一个最小值然后计算n-2个数据

25、的算术平均值n值的选取:314b、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差c、缺点:测量速度较慢,和算术平均滤波法一样比较浪费ramd、算法:#define n 12char filter()   char count,i,j;   char value_bufn;   int  sum=0;   for  (count=0;count<n;count+)        

26、 value_bufcount = get_ad();      delay();      for (j=0;j<n-1;j+)         for (i=0;i<n-j;i+)               if ( value_bufi>value_bufi+1 ) 

27、60;                   temp = value_bufi;            value_bufi = value_bufi+1;              value_bu

28、fi+1 = temp;                     for(count=1;count<n-1;count+)      sum += valuecount;   return (char)(sum/(n-2);6、限幅平均滤波法a、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波

29、处理b、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差c、缺点:比较浪费ramd、算法:参考子程序1、3 7、一阶滞后滤波法a、方法:取a=01本次滤波结果=(1-a)*本次采样值+a*上次滤波结果b、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合c、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号d、算法:/* 为加快程序处理速度假定基数为100,a=0100 */#define a 50char value;char filter()   char 

30、 new_value;   new_value = get_ad();   return (100-a)*value + a*new_value; 8、加权递推平均滤波法a、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低b、优点:适用于有较大纯滞后时间常数的对象和采样周期较短的系统c、缺点:对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号不能迅速反应系统当前所受干扰的严重程度,滤波效果差d、算法:/* coe数组为加权系数表,存在程序存储区。

31、*/#define n 12char code coen = 1,2,3,4,5,6,7,8,9,10,11,12;char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;char filter()   char count;   char value_bufn;   int  sum=0;   for (count=0,count<n;count+)         value_bufcou

32、nt = get_ad();      delay();      for (count=0,count<n;count+)      sum += value_bufcount*coecount;   return (char)(sum/sum_coe); 9、消抖滤波法a、方法:设置一个滤波计数器将每次采样值与当前有效值比较:如果采样值当前有效值,则计数器清零如果采样值<>当前有效值,则计数器+1,并判断

33、计数器是否>=上限n(溢出)如果计数器溢出,则将本次值替换当前有效值,并清计数器b、优点:对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动c、缺点:对于快速变化的参数不宜如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统d、算法:#define n 12char filter()   char count=0;   char new_value;   new_value = get_ad();   while (value !=ne

34、w_value);         count+;      if (count>=n)   return new_value;       delay();      new_value = get_ad();      return value;     10

35、、限幅消抖滤波法a、方法:相当于“限幅滤波法”+“消抖滤波法”先限幅,后消抖b、优点:继承了“限幅”和“消抖”的优点改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统d、算法: 第一章 1、计算机控制系统是由哪几部分组成的?画出方框图并说明各部分的作用。 答:计算机控制系统由工业控制机、过程输入输出设备和生产过程三部分组成。 1)工业控制机主要用于工业过程测量、控制、数据采集、dcs操作员站等方面。 2)pio设备是计算机与生产过程之间的信息传递通道,在两者之间起到纽带和桥梁的作用。 3)生产过程就是整个系统工作的各种对象和各个环节之间的工作连接。2、计算机控制系统中的实时性、在线方式与离

36、线方式的含义是什么?为什么在 计算机控制系统中要考虑实时性? 答:1)实时性是指工业控制计算机系统应该具有的能够在限定时间内对外来事件做出反应的特性;在线方式是生产过程和计算机直接相连,并受计算机控制的方式;离线方式是生产过程不和计算机相连,并不受计算机控制,而是靠人进行联系并作相应操作的方式。 (2)实时性一般要求计算机具有多任务处理能力,以便将测控任务分解成若干并行执行的多个任务,加快程序执行速度;在一定的周期时间对所有事件进行巡查扫描的同时,可以随时响应事件的中断请求。3.计算机控制系统有哪几种典型形式?各有什么主要特点? 答:(1)操作指导系统(ois) 优点:结构简单、控制灵活和安全

37、。 缺点:由人工控制,速度受到限制,不能控制对象。(2)直接数字控制系统(ddc) 优点:实时性好、可靠性高和适应性强。(3)监督控制系统(scc) 优点:生产过程始终处于最有工况。(4)集散控制系统 优点:分散控制、集中操作、分级管理、分而自治和综合协调。(5)现场总线控制系统 优点:与dos相比降低了成本,提高了可靠性。(6)plc+上位系统 优点:通过预先编制控制程序实现顺序控制,用plc代替电器逻辑,提高了控制是现代灵活性、功能及可靠性。 第二章1、什么是工业控制计算机?它们有哪些特点? 答:工业控制计算机是将pc机的cpu高速处理性能和良好的开放式和总线结构体系引入到控制领域,是工业

38、自动化设备和信息产业基础设备的核心。 它们的特点如下: 可靠性高;实时性好;环境适应性强;模块化设计,完善的i/o通道;系统扩充性好;系统开放性好;控制软件包功能强。2、为什么要制定计算机总线标准?采用总线结构有哪些优点? 答: 从用户角度提出要求:为了实现兼容的目的,就要求各插件的几何尺寸相同,插头的插针数相同,插头上个插针的定义相同,以及控制插件工作的时序相同。 从工业控制机制造厂的角度出发:按总线标准生产插件,将使其产品的应用面更广,从而一个厂家不必生产工业控制机的全部插件,它只需生产本厂有专长的插件和oem产品即可。综上提出了对总线标准的要求。 工业控制机采用了总线以后,不仅可以提高系

39、统的效率和处理速度,简化工业控制机的系统结构,使系统易于扩充,而且大大简化系统硬件的设计过程,减轻了软件的设计和调试工作,缩短了软件研制周期,从而降低了系统的成本。另一方面总线的模板化结构设计也为系统的维修提供了方便。第三章2、计算机与模拟量输入接口交换信息有哪些种控制方式?它们各有什么优缺点? 答:程序查询方式:这种方法程序设计比较简单,可靠性高,但实时性差。因cpu大量的时间都花在“查询”上,因此只能用在实时性要求不高或控制回路较少的系统中。 延时采样方式:这种方式硬件设计简单,但信息传递比程序查询方式慢。 中断方式:cpu与a/d是并行工作的,从而提高了系统的工作效率。 dma方式:不经

40、过cpu的累加器中转,大大减少了数据传送的时间,使传输速率大大提高。3、模拟量输入接口设计主要解决哪几个方面的问题? 答:主要解决一下问题:数据输出线的连接方式;选通信号、启动转换及读出控制信号的连接方法;电源和地线的处理;与计算机信息传递的方式。4、模拟量输入通道有哪几部分组成? 答:模拟量输入通道一般由i/u变换,多路转换器、程控放大器、采样、保持器、a/d转换器、接口及控制逻辑等组成。5、采样/保持器的作用是什么?是否所有的模拟量输入通道中都需要采样/保持器?为什么? 答:计算机只能接收和处理时间离散的数码。它可以代表某一物理量的数值大小,也可以代表字符的约定代码,这些都称为数字信号。过

41、程控制中的大量信号时模拟信号,因此,计算机要获得原始信息,则应对模拟信号进行采样与量化,即将其转化成数字信号。7、隔离放大器分几种形式?各有什么特点? 答:(1)变压器耦合隔离放大器:线性和稳定性好,隔离电压和共模抑制比高,应用电路简单,频带较宽;(2)主要起到抗共模干扰和良好的安全保障作用。8、一个8位a/d转换器,孔径时间为100s,如果要求转换误差在a/d转换器的转换精度(0.4%)内,求允许转换的正弦波模拟信号的最大频率是多少? 答:第四章1、滤波的作用是什么?数字滤波与硬件滤波相比有和特点? 答:通过模拟量输入通道采集到生产过程的各种物理参数,如温度、压力、流量、料位和成分等。这原始

42、数据中可能混杂了干扰噪声,需要进行数字滤波;也可能与实际物理量成非线性关系需要进行线性化处理。为了能到真实有效的数据,有必要度采集的原始数据进行数字滤波和数据处理。 所谓数字滤波,就是在计算机中用某种计算方法对输入的信号进行数学处理,以便减少干扰在有用信号中的比重,提高信号的真实性。这种滤波方法不需要增加硬设备,只需要根据预定的滤波算法编制相应的程序即可可达到信号滤波的目的。2、常用的数字滤波方法有哪几种?分别使用于什么场合?怎样综合运用这几种滤波方法? 答:常用的数字滤波方法有:限幅滤波法,中位滤波法,平均值滤波法和惯性滤波法。平均值滤波法使用于周期性干扰,中位值滤波法和限幅滤波法适用于偶然

43、的脉冲干扰,惯性滤波法适用于高频及低频的干扰信号,加权平均值滤波法适用于纯迟延较大的被控制对象。如果同时采用几种滤波方法,一般先用中位值滤波法或限幅滤波法,然后再用平均值滤波法。4、数字pid控制算法的位置式算式和增量式算式的本质是否一样,试分析两者的区别。 答:位置式pid数字控制器的输出时全量输出,是执行机构所应达到的位置,数字控制器的输出跟过去的状态有关,计算机的运算工作量大,需要对e(k)作累加,而且,计算机的故障有肯能使输出作大幅度的变化,这种情况在往往在生产实践中不允许的,而且有些场合可能造成严重的事故。 增量式pid数字控制器是位置式的一种改进。该方法较为安全,在计算时不需要进行

44、累加,仅需要最近几次误差的采样值。5、数字pid控制为何采用积分分离,采用积分分离有时又会出现残差是和原因,怎样避免? 答:系统中加积分校正以后,会产生积分饱和和过大的超调量,这对某些生产过程是绝对不允许的,引进积分分离算法,既保持了积分的作用,又减小了超调量,使得控制性能有了较大的改善。积分分离算法要设置积分分离阀eo,当e(k)eo时,也即偏差值e(k)比较小时,采用pid控制,可保证系统的控制精度。6、数字pid控制为何采用抗积分饱和?怎样防止积分饱和? 答:当控制量进入饱和区后,只执行消弱积分项的累加,而不进行增大积分项的累加。抗积分饱和算法的抗积分饱和依据是抗积分饱和算法系统最终的控制输出u(k)。7、实际微分pid控制算法与理想微分pid控制算法相比有何优点? 为什么? 答:理想微分pid算法的微分作用仅局限于一个采样周期有一个大幅度的输出,在实际使用时会产出两方面的问题:一是控制输出可能超过执行机构或d/a转换的上下限;二是执行机构的响应速度可能跟不上,无法在短时间内跟踪这种较大的微分输出。这样在大的干扰作用情况下,一方面会是算法中的微分不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论