PID算法C语言

更新时间:2024-01-28 10:49:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

PID算法(c语言) #include #include struct _pid {

int 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 _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, 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,死区

//----------------------------------------------

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 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 setpoints, 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 实现无扰切换

当突然改变设定值时,或重新启动后,将引起扰动输出。这个函数将能实现平顺扰动,在调用该函数之前需要先更新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 integral 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 \

本函数使用位置式PID计算方式,并且采取了积分饱和限制运算

PID计算

//--------------------------------float pid_calc(struct _pid *pid) {

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 = 0.0; } else {

// 积分项

pid->integral += pid->igain * ferror;

// 输出为0--100%

// 如果计算结果大于100,则等于100 if (pid->integral > 100.0) {

pid->integral = 100.0; }

// 如果计算结果小于0.0,则等于0 else if (pid->integral < 0.0) pid->integral = 0.0;

}

// 微分项

dterm = ((float)(err - pid->last_error)) * pid->dgain;

result = pterm + pid->integral + dterm; } else

result = pid->integral; // 在死区范围内,保持现有输出

// 保存上次偏差 pid->last_error = err;

// 输出PID值(0-100) return (result); }

//--------------------------------void main(void) {

float display_value; int count=0; pid = &warm;

// printf(\// scanf(\

&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(\printf(\d_gain);

printf(\while(count<=20) {

scanf(\

// 设定PV,SP值

pid_init(&warm, process_point, set_point);

// 初始化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 point pid_bumpless(&warm);

// how to display output

display_value = pid_calc(&warm);

printf(\

//printf(\

count++; } }

基本的数字滤波方法及算法实现

1、限幅滤波法(又称程序判断滤波法) A、方法:

根据经验判断,确定两次采样允许的最大偏差值(设为A); 每次检测到新值时判断:

如果本次值与上次值之差<=A,则本次值有效;

如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值; B、优点:

能有效克服因偶然因素引起的脉冲干扰; C、缺点

无法抑制那种周期性的干扰; 平滑度差; D、算法:

/* A值可根据实际情况调整

value为有效值,new_value为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char value; char filter() {

char new_value; new_value = get_ad();

if ( ( new_value - value > A ) || ( value - new_value > A ) return value; return new_value; }

2、中位值滤波法 A、方法:

连续采样N次(N取奇数)

把N次采样值按大小排列 取中间值为本次有效值 B、优点:

能有效克服因偶然因素引起的波动干扰

对温度、液位的变化缓慢的被测参数有良好的滤波效果 C、缺点:

对流量、速度等快速变化的参数不宜,非常占用时间,如果不使用冒泡算法的话相对会快一点。

D、算法

/* N值可根据实际情况调整 排序采用冒泡法*/ #define N 11 char filter() {

char value_buf[N]; char count,i,j,temp;

for ( count=0;count

value_buf[count] = get_ad(); delay(); }

for (j=0;j

for (i=0;i

if ( value_buf[i]>value_buf[i+1] ) {

temp = value_buf[i];

value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp;

} } }

return value_buf[(N-1)/2]; }

E、实际的效果

通过中间值选取,可以将信号压缩,这样针对缓慢变化的信号可以利用这个方法对信号进行时间轴上的压缩处理这样就自然的将干扰脉冲清除干净。

3、算术平均滤波法 A、方法:

连续取N个采样值进行算术平均运算 N值较大时:信号平滑度较高,但灵敏度较低 N值较小时:信号平滑度较低,但灵敏度较高 N值的选取:一般流量,N=12;压力:N=4 B、优点:

适用于对一般具有随机干扰的信号进行滤波

这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动 C、缺点:

对于测量速度较慢或要求数据计算速度较快的实时控制不适用 比较浪费RAM D、算法: #define N 12 char filter() {

int sum = 0;

for ( count=0;count

sum + = get_ad(); delay(); }

return (char)(sum/N); }

E、实际的效果

于中间值滤波效果类是,但是速度会快很多。 4、递推平均滤波法(又称滑动平均滤波法) A、方法:

把连续取N个采样值看成一个队列 队列的长度固定为N

每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则) 把队列中的N个数据进行算术平均运算,就可获得新的滤波结果

N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 B、优点:

对周期性干扰有良好的抑制作用,平滑度高 适用于高频振荡的系统 C、缺点: 灵敏度低

对偶然出现的脉冲性干扰的抑制作用较差 不易消除由于脉冲干扰所引起的采样值偏差 不适用于脉冲干扰比较严重的场合 比较浪费RAM D、算法: #define N 12 char value_buf[N]; char i=0; char filter() {

char count; int sum=0;

value_buf[i++] = get_ad(); if ( i == N ) i = 0;

