红外测温系统设计.docx
《红外测温系统设计.docx》由会员分享,可在线阅读,更多相关《红外测温系统设计.docx(14页珍藏版)》请在冰豆网上搜索。
红外测温系统设计
基于ATMEGA88的红外测温仪
作品采用ATMEL公司的ATMGEA88作为MCU,内部有8KFLASH,1kram。
工作在内部8MRC振荡下,耗电仅为2MA左右。
采用RISC指令集的AVR核心,运算速度大大超过传统的51单片机。
内部带有3个定时器,8路10位AD(模数转换器),串口,硬件SPI,方便使用。
大批量采购价格目前由于炒货的原因涨价到12RMB。
(具体问题可以搜索下,网上吹捧得很多)推荐你看一下中文的PDF,到处都有下载的。
采用这块芯片主要来说就有一点,比51先进,功耗低,内带AD,而且外部不需要加晶振。
使用一块LCD5110手机屏作为显示设备,可以显示输出电压以及当前状态。
液晶屏参数为72*48,点阵式,使用一个驱动库作为支持,方便开发,工作在3.3V电压下。
耗电极低,小于1MA,背光耗电为20MA。
使用一片LDO(低压差线性稳压源)作为系统电源,LM1117-3.3V,输出电压为3.3V,最大电流500MA
以下为单片机的复位电路和烧录程序用的接口
使用OTP-538U红外传感器,该传感器是一种红外线感应型的温度探测器。
主要工作原理是利用红外线的波长在硅片上产生相应的电压,根据检测到的电压不同来检测不同的温度。
由于只要是发热的光源就会辐射红外线,所以可以对温度进行非接触式的检测。
传感器由一个热敏电阻和传感器部分组成。
传感器部分根据外部的温度产生相应的电压,而热敏电阻根据外部温度不同,电阻值产生变化,由此来补充因为外界环境对传感器的影响,因此可以做到比较高的精度。
价格为RMB40每颗,以下是接口电路
下表是温度与电压输出的比例
下表是热敏电阻的变化比率
由于这两个值变化很难算。
。
。
。
应用电路上都是4个电阻做的,而且没有电压偏移和温度的关系。
。
所以我直接舍弃了温度补偿。
。
。
。
这个图的电阻值我完全计算不出来。
。
。
泪流满面。
。
。
采用TI公司的仪表放大器INA114,采用仪表放大器最大的好处是增加了输入阻抗,而且放大倍数比较好调整,高CMRR,而且噪声极低,最关键的是,输入失调电压小。
价格为RMB32。
。
以下是仪放的基本参数
LOWOFFSETVOLTAGE:
50μVmax
LOWDRIFT:
0.25μV/︒Cmax
LOWINPUTBIASCURRENT:
2nAmax
HIGHCOMMON-MODEREJECTION:
115dBmin
INPUTOVER-VOLTAGEPROTECTION:
±40V
WIDESUPPLYRANGE:
±2.25to±18V
LOWQUIESCENTCURRENT:
3mAmax
当R5=100时,放大倍数为500倍。
G=50K/R5。
运放为双电源运放,所以提供了双电源。
放大后的电压大概为75MV(26度),145MV(37度)。
由于没有准确校准,所以必定有偏差。
采用美信公司的反相电荷泵芯片MAX889T作为负向电源的输出。
最大输出电流为200MA,可以满足运放的需求,留有足够的余量。
电荷泵工作在2M开关频率下,只需要1UF的电容就可以工作。
不需要外加电感,最大工作电压为5.5V,漏电流为20MA。
RMB20一个。
。
。
软件流程图
程序带注释
#include
#include"lcd5110.h"
#include
floatwendu;//定义float型的函数保存温度,方便计算小数
#defineFIRST_ADC_INPUT5
#defineLAST_ADC_INPUT5
unsignedintadc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#defineADC_VREF_TYPE0xC0
//AD初始化,时钟62.5K,内部1.1V基准,采用自动扫描模式,扫描通道AD通道5
//ADCinterruptserviceroutine
//withautoinputscanning
interrupt[ADC_INT]voidadc_isr(void)
{
staticunsignedcharinput_index=0;
//ReadtheADconversionresult
adc_data[input_index]=ADCW;
//SelectnextADCinput
if(++input_index>(LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT|(ADC_VREF_TYPE&0xff))+input_index;
//DelayneededforthestabilizationoftheADCinputvoltage
delay_us(10);
//StarttheADconversion
ADCSRA|=0x40;
}
//Declareyourglobalvariableshere
voidmain(void)//系统初始化
{
//Declareyourlocalvariableshere
//CrystalOscillatordivisionfactor:
1
#pragmaoptsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef_OPTIMIZE_SIZE_
#pragmaoptsize+
#endif
//Input/OutputPortsinitialization
//PortBinitialization
//Func7=InFunc6=InFunc5=InFunc4=InFunc3=InFunc2=InFunc1=InFunc0=In
//State7=TState6=TState5=TState4=TState3=TState2=TState1=TState0=T
PORTB=0x00;
DDRB=0xff;
//PortCinitialization
//Func6=InFunc5=InFunc4=InFunc3=InFunc2=InFunc1=InFunc0=In
//State6=TState5=TState4=TState3=TState2=TState1=TState0=T
PORTC=0x00;
DDRC=0x00;
//PortDinitialization
//Func7=InFunc6=InFunc5=InFunc4=InFunc3=InFunc2=InFunc1=InFunc0=In
//State7=TState6=TState5=TState4=TState3=TState2=TState1=TState0=T
PORTD=0x00;
DDRD=0x00;
//Timer/Counter0initialization
//Clocksource:
SystemClock
//Clockvalue:
Timer0Stopped
//Mode:
Normaltop=FFh
//OC0Aoutput:
Disconnected
//OC0Boutput:
Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
//Timer/Counter1initialization
//Clocksource:
SystemClock
//Clockvalue:
Timer1Stopped
//Mode:
Normaltop=FFFFh
//OC1Aoutput:
Discon.
//OC1Boutput:
Discon.
//NoiseCanceler:
Off
//InputCaptureonFallingEdge
//Timer1OverflowInterrupt:
Off
//InputCaptureInterrupt:
Off
//CompareAMatchInterrupt:
Off
//CompareBMatchInterrupt:
Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//Timer/Counter2initialization
//Clocksource:
SystemClock
//Clockvalue:
Timer2Stopped
//Mode:
Normaltop=FFh
//OC2Aoutput:
Disconnected
//OC2Boutput:
Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
//ExternalInterrupt(s)initialization
//INT0:
Off
//INT1:
Off
//InterruptonanychangeonpinsPCINT0-7:
Off
//InterruptonanychangeonpinsPCINT8-14:
Off
//InterruptonanychangeonpinsPCINT16-23:
Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;
//Timer/Counter0Interrupt(s)initialization
TIMSK0=0x00;
//Timer/Counter1Interrupt(s)initialization
TIMSK1=0x00;
//Timer/Counter2Interrupt(s)initialization
TIMSK2=0x00;
//AnalogComparatorinitialization
//AnalogComparator:
Off
//AnalogComparatorInputCapturebyTimer/Counter1:
Off
ACSR=0x80;
ADCSRB=0x00;
//ADCinitialization
//ADCClockfrequency:
1000.000kHz
//ADCVoltageReference:
Int.,cap.onAREF
//ADCAutoTriggerSource:
FreeRunning
//DigitalinputbuffersonADC0:
On,ADC1:
On,ADC2:
On,ADC3:
On
//ADC4:
On,ADC5:
On
DIDR0=0x00;
ADMUX=FIRST_ADC_INPUT|(ADC_VREF_TYPE&0xff);
ADCSRA=0xEF;
ADCSRB&=0xF8;
LCD_init();//液晶初始化
PORTB.5=1;//打开背光
//Globalenableinterrupts
#asm("sei")
while
(1)
{//LCD_write_6_8string(0,0,"");
//LCD_write_number(24,0,adc_data[0]);
wendu=adc_data[0];//采集电压
wendu=wendu/6+12;//计算温度
LCD_write_6_8string(0,1,"Temperature");
LCD_write_6_8string(0,2,"");
LCD_write_float(24,2,wendu);//将计算后的温度输出到屏幕上
LCD_write_6_8string(0,4,"Justfora");
LCD_write_6_8string(0,5,"simpletest");
delay_ms(200);//延时0.2S
//Placeyourcodehere
};
}