分享一下自用的一个算法,通过NTC阻值来计算温度之公式法。
实例:
//实际应用
int main(void)
{
unsigned short t;
ntc_typedef ntc;
ntc.B = 3950;//NTC常数,NTC规格书里面有
ntc.T0 = 47;//NTC常温下的阻值
ntc.ad = 2048;//ADC采集的电压值
t = calculate_ntc_temp(&ntc);//实际温度值需要除以100
}
下面是具体函数:
typedef struct
{
unsigned short ad;//ADC通道采集回来的AD值
unsigned short B;//B常数
unsigned char T0;//25摄氏度的阻值(千欧)
}ntc_typedef;
定义一个结构体,这三个参数是必须要的,第一个是ADC NTC对应通道采集回来了的ADC值,第二个是B常数,NTC的规格书上面有,第三个就是标准温度下的NTC阻值,单位是千欧;
unsigned short calculate_ntc_temp(ntc_typedef *ntc)
{
float Temp = 0;
float n_log = 0;
float r;
unsigned short t;
r = (((ntc->T0) * 4096) / (ntc->ad)) - (ntc->T0);
Temp = 298.15 * (ntc->B);
n_log = log(r) - log((ntc->T0));
Temp = Temp / ((ntc->B) + 298.15 * n_log);
Temp = Temp - 273.15;
t = (unsigned short)(Temp * 100);
return t;
}
这个函数返回的温度放大了100倍,精确到小数点后两位。(如果你的结果需要实际的温度,建议不放大加四舍五舍更准一点,或者放大64 、128、256这种倍数,之后在右移就好了)
20250317更新。。。。。。。。。。。。。。。。。。。。。
上面的代码是当时随手写给一个朋友的,后来自己用到了,发现并不实用,每次都需要配置结构体,属实麻烦,还因为结构体的操作增加了额外的开销。下面是新更新的代码,更加的简洁;
/****
* @brief 计算实际温度
*
* @param[in]:
* data :采集通道AD值
*
* @return: 实际电压
*****/
float calculate_actual_temp(unsigned int data)
{
float n_log = 0;
float r;
float t = 0;
float r0 = 47.0;
unsigned short b0 = 3950;
r = r0 * 4095 / data - r0 ;
n_log = log(r) - log(r0);
t = 298.15 * b0 / (b0 + 298.15 * n_log) - 273.15;
return t;
}
对于这个函数的在不同的NTC电阻上的运用,我们只需要更改函数中的r0和b0,也就是在25℃环境中的阻值,单位是:千欧;以及NTC电阻的B常数;