基于单片机淬火炉温温度控制课程设计(4)

2019-04-22 18:33

sbit DOUT=P2^3; sbit SCLK=P2^4; sbit CS=P2^5; sbit le=P2 ^ 1; sbit oe=P2 ^ 2; sbit RELAY=P2^6; sbit KS0=P1^0; sbit KS1=P1^1; sbit KS2=P1^2;

uchar code LcdBuf1[]= {%uchar code LcdBuf2[]= {%uchar Vref=5; uchar a[6]; uchar g[6];

unsigned char sumout; uint SET_TEMP=650;

unsigned int read_max6675(void) { unsigned char i; unsigned int AD=0;

CS=0;

SCLK=0; /*输出数据D15*/

SCLK=1;

for(i=12;i>0;i--) /*读取转换结果*/ { SCLK=0;

if(DOUT==1)

AD++;

AD=AD<<1; /*数据左移*/

SCLK=1;

} SCLK=0;

16

//flag=SO;/*读取D2断偶标志*/ SCLK=1;

SCLK=0;

/*输出数据D1*/

SCLK=1;

SCLK=0;

/*输出数据D0*/

SCLK=1;

CS=1; }

unsigned ADC1() {

long l; uint q=0; return AD;

l=read_max6675();

l=(24489/4100)*l*Vref+1; //转换为电压值

l=l+7500;

g[0]=(l/10000)+'0'; //取得整数值到数组 g[1]=(l/1000)+'0'; g[2]=(l/100)+'0'; //a[3]='.';

//忽略小数

//a[4]=t+'0';

q=(g[0]-'0')*100+(g[1]-'0')*10+(g[2]-'0'); return q ; }

void ADC() {

long t;

17

t=read_max6675();

t=(24489/4100)*t*Vref+1;

//转换为电压值

t=t+7500; a[0]=(t/10000)+'0'; //取得整数值到数组 a[1]=(t/1000)+'0';

a[2]=(t/100)+'0';

}

void constant_temperature()

//恒温{

uint b; b=(a[0]-'0')*100+(a[1]-'0')*10+(a[2]-'0'); if(b<=SET_TEMP) {

RELAY=0; m=SET_TEMP-b; m=(unsigned char)(m/256);

}

else

{

RELAY=1; m=SET_TEMP-b; m=(unsigned char)(m/256); }

}

void delay_ms(uchar ms) {

uint i,j;

for(i=0;i

18

}

for(j=0;j<120;j++);

typedef struct {

double SetPoint; /* 设定目标 Desired Value */

double Proportion; /* 比例常数 Proportional Const */

double Integral; /* 积分常数 Integral Const */ double Derivative; /* 微分常数 Derivative Const */

double LastError; /* 前一项误差 */ double PrevError; /* 前第二项误差 */ double SumError; /* 总误差 */ } PID;

/**************************************************************************** PID计算部分

****************************************************************************/

double PIDCalc( PID *pp, double NextPoint ) {

double dError,Error;

double SetPoint;

SetPoint=SET_TEMP;

Error = pp->SetPoint - NextPoint; /* 计算当前偏差 */ pp->SumError += Error; /* 积分《总偏差》*/ dError = pp->LastError - pp->PrevError; /* 当前微分 */ pp->PrevError = pp->LastError;

19

pp->LastError = Error; /* 三个误差值移位 */ return(NextPoint+pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError ); /*《返回总的误差值》*/ }

void pid(void) {

PID sPID; double rOut; unsigned char rIn; double x;

sPID.Proportion = 0.36; sPID.Integral = 0.0006; sPID.Derivative = 1.8; sPID.SetPoint = 2.0; {

unsigned char sumout; 进入循环检测状态中 */ unsigned char i;

rIn = ADC1(); for(i=0;i<50;i++)

x = 5.0 * (double)rIn / 256.0; rOut = PIDCalc ( &sPID,x ); sumout=rOut*256/5; } }

void dac0832(out) {

/* 定义PID结构体变量 */ /* PID 响应输出 */ /* PID 反馈 (Input) */ /* 设置 PID 比例系数 */ /* 设置PID积分系数 */ /* 设置PID微分系数 */ /* 设置 PID 输出值 */ /* PID /* 读传感器输出 */ /* 计算PID 输出 */ 20


基于单片机淬火炉温温度控制课程设计(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:宿州海螺一期工程创优规划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: