首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于MSP430内嵌温度传感器的温度告警系统
来源:本站整理  作者:佚名  2009-11-30 10:19:25



A/D转换引入的误差
由芯片资料可见,对于12位A/D,因漏电流引入的误差1LSB,这个误差可以忽略不记。但是由于布线技术和电源和地线等的不良而导致的电源线、地线上的纹波和噪声脉冲对转换结果的影响却不能不考虑。如图1所示,如果数字地DVss和模拟地AVss是分开供电的,则可以在这两点之间接入反相并接的二极管对,以消除700mV的电压差。另外如果参考电压(VR+ - VR-)较小,那么纹波的影响会变得更明显,从而影响转换精度。因此,电源的清洁无噪声对A/D转换的精度有很大的影响。当然在可能的情况下还是要尽量采用较大的(VR+ - VR- )。还有就是尽量不要采用内部参考,内部参考不太稳定,会影响转换的精度。仔细安排各自接地点的旁路电容对于减小噪声的影响也是很有用的。图1给出了一种典型的退耦电容配置方式,在芯片的电源以及外接参考电压(图中没有画出)的引脚上并接一个10uF的钽电容和一个0.1uF的瓷片电容能够较好的起到抑制噪声的作用。

采用内嵌温度传感器测量温度,要受到很多方面的影响。除了上面讨论的方法,还有减小误差的一般方法,比如多次测量取平均等。所以要综合考虑各方面的因素,才能取得满意的效果。

4. 软件描述
MSP430另一个突出优点就是用C语言编写程序简捷而且编译效率很高。下面就以MSP430F449为例来简要描述这个系统的软件实现。图3为程序流程。

#include "msp430x44x.h" // 包含头文件
#include <math.h> //包含数学运算头文件
#define Trt 25 //预先测量到的室温
#define Th 50 //高温告警温度
#define Tl 0 //低温告警温度
int i=0, k=0,Vrt; //定义全局变量
int ADC_Result[16];
float T; //测量到的温度
void init(void); //初始化函数
void ADC12(void); //A/D转换函数
void Alarm(float t); //告警处理函数
void init(void)
{
TACTL=TASSEL1+TACLR+MC_1; //定时器初始化,工作在"up"模式
CCTL0|=CCIE; //使能CCR0中断
CCR0=0x0FF; //设定定时值
_EINT(); //打开中断
P2DIR|=BIT0+BIT1; //P2.0和P2.1为告警输出;
}
void ADC12(void)
{
ADC12CTL0 &=~ ENC; //在进行设置时首先复位ADC的转换使能
ADC12CTL0 = ADC12ON+REF2_5V+SHT0_8; //采用内部2.5V参考,打开通道10REFON自动打开
ADC12CTL1 = SHP+ADC12SSEL_2; //上升沿采样,主时钟,MEM0
ADC12MCTL0 = EOS + INCH_10+SREF_1; //选择通道10,Vref+为参考电压,进行温度测量
ADC12CTL0 |= ENC;
ADC12CTL0 |= ADC12SC; // 开始转换
if ((ADC12IFG & BIT0)==1) //如果转换完毕,读走数据
ADC_Result[i]=ADC12MEM0;
}
void Alarm(float t)
{
if(t>=Th)
P2OUT|=BIT1; //高温告警
else if(t<=Tl)
P2OUT|=BIT0; //低温告警
else
P2OUT&=~(BIT0+BIT1); //无告警
}
interrupt[TIMERA0_VECTOR] void Timer_A (void) //中断处理子程序//
{
int ADC_Sum=0;
float Vst;
for (i=0;i++;i<16) //连续进行16次转换,提高精度
{
ADC12();
ADC_Sum +=ADC_Result[i]; //求和
i++;
}
ADC_Sum>>=4; //将ADC_Sum右移4位,相当于除以16.得到平均的结果;
Vst=( ADC_Sum /4095.0)*2500; //完成转换,得到电压值
k++;
#ifndef Trt
T=(Vst-986)/3.35; //测出用0度作基准的温度
#else
if (k==1) Vrt=Vst; //如果定义Trt,则将第一次的转换结果作为室温下的Vrt
T=(Vst-Vrt)/3.35+Trt; //测出用室温作基准时的温度
#endif
Alarm(T); //告警处理
}
void main (void)
{
init(); //初始化
LPM1; //进入低功耗模式1;
}

5. 结束语
本文只是对告警部分进行了描述,若是再加上液晶就可以实时显示温度,加上键盘就可以对室温、告警温度进行预设,再对上述程序进行一些改进就是一个实用的系统了。因这两部分相对比较简单和成熟,文中没有进行进一步讨论。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:253,007.80000 毫秒