本帖最后由 gaoyang9992006 于 2022-11-22 09:17 编辑
工欲善其事必先利其器,而这个板子就是个很好的开发利器,可以充分使用MCC图形化配置,将底层学习化繁为简,只需要专注你的应用开发即可,真棒!
如何使用NTC热敏电阻测温呢?
我们可以通过一个固定的参考电阻来观察NTC电阻的变化,根据NTC电阻值与温度之间的关系来计算温度。
这需要两个步骤:通过分压测量电阻值,通过电阻值计算温度。
以下是我手头有的NTC的手册部分内容
手册并没有直接提供阻值计算温度的公式,因此我们要通过提供的内容计算出来
实现温度转换
根据手册提供的公式: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计算。
为了方便理解与计算,我们将阻值到温度值的关系写成函数
#define K 273.15
#define T0 (25.0+K)
#define R0 10000.0
#define B 3455.0
/*
电阻值换算到温度
res_val:NTC当前的阻抗值,单位欧姆
返回值:摄氏度
*/
float Res_to_Tem(float res_val)
{
float temp;
temp=1/((1/T0)+(log(res_val/R0)/B));
return temp-K;
}
最后我们完善测试代码
#include "mcc_generated_files/system/system.h"
#include "mcc_generated_files/timer/../timer/delay.h"
#include <math.h>
/*
Main application
*/
#define K 273.15
#define T0 (25.0+K)
#define R0 10000.0
#define B 3455.0
/*
电阻值换算到温度
res_val:NTC当前的阻抗值,单位欧姆
返回值:摄氏度
*/
float Res_to_Tem(float res_val)
{
float temp;
temp=1/((1/T0)+(log(res_val/R0)/B));
return temp-K;
}
int main(void)
{
float val;
adc_result_t ADCRESULT;
SYSTEM_Initialize();
while(1)
{
printf("Hello world !\n");
DELAY_milliseconds(2000);
ADCRESULT=ADC0_GetConversion(ADC_MUXPOS_AIN22_gc)>>4;//设置了左对齐,那么咱数据就右移回来,PA2对应AIN22
printf("ADCRESULT=%d\n",ADCRESULT);
val=((ADCRESULT*6.2)/(4095-ADCRESULT)); //单位为KΩ
printf("val=%f K Ohm\n",val);
printf("temp=%f \n",Res_to_Tem(val*1000.0));
DELAY_milliseconds(2000);
}
}
关于ADC的使用请参考
https://bbs.21ic.com/icview-3266138-1-1.html
烧录打印结果
用手捏住NTC传感器观察结果变化
Hello world !
ADCRESULT=2313
val=8.047475 K Ohm
temp=30.695770
Hello world !
ADCRESULT=2286
val=7.834825 K Ohm
temp=31.413055
Hello world !
ADCRESULT=2279
val=7.780727 K Ohm
温度升高,非常奈斯
关于开发板的使用主意事项
其中VBUS为USB电压5V,而单片机的参考电压我们选择的是单片机的VDD,也就是3.3V,而我们设置的参考电压VTG就是VDD,因此需要将分压电阻的Vcc接到3.3V的VTG上。这样测出来才是标准的。
因为只要超过3.3V的输入都会达到满量程4095。
|