您现在的位置是:首页 >技术教程 >NXP公司LPC21xx+热敏电阻实现温度检测网站首页技术教程
NXP公司LPC21xx+热敏电阻实现温度检测
简介NXP公司LPC21xx+热敏电阻实现温度检测
LPC2131/32/34/36/38微控制器基于16位/32位Arm7TDMI-S™CPU,支持实时仿真和嵌入式跟踪,具有尺寸小,功耗低,多个32位定时器、单/双10位8通道ADC、10位DAC、PWM通道、47个GPIO线(它们拥有多达9个边沿或电平触发的外部中断引脚),以上特性使得这些微控制器尤其适用于工业控制和医疗系统领域的小型化应用。
本例利用基于热敏电阻的测温模拟电路在NXP公司提供的LPC21系列芯片上实现温度检测功能。
文章目录
概念说明
- NTC:NTC (Negative Temperature Coefficient)热敏电阻又称温度系数热敏电阻,它的特征是温度的变化,其特性是温度的阻值随温度的变化而变化,温度越高,电阻越小。是非线性曲线。NTC热敏电阻的主要特点是灵敏度高、精度高、经济实惠、适用于恶劣环境。测量温度在-40-250℃之间,如使用金电极,可耐温至420℃。
- 运放/滤波电路:运放是运算放大器的简称。在实际电路中,通常结合反馈网络共同组成某种功能模块。由于早期应用于模拟计算机中,用以实现数学运算,故得名“运算放大器”,此名称一直延续。滤波电路常用于滤去整流输出电压中的纹波,一般由电抗元件组成,如在负载电阻两端并联电容器C,或与负载串联电感器L,以及由电容,电感组成而成的各种复式滤波电路。
- ADC:Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
- 温度曲线:热敏电阻阻值随环境温度变化变化的温度-电阻特性曲线也被称为温度曲线,下图是三个不同25°NCT阻值的电阻温度曲线:
实现原理
测温的元件是负温度系数的热敏电阻,它的最大优点是灵敏,可靠。整个模拟电路由测敏电阻分为以下几个部分:
- 热敏电阻的电阻值与温度的关系是指数关系,首先用与固定电阻串联的办法粗略地对有效测温区进行线性化。
- 电压进入运放,在这里输入电压减去偏置,再放大一定倍数,使得它的变化范围正好在单片机AD的输入范围0~2.5v,以得到最大的测量精度。
- 在进入单片机之前,测温电压还要经过低通滤波电路,滤去传输过程中混入的一些快变干扰信号。
- 最后电压到了单片机内置的10-bit ADC的channel6将其转化为数字信号。
我们主要还是关心整个实现的原理,暂时不去纠结运放和滤波的实现,下面是测温模拟电路的最简单原理示意:
嵌入式程序
下面是配置LPC21系列ADC的步骤:
- 使用PINSEL寄存器配置 ADC 功能的 GPIO 引脚。
- 启用 CLock 到 ADC 模块。
- 通过设置 ADCR 的PDN 位打开内部 ADC 模块的电源。PDN 位(ADCR 的第 21 位)。
- 通过在ADCR的SEL位设置相应的位来选择用于A/D转换的特定通道。SEL(位 0~位 7)。
- 设置ADCR.START,用于启动所选通道的A/D转换。START位(ADCR的第24位)。
- 等待转换完成,转换结束后,ADGDR.DONE将被设置。
- 从 ADGdR.RESULT 读取 10 位 A/D 值。
下面是实现ADC转化数值读取的嵌入式代码实现,代码中有中文注释帮助理解:
#include<lpc214x.h>
unsigned int adc(int no,int ch)
{
unsigned int val;
switch(no) //select adc
{
case 0: AD0CR=0x00200600|(1<<ch); //select channel
AD0CR|=(1<<24); //start conversion
while((AD0GDR& (1<<31))==0);
val=AD0GDR;
break;
case 1: AD1CR=0x00200600|(1<<ch); //select channel
AD1CR|=(1<<24); //start conversion
while((AD1GDR&(1<<31))==0);
val=AD1GDR;
break;
}
val=(val >> 6) & 0x03FF; // bit 6:15 is 10 bit AD value
return val;
}
unsigned int ADCval;
int main()
{
IO1DIR=0xffffffff;
IO0DIR=0x00000000;
PINSEL0=0x0300;
VPBDIV=0x02;
lcd_init();
show("ADC Value : ");
while(1) {
cmd(0x8b);
ADCval=adc(0,6);
dat((ADCval/1000)+48);
dat(((ADCval/100)%10)+48);
dat(((ADCval/10)%10)+48);
dat((ADCval%10)+48);
}
}
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。