本帖最后由 gaoyang9992006 于 2021-11-1 09:33 编辑
感谢贸泽电子提供这次活动赞助,让我体验到了村田制作所的这款NTC温度传感器,Murata Electronics MTHMR-N-0002A NTC热敏电阻评估板上板载了村田制作所的NXFT15XH103FA2B030NTC型热敏电阻,具有体积小,响应灵敏,精度高的特点,这得益于村田制作所多年的积累,以及提供了技术全面的技术手册。
这次活动参与的初衷是活动中提到了电子体温计,让我突然觉得这值得一试,以前生病测量体温用水银温度计,冰凉的难受,而非接触式的,又担心测的不准。这次看到了这么小的传感器(传感器只有芝麻粒那么大)觉得是时候寻找一个替代品了。
我参考部分可自动收回数据线与自动收回卷尺的想法,觉得这个传感器非常适合制作一款不用担心冰凉和水银破碎风险的电子体温计,同时还可以测量环境温度。
再次感谢贸泽电子,之前我在贸泽电子下单买过好多次开发板与元件,发货及时,质量有保证,大的平台值得信赖。
测量提纲
第一步:查找资料,实现ADC测量
第二步:实现温度转换
第三步:实现体温计功能该方案的优点:该方案可以用于取代有危险的水银温度计,水银温度计冰凉,测量慢,由于特别冰凉,接触时候感觉很不舒适,升温较慢,测量周期长,该方案,利用该微型的温度传感器实现体温
的快速测量,体积较小,升温较快,响应灵敏。
-----------------------------------------------
第一步
在活动主页找到相关资料,关键内容如下所示,这是开发板的整体电路。
我们可以根据该图知道如何使用该开发板,输出为Vout=Vcc*(R/(R+Ref));
r44e-3685.pdf
(856.73 KB)
手册给出了计算公式
另外手册还提供了查表法
这里我利用新唐的ML51单片机进行ADC测量,该单片机具备12位的ADC外设。测量数值范围为0~0xFFF,也就是0到4095
由于这里是测量阻值大小,因此我们不考虑具体电压的读取,根据传感器开发板为传感器与一个6.2K标准电阻串联,因此
测量的结果R对应的ADC值应为4095*(R/(R+R0)),该值定义为ADCRESULT,则对应的R=((ADCRESULT*6.2)/(4095-ADCRESULT));单位KΩ
//***********************************************************************************************************
// File Function: ML51 series ADC software trigger on shot demo code
//***********************************************************************************************************
#include "ML51.h"
#include "math.h"
/******************************************************************************
The main C function. Program execution starts
here after stack initialization.
******************************************************************************/
void main ()
{
unsigned int ADCRESULT;
float val;
/*
For UART0 P0.5 TXD output setting
* include gipo.c in Library for GPIO mode setting
* include uart.c in Library Setting for UART0
*/
MFP_P31_UART0_TXD; // UART0 TXD use P0.5
P31_QUASI_MODE; // set P0.5 as Quasi mode for UART0 trasnfer
UART_Open(24000000,UART0_Timer3,115200); // Open UART0 use timer1 as baudrate generate and baud rate = 115200
ENABLE_UART0_PRINTF;
/*
ADCS to trig ADC convert
* include adc.c in Library for ADC initial setting
*/
ADC_Open(ADC_SINGLE,1); //Enable ADC_CH4
ADC_ConvertTime(3,7);
//* find ADC result in ADC interrupt*/
while(1)
{
set_ADCCON0_ADCS; // Software trig adc start
while((ADCCON0|CLR_BIT7)==CLR_BIT7); // wait ADCF = 1;
ADCRESULT = (ADCRH<<4)+ADCRL;
printf("\n ADC result = %d ", ADCRESULT);
Timer0_Delay(24000000,100,5000);
val=((ADCRESULT*6.2)/(4095-ADCRESULT));
printf("\n val=%f K",val);
}
}
代码如上所示。
例如测量结果为
ADC result = 2657
val=11.455770 K
完成第一步,实现ADC测量,接下来根据公式实现温度读取
第二步:实现温度转换
根据手册提供的公式:R=R0 exp B(1/T - 1/T0);
其中R是待测电阻,R0是某个温度T0 K下的已知电阻,B是温度传感器常数
通过以上公式反推T = temp=1/((1/T0)+(log(RT/R0)/B));
代入数据测试,例如T0=25摄氏度时候R0=10K欧姆,主意以上代入实际计算时候要使用绝对温度,单位开尔文
经过测试上述公式可以完成验算,即,正确。
根据手册该型号的B常数在25到50度之间采用3380,25到80之间采用3428,25到85之间采用3434,25到100摄氏度之间采用3455.
为了方便,本项目采用3455计算。
程序如下
//***********************************************************************************************************
// File Function: ML51 series ADC software trigger on shot demo code
//***********************************************************************************************************
#include "ML51.h"
#include "math.h"
/******************************************************************************
The main C function. Program execution starts
here after stack initialization.
******************************************************************************/
void main ()
{
unsigned int ADCRESULT;
float val;
float temp;
const float K=273.15;
const float R0=10000.0;
const float B=3455.0;
float T0=25.0+K;
unsigned int RT;
unsigned int x;
/*
For UART0 P0.5 TXD output setting
* include gipo.c in Library for GPIO mode setting
* include uart.c in Library Setting for UART0
*/
MFP_P31_UART0_TXD; // UART0 TXD use P0.5
P31_QUASI_MODE; // set P0.5 as Quasi mode for UART0 trasnfer
UART_Open(24000000,UART0_Timer3,115200); // Open UART0 use timer1 as baudrate generate and baud rate = 115200
ENABLE_UART0_PRINTF;
/*
ADCS to trig ADC convert
* include adc.c in Library for ADC initial setting
*/
ADC_Open(ADC_SINGLE,1); //Enable ADC_CH4
ADC_ConvertTime(3,7);
//* find ADC result in ADC interrupt*/
while(1)
{
set_ADCCON0_ADCS; // Software trig adc start
while((ADCCON0|CLR_BIT7)==CLR_BIT7); // wait ADCF = 1;
ADCRESULT = (ADCRH<<4)+ADCRL;
printf("\n ADC result = %d ", ADCRESULT);
Timer0_Delay(24000000,100,5000);
val=((ADCRESULT*6.2)/(4095-ADCRESULT));
printf("\n val=%f K",val);
x=(val*1000.0);
printf("\n x=%d ",x);
RT=x;
temp=1/((1/T0)+(log(RT/R0)/B));
printf("\n temp=%.2f",temp-K);
|