for ( count=0;count

5、中位值平均滤波法(又称防脉冲干扰平均滤波法) A、方法:

相当于“中位值滤波法”+“算术平均滤波法”

连续采样N个数据,去掉一个最大值和一个最小值 然后计算N-2个数据的算术平均值 N值的选取:3~14 B、优点:

融合了两种滤波法的优点

对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差 C、缺点:

测量速度较慢,和算术平均滤波法一样 比较浪费RAM D、算法: #define N 12 char filter() {

char count,i,j; char value_buf[N]; int sum=0;

for (count=0;count

value_buf[count] = get_ad(); delay(); }

for (j=0;j

for (i=0;i

if ( value_buf[i]>value_buf[i+1] ) {

temp = value_buf[i];

value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp; } } }

for(count=1;count

6、限幅平均滤波法 A、方法:

相当于“限幅滤波法”+“递推平均滤波法” 每次采样到的新数据先进行限幅处理, 再送入队列进行递推平均滤波处理 B、优点:

融合了两种滤波法的优点

对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差 C、缺点: 比较浪费RAM D、算法: 参考子程序1、3

7、一阶滞后滤波法 A、方法: 取a=0~1

本次滤波结果=(1-a)*本次采样值+a*上次滤波结果 B、优点:

对周期性干扰具有良好的抑制作用 适用于波动频率较高的场合 C、缺点:

相位滞后,灵敏度低 滞后程度取决于a值大小

不能消除滤波频率高于采样频率的1/2的干扰信号 D、算法:

/* 为加快程序处理速度假定基数为100,a=0~100 */ #define a 50 char value; char filter() {

char new_value; new_value = get_ad();

return (100-a)*value + a*new_value; }

8、加权递推平均滤波法 A、方法:

是对递推平均滤波法的改进,即不同时刻的数据加以不同的权 通常是,越接近现时刻的数据,权取得越大。

给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低 B、优点:

适用于有较大纯滞后时间常数的对象和采样周期较短的系统 C、缺点:

对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差 D、算法:

/* coe数组为加权系数表,存在程序存储区。*/

#define N 12

char code coe[N] = {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_buf[N]; int sum=0;

for (count=0,count

value_buf[count] = get_ad(); delay(); }

for (count=0,count

9、消抖滤波法 A、方法:

设置一个滤波计数器

将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零

如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出) 如果计数器溢出,则将本次值替换当前有效值,并清计数器 B、优点:

对于变化缓慢的被测参数有较好的滤波效果,

可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动 C、缺点:

对于快速变化的参数不宜

如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

D、算法: #define N 12 char filter() {

char count=0; char new_value; new_value = get_ad(); while (value !=new_value); {

count++;

if (count>=N) return new_value; delay();

new_value = get_ad(); }

return value; }

10、限幅消抖滤波法 A、方法:

相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖 B、优点:

继承了“限幅”和“消抖”的优点

改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统 D、算法:

第一章

1、计算机控制系统是由哪几部分组成的?画出方框图并说明各部分的作用。 答:计算机控制系统由工业控制机、过程输入输出设备和生产过程三部分组成。

1)工业控制机主要用于工业过程测量、控制、数据采集、DCS操作员站等方面。 2)PIO设备是计算机与生产过程之间的信息传递通道,在两者之间起到纽带和桥梁的作用。

3)生产过程就是整个系统工作的各种对象和各个环节之间的工作连接。

2、计算机控制系统中的实时性、在线方式与离线方式的含义是什么?为什么在 计算机控制系统中要考虑实时性? 答:1)实时性是指工业控制计算机系统应该具有的能够在限定时间内对外来事件做出反应的特性;在线方式是生产过程和计算机直接相连,并受计算机控制的方式;离线方式是生产过程不和计算机相连,并不受计算机控制,而是靠人进行联系并作相应操作的方式。

(2)实时性一般要求计算机具有多任务处理能力,以便将测控任务分解成若干并行执行的多个任务,加快程序执行速度;在一定的周期时间对所有事件进行巡查扫描的同时,可以随时响应事件的中断请求。

3.计算机控制系统有哪几种典型形式?各有什么主要特点? 答:(1)操作指导系统(OIS)

优点:结构简单、控制灵活和安全。

缺点:由人工控制,速度受到限制,不能控制对象。 (2)直接数字控制系统(DDC)

优点:实时性好、可靠性高和适应性强。 (3)监督控制系统(SCC)

优点:生产过程始终处于最有工况。 (4)集散控制系统

优点:分散控制、集中操作、分级管理、分而自治和综合协调。 (5)现场总线控制系统

优点:与DOS相比降低了成本,提高了可靠性。 (6)PLC+上位系统

优点:通过预先编制控制程序实现顺序控制,用PLC代替电器逻辑,提高了控制是现代灵活性、功能及可靠性。

第二章

1、什么是工业控制计算机?它们有哪些特点?

