温度控制实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
温度控制实习报告
姓名:周礼
组员:周礼、夏志
学院:自动化学院
班级: 231131
专业:自动化
指导老师:金星
实验一、硬件电路的掌握
实验目的:综合了解温度控制硬件电路,为下阶段实习打好基础。
实验内容:系统的了解本装置的基本电路,分析各个电路的实现的功能以及其是如何实现的。
掌握以下几部分电路原理:
1、显示电路。
2、电热杯温度检测以及显示电路。
3、电热杯温度控制接口电路。
4、串口通信电路。
5、扰动调节电路。
通过对硬件电路的学习与分析,掌握了温度控制需要的接口及其功能,对实验有个总体的认知与构思:
P2.1:温度采集口
P1.3/P1.4:温度控制接口
P2.3/P2.2:电机控制接口
P1.5/P1.6/P1.7: 38译码器的输入,选择八段管接口
实验二:温度检测、显示以及在数码管上显示时钟(秒表)
实验目的:1.熟悉和了解单片机。
2.能够熟练运用单片机编程软件和C语言。
实验内容:
利用实验装置中的DS18B20采集温度,并将采集到的数据发送给单片机,用LED显示。
1.了解DS18B20的使用方法,看懂DS18B20的时序图并根据时序图编程。
3.通过实验了解单片机如何进行数据采集。
4.利用实验设备箱,实现秒表功能。
5. 将采集到的温度在数码管上显示。
温度采集:由温度采集程序将采集的温度数字量通过数组返回到主函数,得到的数字量乘以0.0625才是实际的温度,所以有以下数据转换函数:void covert1(void) //将温度转换为数码管显示的数据
{
;
t[1]<<=4; //将高字节左移4位
t[1]=t[1]&0x70; //取出高字节的3个有效数字位
x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它
x>>=4; //右移4位
x=x&0x0f; //和前面两句就是取出t[0]的高四位
t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节
t[0]=t[0]&0x0f; //取有效的两位小数
// t[0]>>=3; //右移两位,以便查表
x=t[0];
t[0]=dotcode[x]; //查表换算成实际的小数
}
转换之后温度实际的值以整数部分存在t[1],小数部分存在t[0]的方式保存并返回主程序。
秒表:利用单片机自身的定时器中断功能进行计时,中断周期为10ms,具体函数如下:void timer0() interrupt 1 using 1 //加热的PWM周期为100*
定时器0中断周期
{
TH0 =(65536-10000)/256;
TL0 =(65536-10000)%256;
kk++;
if(kk==100)
{kk=0;ge++;
}
if(ge==10)
{ge=0;shi++ ;
}
if(shi==10)
{shi=0;bai++ ;
if(bai==10)
{bai=0;qian++;
}
if(qian==10)
{qian=9;
}
显示部分,硬件部分由38译码器与锁存器实现,通过编程对八段管进行选择显示,部分程序如下:void display(void)
{
LE=1;
// P1=7<<5;
P15=1;P16=1;P17=1; 对八段管进行选择
P0=led[TempBuffer1[2]]; 显示
delay(100);
P0=0x00;
// P1=6<<5;
P15=0;P16=1;P17=1;
P0=led[TempBuffer1[3]];
delay(100);
P0=0x00;
温度显示:温度显示之前要对数据进行每一位分离,分离程序如下:
TempBuffer1[1]=t[1]/100; //分离出百位
if( TempBuffer1[1]==0) TempBuffer1[1]=0x00; //百位数消隐
TempBuffer1[2]=(t[1]%100)/10; //分离出十位
TempBuffer1[3]=(t[1]%100)%10; //分离出个位
TempBuffer1[4]=t[0]/10; //分离出十分位
TempBuffer1[5]=t[0]%10; //分离出百分位
显示部分与秒表相同。
实验三:电热杯温度检测与控制系统
实验目的:1.掌握测量温度值的简单方法。
2.学会温度控制的一种方法。
3.学会一种测量温度的硬件设计方法。
实验内容:
1.编制程序,测量温度值并显示。
2.学会如何利用编制程序控制加热系统。
3.学会系统加入干扰后,控制系统快速达到稳定状态。
要实现高精度的温度自动控制就必须采用计算机控制系统,它可以实现温度信号的采集、显示及控制等,并可用计算机软件实现升、降温和闭环自动控制。
采样处理程序是该系统的主要部分,主要的任务是:
数据的采集;
显示温度;
控制计算;
控制输出。
加入扰动后观测系统稳定性。
此次实验的核心内容就是温度控制,我们选择的是比较熟悉的PID控制,算法如下:
if((aa%3)==0) //每三秒扫描一次
{ m=0;
dd_error=d_error;
d_error=error;
error = (target-value);//求e(k) //求e(k-1) //求
e(k-2)
det_t=k*(error-d_error)+(k*3/ti)*error+(k*td/3)*(error-2*d_error+dd_error); //增量公式
pwm=det_t;
if((error>10)||(pwm>60))pwm=60;
}
PID算法得到的控制量怎么与温度控制联系起来从而达到控制效果是关键一部,将得到的控制量与加热杯的导通时间联系起来,即我们接触到的脉冲占空比,得到的控制量与定时器中断里面的水杯加热程序共同对加热时间进行控制:if(a==100){a=0;aa++;
}
if(m<pwm){TA=1;TB=1;}
if((m>=pwm)||(value>=target)){TA=0;TB=0;}
if(m==60)m=0;
m++;
接下来就是所有函数的整合了:void main(void)
{
int_timer0();
int_timer1();
EA=1;
int_uart();
// uartset();
P22=0;
P23=0;
P2_7 =0;
while(1)
{
P2_7 = !P2_7;
EA=0;
pt=ReadTemperature(TH,TL,0x7f); //测温函数返回这个数组的头地址
EA=1;
t[0] = *pt;pt++;
t[1] = *pt; //上限温度-22,下限-24,分辨率10位,也就是0.25C covert1();
display();
cc++;
if(cc>100)
{
Uart_SendChar(0x5a);
Uart_SendChar(TempBuffer1[2]);
Uart_SendChar(TempBuffer1[3]);
Uart_SendChar(TempBuffer1[4]);
Uart_SendChar(TempBuffer1[5]);
cc=0;
}
//读取温度,温度值存放在一个两个字节的数组中
if((aa%3)==0) //每三秒扫描一次
{ m=0;
dd_error=d_error;
d_error=error;
error = (target-value);//求e(k) //求e(k-1) //求
e(k-2)
det_t=k*(error-d_error)+(k*3/ti)*error+(k*td/3)*(error-2*d_error+dd_error); //增量公式
pwm=det_t;
if((error>10)||(pwm>60))pwm=60;
}
程序编写完成,最后面也是最艰巨的任务就是调PID参数了,烧水就烧了一天半,真心塞,还好最后调出来比较好的曲线图:
实验体会,可能一开始觉得编程枯燥,调试很急躁,耐着性子坚持在不断地学习,这个过程还是不错,特别是做出来的程序有成效,感觉很棒。
我爱学习,学习让我快乐!。