当前位置:文档之家› 温度控制的PID算法的C语言程序

温度控制的PID算法的C语言程序

我的题目是:基于PID算法的温度控制系统89C51单片机,通过键盘输入预设值,与DS18B20测得的实际值做比较,然后驱动制冷或加热电路。

用keil C语言来实现PID的控制。

最佳答案7f0f2f1c2f89C89C89C1 L50℃3℃2006-02-172009-04-232009-04-232009-04-242009-04-242009-10-11超低温漂移高精度运算放大器0P07将温度一电压信号进行放大,便于A/D进行转换,以提高温度采集电路的可靠性。

模拟电路硬件部分见图2。

图2 ?温度电压转换电路电控制执行电路的设计??? 由输出来控制电炉,电炉可以近似建立为具有滞后性质的一阶惯性环节数学模型。

其传递函数形式为:??? 可控硅可以认为是线形环节实现对水温的控制。

单片机输出与电炉功率分别属于弱电与强电部分,需要进行隔离处理,这里采用光耦元件TLP521 在控制部分进行光电隔离,此外采用变压器隔离实现弱强电的电源隔离。

??? 单片机PWM 输出电平为0 时,光耦元件导通,从而使三极管形成有效偏置而导通,通过整流桥的电压经过集电极电阻以及射集反向偏压,有7V 左右的电压加在双向可控硅控制端,从而使可控硅导通,交流通路形成,电阻炉工作;反之单片机输出电平为0 时,光耦元件不能导通,三极管不能形成有效偏置而截止,可控硅控制端电压几乎为零,可控硅截止从而截断交流通路,电炉停止工作。

此外,还有越限报警,当温度低于下限时发光二极管亮;高上限时蜂鸣器叫。

控制执行部分的硬件电路如下:图3? 控制执行部分电路3 键盘及显示的设计??? 键盘采用软件查询和外部中断相结合的方法来,低电平有效。

图3 中按键AN1,AN2,AN3,AN4, AN5的功能定义如表1所示。

??? 按键AN3与相连,采用外部中断方式,并且优先级定为最高;按键AN5和AN4分别与和相连,采用软件查询的方式;AN1则为硬件复位键,与R、C构成复位电路。

??????????????????? 表1 按键功能??? 显示采用3位共阳LED静态显示方式,显示内容有温度值的十位、个位及小数点后一位,这样可以只用(RXD)口来输出显示数据,从而节省了单片机端口资源,在口和(TXD)的控制下通过74LS164来实现3位静态显示。

数字电路硬件部分见图:图4? 数字硬件电路示意图三?系统软件设计??? 系统的软件由三大模块组成:主程序模块、功能实现模块和运算控制模块。

1 主程序模块??? 在主程序中首先给定PID算法的参数值,然后通过循环显示当前温度,并且设定键盘外部中断为最高优先级,以便能实时响应键盘处理;软件设定定时器T0为5秒定时,在无键盘响应时每隔5秒响应一次,以用来采集经过A/D转换的温度信号;设定定时器T1为嵌套在T0之中的定时中断,初值由PID算法子程序提供。

在主程序中必须分配好每一部分子程序的起始地址,形式如下:?????????? ORG? 0000H?????????? AJMP? MAIN?????????? ORG? 0003H?????????? AJMP? INTO?????????? ORG? 000BH?????????? AJMP? TT0?????????? ORG? 001BH????????????? AJMP? TT1?主程序流程图见图5。

2 功能实现模块??? 以用来执行对可控硅及电炉的控制。

功能实现模块主要由A/D转换子程序、中断处理子程序、键盘处理子程序、显示子程序等部分组成。

T0中断子程序??? 该中断是单片机内部5s定时中断,优先级设为最低,但却是最重要的子程序。

在该中断响应中,单片机要完成A/D数据采集转换、数字滤波、判断是否越限、标度转换处理、继续显示当前温度、与设定值进行比较,调用PID算法子程序并输出控制信号等功能。

T1中断子程序???? T1定时中断嵌套在T 中断之中,优先级高于T 中断,其定时初值由PID算法子程序提供,T1中断响应的时间用于输出可控硅(电炉)的控制信号。

3? 运算控制模块??? 运算控制模块涉及标度转换、PID算法、以及该算法调用到的乘法子程序等。

标度转换子程序??? 该子程序作用是将温度信号(00H~FFH)转换为对应的温度值,以便送显示或与设定值在相同量纲下进行比较。

所用线形标度变换公式为:式中,Ax:实际测量的温度值;Nx:经过A/D转换的温度量;Am =90; Ao=40; Nm =FEH; No=01H;??? 单片机运算采用定点数运算,并且在高温区和低温区分别用程序作矫正处理,温度计测量值与LED显示见图7。

PID算法子程序??? 系统算法控制采用工业上常用的位置型PID数字控制,并且结合特定的系统加以算法的改进,形成了变速积分PID一积分分离PID控制相结合的自动识别的控制算法。

