红外测温系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于ATMEGA88的红外测温仪

作品采用ATMEL公司的ATMGEA88 作为MCU,部有8K FLASH,1kram。工作在部8M RC 振荡下,耗电仅为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。。以下是仪放的基本参数

LOW OFFSET VOLTAGE: 50μV max

LOW DRIFT: 0.25μV/︒C max

LOW INPUT BIAS CURRENT: 2nA max

HIGH COMMON-MODE REJECTION:115dB min

INPUT OVER-VOLTAGE PROTECTION:±40V

WIDE SUPPLY RANGE: ±2.25 to ±18V

LOW QUIESCENT CURRENT: 3mA max

当R5=100时,放大倍数为500倍。G=50K/R5。运放为双电源运放,所以提供了双电源。

放大后的电压大概为75MV(26度),145MV(37度)。由于没有准确校准,所以必定有偏差。

采用美信公司的反相电荷泵芯片MAX889T作为负向电源的输出。最大输出电流为200MA,可以满足运放的需求,留有足够的余量。电荷泵工作在2M开关频率下,只需要1UF的电容就可以工作。不需要外加电感,最大工作电压为5.5V ,漏电流为20MA。RMB20一个。。。

软件流程图

程序带注释

#include

#include "lcd5110.h"

#include

float wendu;//定义float型的函数保存温度,方便计算小数

#define FIRST_ADC_INPUT 5

#define LAST_ADC_INPUT 5

unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];

#define ADC_VREF_TYPE 0xC0

//AD初始化,时钟62.5K,部1.1V基准,采用自动扫描模式,扫描通道AD通道5 // ADC interrupt service routine

// with auto input scanning

interrupt [ADC_INT] void adc_isr(void)

{

static unsigned char input_index=0;

// Read the AD conversion result

adc_data[input_index]=ADCW;

// Select next ADC input

if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))

input_index=0;

ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;

// Delay needed for the stabilization of the ADC input voltage

delay_us(10);

// Start the AD conversion

ADCSRA|=0x40;

}

// Declare your global variables here

void main(void) //系统初始化

{

// Declare your local variables here

// Crystal Oscillator division factor: 1

#pragma optsize-

CLKPR=0x80;

CLKPR=0x00;

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

相关文档
最新文档