#申请原创# @21小跑堂
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
我们可以通过ML51单片机提供的 12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
实现温度转换
根据手册提供的公式: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"
- #include "NTC.h"
- /******************************************************************************
- The main C function. Program execution starts
- here after stack initialization.
- ******************************************************************************/
- void main ()
- {
- unsigned int ADCRESULT;
- float Rval;
- float temp;
- /*
- 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);
- Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
- printf("\n Rval=%d Ohm",(unsigned int)Rval);
- temp=Res_to_Tem(Rval);
- printf("\n temp=%.2f",temp-K);
- printf("\n----------------");
- }
-
- }
将阻抗转换为温度作为一个独立的头文件
NTC.h
- #define K 273.15
- #define T0 (25.0+K)
- #define R0 10000.0
- #define B 3455.0
- /*
- 电阻值换算到温度
- adc_val:NTC当前的阻抗值,单位欧姆
- 返回值:摄氏度
- */
- float Res_to_Tem(float adc_val)
- {
- float temp;
- temp=1/((1/T0)+(log(adc_val/R0)/B));
- return temp-K;
- }
这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。
手册还给出的查表方法,给出了几个特殊点,如下图所示
绘制出曲线如下图所示。
点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。
|