答:工业控制计算机是将PC机的CPU高速处理性能和良好的开放式和总线结构体系引入到控制领域,是工业自动化设备和信息产业基础设备的核心。

它们的特点如下: 可靠性高;实时性好;环境适应性强;模块化设计,完善的I/O通道;系统扩充性好;系统开放性好;控制软件包功能强。

2、为什么要制定计算机总线标准?采用总线结构有哪些优点?

答: 从用户角度提出要求:为了实现兼容的目的,就要求各插件的几何尺寸相同,插头的插针数相同,插头上个插针的定义相同,以及控制插件工作的时序相同。

从工业控制机制造厂的角度出发:按总线标准生产插件,将使其产品的应用面更广,从而一个厂家不必生产工业控制机的全部插件,它只需生产本厂有专长的插件和OEM产品即可。综上提出了对总线标准的要求。 工业控制机采用了总线以后,不仅可以提高系统的效率和处理速度,简化工业控制机的

系统结构,使系统易于扩充,而且大大简化系统硬件的设计过程,减轻了软件的设计和调试工作,缩短了软件研制周期,从而降低了系统的成本。另一方面总线的模板化结构设计也为系统的维修提供了方便。

第三章

2、计算机与模拟量输入接口交换信息有哪些种控制方式?它们各有什么优缺点?

答:①程序查询方式:这种方法程序设计比较简单,可靠性高,但实时性差。因CPU大量的时间都花在“查询”上,因此只能用在实时性要求不高或控制回路较少的系统中。 ②延时采样方式:这种方式硬件设计简单,但信息传递比程序查询方式慢。 ③中断方式:CPU与A/D是并行工作的,从而提高了系统的工作效率。

④DMA方式:不经过CPU的累加器中转,大大减少了数据传送的时间,使传输速率大大提高。

3、模拟量输入接口设计主要解决哪几个方面的问题?

答:主要解决一下问题:数据输出线的连接方式;选通信号、启动转换及读出控制信号的连接方法;

电源和地线的处理;与计算机信息传递的方式。 4、模拟量输入通道有哪几部分组成?

答:模拟量输入通道一般由I/U变换,多路转换器、程控放大器、采样、保持器、A/D转换器、接口及控制逻辑等组成。

5、采样/保持器的作用是什么?是否所有的模拟量输入通道中都需要采样/保持器?为什么?

答:计算机只能接收和处理时间离散的数码。它可以代表某一物理量的数值大小,也可以代表字符的约定代码,这些都称为数字信号。过程控制中的大量信号时模拟信号,因此,计算机要获得原始信息,则应对模拟信号进行采样与量化,即将其转化成数字信号。 7、隔离放大器分几种形式?各有什么特点? 答:(1)变压器耦合隔离放大器:线性和稳定性好,隔离电压和共模抑制比高,应用电路简单,频带较宽;(2)主要起到抗共模干扰和良好的安全保障作用。

8、一个8位A/D转换器,孔径时间为100μs,如果要求转换误差在A/D转换器的转换精度(0.4%)内,求允许转换的正弦波模拟信号的最大频率是多少? 答:

第四章

1、滤波的作用是什么?数字滤波与硬件滤波相比有和特点?

答:通过模拟量输入通道采集到生产过程的各种物理参数,如温度、压力、流量、料位和成分等。这原始数据中可能混杂了干扰噪声,需要进行数字滤波;也可能与实际物理量成非线性关系需要进行线性化处理。为了能到真实有效的数据,有必要度采集的原始数据进行数字滤波和数据处理。 所谓数字滤波,就是在计算机中用某种计算方法对输入的信号进行数学处理,以便减少干扰在有用信号中的比重,提高信号的真实性。这种滤波方法不需要增加硬设备,只需要根据预定的滤波算法编制相应的程序即可可达到信号滤波的目的。

2、常用的数字滤波方法有哪几种?分别使用于什么场合?怎样综合运用这几种滤波方法? 答:常用的数字滤波方法有:限幅滤波法,中位滤波法,平均值滤波法和惯性滤波法。平均值滤波法使用于周期性干扰,中位值滤波法和限幅滤波法适用于偶然的脉冲干扰,惯性

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

增量式PID数字控制器是位置式的一种改进。该方法较为安全,在计算时不需要进行累加,仅需要最近几次误差的采样值。 5、数字PID控制为何采用积分分离,采用积分分离有时又会出现残差是和原因,怎样避免? 答:系统中加积分校正以后,会产生积分饱和和过大的超调量,这对某些生产过程是绝对不允许的,引进积分分离算法,既保持了积分的作用,又减小了超调量,使得控制性能有了较大的改善。积分分离算法要设置积分分离阀Eo,当│e(k)│≤│Eo│时,也即偏差值│e(k)│比较小时,采用PID控制,可保证系统的控制精度。 6、数字PID控制为何采用抗积分饱和?怎样防止积分饱和?

