迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1240|回复: 5

【提问】86盒NTC温度校正算法问题?

[复制链接]

5

主题

13

回帖

188

积分

注册会员

Rank: 2

积分
188
发表于 2021-3-20 08:51:05 | 显示全部楼层 |阅读模式
最近需要用带NTC热敏电阻测温的屏幕做测温应用,这款是带86盒的,但是由于屏幕自身存在发热,测温效果一直偏高,同时屏幕自身温度也并非线性变化,所以想请教一下个位有没有好的方法来校正温度
回复

使用道具 举报

0

主题

220

回帖

2264

积分

金牌会员

Rank: 6Rank: 6

积分
2264
发表于 2021-3-20 19:38:19 | 显示全部楼层
楼主看从软件上可以从拟合曲线的方式来提高精准度;可以用查表法与插值法结合来加强精度;
从硬件上要采用精度高的运放与电阻电容进行信号放大。
还有在产品上做好隔热措施,86盒内部自带继电器,就有发热源。
回复

使用道具 举报

5

主题

13

回帖

188

积分

注册会员

Rank: 2

积分
188
 楼主| 发表于 2021-3-22 10:14:16 | 显示全部楼层
wnly 发表于 2021-3-20 19:38
楼主看从软件上可以从拟合曲线的方式来提高精准度;可以用查表法与插值法结合来加强精度;
从硬件上要采用 ...

你好,我当前用的是查表法,NTC是这款屏幕自带的。NTC一直在屏幕内部,所以我想物理隔热措施应该是不可取的。只能从软件上下手,因为我看到出厂程序的测温就挺准的,但是官方C程序程序也是用的查表法,并没有做其他修正,所以这里我有大大的疑惑
回复

使用道具 举报

11

主题

79

回帖

649

积分

高级会员

Rank: 4

积分
649
发表于 2021-3-22 17:09:57 | 显示全部楼层
如果屏幕内部温度非线性变化影响到采样,就不可能有高精度,也不可能有个什么补偿算法.
湖南迪弘科技有限公司
联系人:文彧15576128088
地址:迪文湖南科技园 5栋7楼
回复

使用道具 举报

5

主题

13

回帖

188

积分

注册会员

Rank: 2

积分
188
 楼主| 发表于 2021-3-24 15:53:46 | 显示全部楼层
夫子 发表于 2021-3-22 17:09
如果屏幕内部温度非线性变化影响到采样,就不可能有高精度,也不可能有个什么补偿算法. ...

void Get_Temperature(u16 tim,u16 n)
{
        static u16 i=0,temp_t=0;
        float temp1=0,temp2=0;
        if(AD_Count>tim)
        {
                Get_ADC_Value();
                i++;
                if(i>=n)
                {                       
                        Get_R_Value(n);
                        R1_Temperature=FindTab(TabNTC_10k,TempSize,R1_value);
                        R2_Temperature=FindTab(TabNTC_10k,TempSize,R2_value);
                        temp1=(TabNTC_10k[R1_Temperature]-R1_value)*1.0/(TabNTC_10k[R1_Temperature]-TabNTC_10k[R1_Temperature+1]);
                        temp2=(TabNTC_10k[R2_Temperature]-R2_value)*1.0/(TabNTC_10k[R2_Temperature]-TabNTC_10k[R2_Temperature+1]);
                        R1_Temperature=R1_Temperature*10+temp1*10;
                        R2_Temperature=R2_Temperature*10+temp2*10;
                        write_dgus_vp(0x1002,(u8*)&R1_Temperature,1);
                        write_dgus_vp(0x1004,(u8*)&R2_Temperature,1);
                        Temperature_Real=(R1_Temperature*Temp_Coef[0]-R2_Temperature*Temp_Coef[1]+Temp_Coef[2]);
                        Temperature_Real=(Temperature_Real/(10*Temp_Pre))*10;
                        if(abs(Temperature_Real-Temperatrue_Real_Old)==Temp_Pre)
                        {
                                temp_t++;
                                if(temp_t<5)
                                {
                                        Temperature_Real=Temperatrue_Real_Old;
                                }
                                else
                                {
                                        temp_t=0;
                                        Temperatrue_Real_Old=Temperature_Real;
                                }
                        }
                        else if(abs(Temperature_Real-Temperatrue_Real_Old)>=Temp_Pre*2)
                        {
                                Temperatrue_Real_Old=Temperature_Real;
                                temp_t=0;
                        }
                        write_dgus_vp(TEMP_CURRENT,(u8*)&Temperature_Real,1);
                        memset(adc_val,0,sizeof(adc_val));
                        i=0;
                }
                AD_Count=0;
        }
}


上面一段程序是来源于迪文官方的。他的算法是用两路NTC的温差进行参数换算的,可能也是出厂demo里用到的算法,我想知道它的原理是什么

回复

使用道具 举报

15

主题

112

回帖

1724

积分

金牌会员

Rank: 6Rank: 6

积分
1724
发表于 2023-7-14 14:04:46 | 显示全部楼层
pmk_health 发表于 2021-3-24 15:53
void Get_Temperature(u16 tim,u16 n)
{
        static u16 i=0,temp_t=0;

其实就是大数据算的,根据实际温度与R1温度和R2温度,经过统计数据计算出系数Temp_Coef[0],Temp_Coef[1],Temp_Coef[2]。根据这个系数反推实际温度。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-5-23 23:11 , Processed in 0.124007 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表