该方法不仅大大减小了超调量(见图9),而且有效地克服了积分饱和的影响,使控制精度大大提高。

PID控制算法的流程图如图8。

图7? 温度计测量值与报警方式图图8? PID控制算法流程图图9中,初始水温为26 C。

实现思想:Ui(k)为第k次采样温度值,Ur 为设定值。

e(k) ≥ε 使用PD算法;e(k) <ε使用变速积分PID算法。

图9 温度控制曲线图四? 源程序??? 本设计方案软件实现完全使用汇编程序语言。

具体源程序略。

五? 结果分析论述??? 本文针对电热锅炉温度控制系统模型,提出了一种基于单片机AT89S51的设计方案。

设计中运用PID 算法更新T1的定时常数,PWM输出控制可控硅的通断,从而实现对温度的连续控制。

设计结果由图7和图9可以看出:本设计的控制器工作稳定,控制精度高,改进的PID算法超调量大大降低;软件采用模块化结构,提高了通用性。

本设计的目的不仅仅是温度控制本身,主要提供了单片机外围电路及软件包括控制算法设计的思想,应该说,这种思想比控制系统本身更为重要[求助]如果用PID算法控制温度要怎么做?小弟的毕业设计是做个温度控制系统,可PID控制那块儿我是一点不会啊。

眼看时间就要到了,那位大哥,各路高手能不能给段C程序啊。

是以18B20为传感器TOP单片机教授初窥门径••••当前离线2#大中小发表于2009-5-23 19:13?参考下我收藏的#i nclude <>#i nclude<>struct _pid {int pv; /*integer that contains the processvalue*/int sp; /*integer that contains the setpoint*/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_initDESCRIPTION This function initializes the pointers in the _pid structureto the process variable and the setpoint. *pvand *sp areinteger pointers.------------------------------------------------------------------------*/void pid_init(struct _pid *warm, intprocess_point, int set_point){struct _pid *pid;pid = warm;pid->pv = process_point;pid->sp = set_point;}/*------------------------------------------------------------------------pid_tuneDESCRIPTION Sets the proportional gain(p_gain), integral gain (i_gain),derivitive gain (d_gain), and the dead band(dead_band) ofa pid control structure _pid.------------------------------------------------------------------------*/void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, intdead_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_setintegDESCRIPTION Set a new value for the integral term of the pid equation.This is useful for setting the initial outputof thepid controller at start up.------------------------------------------------------------------------*/void pid_setinteg(struct _pid *pid,floatnew_integ){pid->integral = new_integ;pid->last_error = 0;}/*------------------------------------------------------------------------pid_bumplessDESCRIPTION Bumpless transfer algorithim.When suddenly changingsetpoints, or when restarting the PIDequation after anextended pause, the derivative of theequation can causea bump in the controller output. Thisfunction will helpsmooth out that bump. The process value in*pv shouldbe the updated just before this function isused.------------------------------------------------------------------------*/void pid_bumpless(struct _pid *pid){pid->last_error = (pid->sp)-(pid->pv);}/*------------------------------------------------------------------------pid_calcDESCRIPTION Performs PID calculations for the _pid structure *a. This function uses the positional form of the pid equation, andincorporates 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 pidloop.USAGE #i nclude ""*/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 floatconversion only once*/pterm = pid->pgain * ferror;if (pterm > 100 || pterm < -100){pid->integral = ;}else{pid->integral += pid->igain * ferror;if (pid->integral >{pid->integral = ;}else if (pid->integral < pid->integral = ;}dterm = ((float)(err - pid->last_error)) *pid->dgain;result = pterm + pid->integral + dterm;}else result = pid->integral;pid->last_error = err;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");// scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain);process_point = 30;set_point = 40;p_gain = (float);i_gain = (float);d_gain = (float);dead_band = 2;integral_val =(float);printf("The values of Process point, Set point, P gain, I gain, D gain \n");printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain,d_gain);printf("Enter the values of Processpoint\n");while(count<=20){scanf("%d",&process_point);pid_init(&warm, process_point,set_point);pid_tune(&warm,p_gain,i_gain,d_gain,dead_band);pid_setinteg(&warm,;//pid_setinteg(&warm,;//Get input value for process pointpid_bumpless(&warm);// how to display outputdisplay_value = pid_calc(&warm);printf("%f\n", display_value);//printf("\n%f%f%f%f",,,,;count++;}}看贴必回帖TOP单片机高中生••3#大中小发表于2009-5-23 19:49?谢谢••当前离线TOP单片机教授••••当前离线4#大中小发表于2009-5-23 19:49?看看承接:单片机项目及毕业设计QQ? ?:? ? 3TEL :? ?TOP单片机高中生••••当前离线5#大中小发表于2009-6-16 18:26?谢谢,万分感谢。

相关主题