|
本帖最后由 huhuolianmeng 于 2020-11-28 23:38 编辑
对于电阻计算方法:
1、利用串联电阻分压法:
这个很好理解,通过读取ADC数值,反推NTC实时电阻大小,然后查表即可得出温度值。
为什么?
**************************
大于20欧按 参考电阻比值计算
小于20欧按第1点和第2点进行线性计算,简单处理。
这个方案不太好,后面需要找更好的修正算法。
问题在第2个点附近,阻值会调动3左右.
**************************
/*
*********************************************************************************************************
* 函 数 名: CalculNtcRes
* 功能说明: 计算NTC电阻值
* 形 参: ref_res : 上拉参考电阻, _adc : 当前ADC值
* 返 回 值: 电阻值. K欧
*
*********************************************************************************************************
*/
float CalculNtcRes(float _adc)
{
/*
大于20欧按 参考电阻比值计算
小于20欧按第1点和第2点进行线性计算,简单处理。
这个方案不太好,后面需要找更好的修正算法。
问题在第2个点附近,阻值会调动3左右.
*/
float X;
float ref_res3;
// float ref_res2;
/* 根据 (x2,y2) 校准点和 (x3,y3) 校准点,修正曲线 */
if (_adc < g_tCalib.NtcRes.x2 + 5)
{
X = CaculTwoPointFloat(g_tCalib.NtcRes.x1, g_tCalib.NtcRes.y1, g_tCalib.NtcRes.x2, g_tCalib.NtcRes.y2, _adc);
/* 0 ->0 9 -> 10 20->20 临时处理 */
if (X < 9)
{
X = CaculTwoPointFloat(0, 0, 9, 10, X);
}
else
{
X = CaculTwoPointFloat(9, 10, 20, 20, X);
}
}
else
{
ref_res3 = CalculRefRes(g_tCalib.NtcRes.x3, g_tCalib.NtcRes.y3); /* 计算内部上拉电阻 */
/*
公式 X/(R+X) = ADC/65535
X = ADC * R /(65535 - ADC);
*/
X = _adc * ref_res3 / (65535 - _adc);
}
if (X < 0)
{
X = 0;
}
return X;
}
2、既然硬件电路设计的就是510欧电阻分压,为何程序里面还计算这一步呢?直接赋值不就可以了吗?
3、校准参数这些是怎么得到的呢?
|
|