支持温度预测的技能笔记本散热垫
支持温度预测的笔记本散热垫
08电气创新项目组
二零一一年一月十七日
摘要:
该系统以STC89C52单片机为控制核心,利用新型一线制温度传感器DS18B20测量温度值,实现笔记本温度的检测和报警。系统测温范围为0?—+85?,测量精度为0.5?。用户可以自定义报警值,一旦温度超过极限值,单片机便启动报警功能,提醒用户。可以根据温度调整风扇转速,尽量节省电力,并可以对温度进行一定程度上的预测,并提前反应,做到防患于未然。
关键词:STC89C52;DS18B20;测温;报警
1(前言
通过对生活中现实情况的观察,我们发现,市场上现有的笔记本散热垫使用的都是无反馈模式,即无论温度情况如何,都采用最大转速。这样做虽然可以有效地降低笔记本温度,但是从节能的角度上看,确实有存在着浪费的情况,所以我们决定开发一种带转速控制的笔记本散热垫,在温度不是很高的情况下,可以通过降低转速来实现对能源的节约。
我们开发的主要目标是努力使系统更加绿色化、智能化及人性化。
我们希望可以通过这种智能控制笔记本散热垫,使得散热垫在有效降低电脑温度和尽量减少电力消耗中找到到一个平衡点,最大程度地减少不必要的电力浪费。并加入了温度预报警系统,可以方便有效的感知将来的一些情况,并作出提前反应,使得对电脑的散热起到一种更好效果。
在使用方面,考虑到实际的情况,采用了USB供电,可以不需要额外电源,直接从笔记本上取得电源,从而可以方便用户外出旅行、出差时使用。报警方面,采用预测过温报警与实测过温报警,采用灯光报警,不制造额外噪音。
温度测量方面,采用多传感器,以实现最大程度地采集到能反映真实情况的数据。
另外使用了PC界面,使用用户可以在电脑上进行监测与控制。
这个项目设置了两种工作模式,一种是未连接电脑时,温度预测及转速控制等功能均由单片机独立完成,也即不连接PC及也可以独立工作。另一种工作模式是连接PC后,系统便将控制权转交给PC机,温度预测与转速控制均由上位机控制,单片机只负责执行上位机的命令。
通过这种系统,可以节约一定的能源,并且不会影响到其实际的散热效果,而且尽量采用了低成本、高适应能力的器材,成本较低且环境适应能力好,携带方便。
2(系统具体实现
整个系统主要包括温度采集模块、数码管显示模块、LED报警模块、按键控
制模块、电机驱动与控制模块和PC通信模块几个部分。
2.1 温度采集模块
温度采集部分使用了四片DS18B20高精度数字温度传感器,分别放在散热垫的四个拐角上,用于对笔记本的温度进行检测,并将所得的数据通过数据线传给单片机进行处理。本项目的测温范围为0-85摄氏度,精度为0.1度,误差小于?0.4度。
2.2 数码管显示与按键模块
数码管显示模块主要用于对于温度值的现实及按键配合进行报警温度的设置。本模块使用的是四位共阴数码管,通过逐位扫描的方式进行点亮。本项目使用了三个按键,第一个用于切换数码管的当前温度/报警温度的切换,在报警温度显示模式下,第二和第三个按键分别用于报警温度+5与-5,且报警温度值上限是80度,下限为15度。
2.3 LED报警模块
项目中使用了两个LED进行报警,当温度为正常范围时,两灯均不亮,当预测温度超过预警值时,黄灯亮,当实际温度高于预警值时,红灯亮。这个样就可以提醒用户采取
降低温度。
2.4 电机驱动与控制模块
本项目采用的是5V直流风扇,在驱动方面,我们选用了LM298芯片作为驱动芯片,考虑到芯片的负载能力,实际使用时,我们将电机负极接在驱动芯片上,正极直接接电源,这样,只要驱动电路输出低电平,电机就可以转起来了。在电机的控制上,则是用单片机输出PWM波来进行控制,通过调整PWM波的占空比,就可以实现调整转速的效果。
2.5 PC通信模块
本项目的一大亮点就是可以和PC进行交互通信,由单片机将风扇转速、温度值等信息发送给电脑,而电脑也可以通过一些命令来控制下位机。通信模块使用的是串口通信RS232协议,使用MAX232芯片进行电平转换,经由串口转USB接口,最终通过USB与电脑相连。
3(软件部分
温度获取
由四个传感器处获得16位温度值,并将其化为十进制
示(精度0.1度),再对其温度值进行判断,温度大于85度(传感器坏了)或小于0度(传感器未连接)均不作考虑。然后对剩下的温度进行判断,取四个温度的最大值。测温每隔一秒钟进行一次。
void temp_temp(void) //温度数据处理
{
ReadTemperature();
if(led_mode==0)
{
if(temp_real<1000 && temp_real>0)//d=TempH/100; //百位温度
{
d=(temp_real%1000)/100; //十位温度
c=(temp_real%100)/10; //个位温度
b=temp_real%10;
a=10;
}
if (temp_real>999)
{
d=temp_real/1000;
c=(temp_real%1000)/100; //十位温度
b=(temp_real%100)/10; //个位温度
a=temp_real%10;
}
}
}
温度预测
将多个周期所测得的温度值放入一个数组内,并对其求二阶导数,获得其温度变化的趋势,并以此为基础对下几个周期的温度值进行预测,并应用加权技术,获得温度的预测值。
void fore_temp(void)
{
unsigned char i;
int j;
//数值初始化
if (temp_input[4]<=0 || temp_input[4]>800)
{
for(i=0;i<5;i++)
{
temp_input[i]=temp_real;
}
}
//温度值保存
for (i=0;i<4;i++)
{
temp_input[i]=temp_input[i+1];
}
temp_input[4]=temp_real;
//温度预测
j=(temp_input[4]-temp_input[3])*0.5+(temp_input[3]-temp_input[2])*0.25+(tem
p_input[2]-temp_input[1])*0.125+(temp_input[1]-temp_input[0])*0.125;
temp_fore=temp_real+j*5; }
Private Sub dxz() '预测计算(核心算法)
Dim a(1 To 130) As Double
Dim b(1 To 130) As Double
For i = 1 To 72
temp_a(i) = temp(i + 8)
Next i
For i = 1 To 71
a(i) = temp_a(i + 1) - temp_a(i)
Next i
For i = 1 To 70
b(i) = a(i + 1) - a(i)
Next i
Dim c As Double, d As Double
For i = 71 To 120
c = 0
For j = i - 1 To i - 70 Step -1
d = 1
For k = 1 To i - j
d = d * 31# / 32#
Next k
c = c + d * b(j) / 31#
Next j
b(i) = c
If b(i) > 1000 Then b(i) = 1000
Next i
For i = 72 To 121
a(i) = a(i - 1) + b(i - 1) * 0.5
Next i
For i = 73 To 122
temp_a(i) = temp_a(i - 1) + a(i - 1)
If temp_a(i) > 1000 Then temp_a(i) = 1000
Next i
Dim e As Integer
zhuansu = 100 - (temp_warm - temp_a(90) / 10) / (temp_warm - 10) * 100
End Sub
PWM输出
根据预测所得的温度值,输出均匀的PWM波,对电机的转速进行控制。 PWM输出子程序:
void PWM_send(void)
{
unsigned char h;
int ccc; //转速(0-99)
ccc=100.0-(temp_warm-temp_real/10.0)/(temp_warm-10.0)*100.0;
if (ccc<0) ccc=0;
if (ccc>99) ccc=99;
if (flag==1) //如果连接PC,则由PC控制
ccc=temp_q;
//输出均匀占空比的PWM波控制电机
pwm_count++;
if (pwm_count>100) pwm_count=0;
h=100/(ccc+1);
if((pwm_count/h)==((pwm_count-1)/h)) PWM=0; else PWM=1;
if (ccc<15) PWM=0; //转速小于15则停转
}
PC通信
单片机与PC之间的通信由两部分组成,一部分是单片机向电脑传送温度值及其他一些状态信息,另一部分是电脑向单片机发送控制信息。
单片机部分使用的是c语言进行编程:
void sendcode(void) //向上微机发送温度数据
{
ES=0;
TI=1;
printf ("%dk",temp_real); //将实际温度发给上位机 +k
printf ("%dq",temp_warm); //报警温度 +q
printf ("%cp",temp_q); //PC控制转速反馈 +p
while(!TI);
TI=0;
ES=1;
flag=0; //标志位清0(若长时间无PC控制,则交给MCU控制)
temp_q=0;
}
void urt(void) interrupt 4 //串口中断
{
while(RI==0); //等待接收完毕
RI=0; //接收完成标志手动清零
temp_q=SBUF; //从缓存读取数据
flag=1; //置标志位
}
而上位机部分使用的是VB进行制作的:
Private Sub MSComm1_OnComm() '接收
Dim i As Long
Dim a As String
Dim b As String
Dim j As Long
MSComm1.InputMode = comInputModeText
MSComm1.InputLen = 0
If (MSComm1.CommEvent = comEvReceive) Then
b = MSComm1.Input
shuju = shuju & b
'MsgBox b
aaa:
For i = 1 To Len(shuju)
If Mid(shuju, i, 1) = "k" Then
a = a & Left(shuju, i - 1)
shuju = Right(shuju, Len(shuju) - i)
If temp(80) = 0 Then For j = 1 To 80: temp(j) = Val(a): Next j
For j = 1 To 79
temp(j) = temp(j + 1)
Next j
n = n + 1
If n > 80 Then n = 80
nn = nn + 1: temp(80) = Val(a): Call printpicture: Label1.Caption
= "当前温度:" & Val(temp(80)) / 10 & "摄氏度"
a = ""
GoTo aaa
End If
If Mid(shuju, i, 1) = "q" Then
a = a & Left(shuju, i - 1)
shuju = Right(shuju, Len(shuju) - i)
temp_warm = Val(a): Label2.Caption = "预警温度:" & a & "摄氏度"
a = ""
GoTo aaa
End If
If Mid(shuju, i, 1) = "p" Then
a = a & Left(shuju, i - 1)
shuju = Right(shuju, Len(shuju) - i)
temp_q = Val(a): Label4.Caption = "风扇转速:" & temp_q + 1 & "%"
a = ""
If Val(Text1.Text) > 100 Then Text1.Text = 100
If Val(Text1.Text) < 1 Then Text1.Text = 1
zhuansu = Val(Text1.Text) - 1
'If Not send_mode Then Call dxz
If send_mode Then Call dxzoutput(zhuansu)
GoTo aaa
End If
Next i
End If
Call dxz
End Sub
上位机程序
上微机部分完全使用的是vb进行编程,上位机中,将获取的温度值用折线图显
示出来,将报警值用黄线标记,并在一侧显示当前温度、报警温度及风扇转速等
信息。另外还有两种模式可供选择,一种是使用上位机中的温度预测功能对风扇
99的数,控制风扇的转速。 转速进行自动控制,另一种是用户直接输入一个1-
4(项目最终成品图
4.1 上位机界面
4.2 实物图