答:当控制量进入饱和区后,只执行消弱积分项的累加,而不进行增大积分项的累加。抗积分饱和算法的抗积分饱和依据是抗积分饱和算法系统最终的控制输出u(k)。 7、实际微分PID控制算法与理想微分PID控制算法相比有何优点? 为什么?

答:理想微分PID算法的微分作用仅局限于一个采样周期有一个大幅度的输出,在实际使用时会产出两方面的问题:一是控制输出可能超过执行机构或D/A转换的上下限;二是执行机构的响应速度可能跟不上,无法在短时间内跟踪这种较大的微分输出。这样在大的干扰作用情况下,一方面会是算法中的微分不能充分发挥作用,另一方面也会对执行机构产生一个大的冲击作用。相反,不完全微分PID算法由于惯性滤波的存在,是微分作用可持续多个采样周期,有效的避免了上述问题的上述问题的产生,因而具有更好的控制性能。 8、数字PID控制算法的偏差微分和测量值微分的区别在何处?

答:当软开关DV/PV切向DV位置时,则选用偏差微分方式;当软开关DV/PV切向PV位置式则选用测量微分方式。

9、数字PID控制器中输出保持和输出安全的物理含义分别是什么?两者的区别何在? 答:输出保持:当软开关FH/NH切向NH位置时,现时刻的控制量u(k)等于前一时刻的控制量u(k-1),也就是说,输出控制量保持不变。当软开关FH/NH切向FH位置时,又恢复正常输出方式。软开关FH/NH状态一般来自系统安全报警开关。安全输出:当软开关FS/NS切向NS位置时,现时刻的控制量等于预置的安全输出量MS。当软开关FS/NS切向FS位置时,又恢复正常输出方式。软开关FS/NS状态一般来自系统安全报警开关。 13、多变量控制系统解耦的条件是什么? 答:系统的闭环传递矩阵Wb (s)为对角线矩阵。

14、模糊控制器由哪几部分组成?各有何作用?

答:模糊控制系统的控制器是模糊控制器.其系统框图如下:

第五章

1、干扰信号的来源可分为哪几种?

答:依据干扰的来源不同,工业控制计算机系统的外部干扰可以分为三类,即电源干扰、空间干扰、设备干扰。

2、干扰信号进入到计算机控制系统中的主要耦合方式有哪几种?各有何特点?

答:可分为四类:静电耦合方式、电磁耦合方式、共阻抗耦合方式、电磁场辐射耦合方式。

⑴静电耦合方式:当两根导线平行的放置一定距离时,该两根导线之间的电容就构成了它们相互间的电容性耦合。其作用机理是一根导线在另一根导线的静电场中时,必然受到该电场的影响。

⑵电磁耦合方式:在设备内部,线圈或变压器的漏磁就是一个很大的 干扰源;在设备外部,当两根导线在较长的距离内敷设或架设时,将会产生电磁干扰。 ⑶共阻抗耦合方式:当两个电路的电流经一个公阻抗时,一个电路在 该阻抗上所产生的电压降会影响到另一个电路,该种耦合方式称为公共阻抗耦合方式。 ⑷电磁场辐射耦合方式:电磁场辐射干扰是一种无规则的干扰,它极 易通过电源而耦合到系统中。另外,过长的信号输入线和输出线以及控制线具有天线效应,它们既能接收干扰波,又能辐射干扰波。

3、简述空间干扰的措施? 答:主要采取的措施有:

①空间隔离:使敏感设备或信号线远离干扰源(如大型动力设备及大变压器等) ②屏蔽:对敏感电路加屏蔽盒或对信号叫屏蔽层。

③电气布线:合理地选择信号线,并在实际施工中正确的敷设信号线来抑制干扰。 6、什么是系统的可靠性,提高计算机控制系统的可靠性有哪些主要途径?

答:可靠性指机器、零件或系统,在规定的工作条件下,在规定的时间内具有正常工作性能的能力。

提高计算机系统硬件可靠性的措施有:冗余结构设计,不易发生故障的硬件设计。 提高计算机控制系软件可靠性的措施有:分散结构设计,容错技术,指令冗余,信息冗余,标准化。

第六章

1.工业企业的网络控制结构是如何划分的? 答:按网络层次结构,可将企业的网络系统划分为三层:控制网、企业的内部网、互联网。 2、什么是工业网络?工业网络有哪几部分组成?

第九章

1、简述计算机控制系统设计的原则和一般步骤。

答:原则:满足工艺要求, 安全可靠,操作、维护与维修方便 ,实时性强, 通用性好 , 经济效益高

步骤:生产工艺和现场环境调研、硬件总体方案设计、软件总体方案设计、系统总体方案 2、简述计算机控制的总体设计方案的主要内容。 答:

本文来源:https://www.bwwdw.com/article/xilw.html

Top