红外测温系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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