引言
现代家电(如冰箱、空调等),功能越来越多,技术含量越来越高,这些家电大多使用单片机进行控制。近几年来单片机得到了飞速的发展,从8位机发展到目前的32位机,存储器从OTP发展到现在的FLASH,内部资源也越来越丰富。但是家电产品追求利润,单片机在选型时,往往选择能满足要求的最低配置,在复杂的设计中,常常会遇到内部FLASH空间不够的问题。为此,本文针对家电产品常用的温度测量,提出了一种查表数据压缩算法,有效降低了FLASH空间占用。
1 NTC负温度系数热敏电阻选型
1.1 NTC负温度系数热敏电阻
NTC(Negative Temperature Coefficient,负温度系数热敏电阻)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料[1]。NTC当作温度传感器,在家电、汽车电子、医疗仪器、手机电池及充电电器等方面应用广泛。在比较高档的冰箱上,会用到6~10只NTC,各NTC的温度转换是程序设计的重要部分。
1.2 NTC电阻值和温度变化的关系
在实际产品设计应用中发现,NTC电阻值和温度变换是成非线性关系的[2]。二者关系如下所示:
RT=RN×exp[B(1/T-1/TN)](1)
其中,RT是在温度为T时的NTC热敏电阻值,RN是额定温度为TN时的NTC热敏电阻值,T为所测温度。因为材料常数B本身也是温度T的函数,所以式(1)是经验公式,只有在额定温度TN或额定电阻阻值RN的有效范围内才具有一定的精度,在全部范围内偏差可能超过10%。
1.3 NTC参数选择
在设计冰箱时,会根据具体的应用部位选择不同参数的NTC,并按照冰箱间室的不同特征温度选择NTC的额定温度。如冷藏室温度为1~8 ℃,特征温度为5 ℃,测量冷藏室温度的NTC选择R (5 ℃)=5K06,B(5/25 ℃)=3 839K;冷冻室的温度为-15~-25 ℃,特征温度为-18 ℃,测量冷冻室温度的NTC选择R(-18 ℃)=16K9,B(-18/25 ℃)=3 771 K;测量环境温度的NTC选择R(25 ℃)=5K0,B(5/25 ℃)=3 839K。
2 温度测量方法
2.1 单片机测量温度电路
以冷冻室温度测量电路为例,如图1所示,分压电阻R1=10 kΩ,若ADC转换精度为8位,则NTC所测温度经ADC转换后的值为255×RT/(RT+10)。图2给出了1.3节中3种参数的NTC的温度电阻值A/D值的部分数据。
图1 冷冻室温度测量电路
图2 RT表及对应的A/D值
2.2 查表算法
在实际应用中,单片机性能和公式的偏差决定了不可能由式(1)直接推算出所测温度,简便可行的办法是查表。
以冷冻室温度传感器为例,温度测量范围为-40~40 ℃,共81个温度值,对应的A/D值为220~25,共196个。每个温度值对应1~4个A/D值,每个A/D值对应一个温度值。为了处理简便,将温度范围调整为0~80 ℃,可得到以下数组temp_f1:
unsigned char consttemp_f1[196]={
0,0,//-40℃,A/D值220,219
1,1,//-39℃,A/D值218,217
2,2,3,3,4,4,4,5,5,6,6,7,7,7,8,8,8,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,21,22,22,22,
23,23,23,23,24,24,24,25,25,25,26,26,26,26,27,27,27,28,28,28,29,29,29,30,30,30,
31,31,31,31,32,32,32,33,33,33,34,34,34,34,35,35,35,36,36,36,37,37,37,38,38,38,38,
39,39,39,40,40,40,41,41,41,42,42,42,43,43,44,44,44,45,45,45,46,46,46,47,47,
48,48,48,49,49,49,50,50,51,51,52,52,52,53,53,54,54,55,55,56,56,57,57,58,58,59,59,60,60,61,61,62,63,63,64,65,65,66,67,67,68,69,69,70,71,72,73,74,75,76,77,78,
79,//39,26
80,//40,25
};
由此可得到NTC所测温度:
T=temp_f1[AD-220](2)
其中AD值是A/D转换后的值。
这是最普通直接的算法,但在单片机应用领域,存在表格数据所占空间太大的问题。在冰箱中,有多种参数的NTC,表格数据所占空间在0.5 KB以上,对单片机的选型和成本影响很大。必须采用某种形式的压缩算法,并且是无损的压缩方式,这在单片机内存空间紧张时非常有用。
2.3 无损压缩查表算法
鉴于查表法产生的表格数据占据存储空间量大的问题,本文提出了一种实用的无损压缩查表算法。 用1个字节表示2个温度值,如:-40 ℃,对应的A/D值有2个,-39 ℃,对应的A/D值有2个,可以用十六进制数据0x22表示-40 ℃和-39 ℃对应的A/D值。得到数组temp_f2,数组temp_f2比数组temp_f1所占空间减少了79%,但包含的信息是相同的。
unsigned char const temp_f2[41]={
0x22,0x22,0x23,0x32,0x23,0x33,0x33,0x33,0x33,0x33,0x43,0x43,0x33,0x34,0x34,0x43,0x33,0x34,0x33,0x34,0x33,0x23,0x33,0x23,0x33,0x22,0x23,0x22,0x22,0x22,0x22,0x21,
0x21,0x21,0x21,0x11,0x11,0x11,0x11,0x11,0x11
};
当然,还可以进一步压缩,从图2中可以看出,每个温度对应的A/D值不超过4个,因此可以用1个字节的2位表示1个温度值,那么1个字节就表示4个温度值。以上数组可压缩成21个字节,节省空间89.2%,这种压缩方法在解压缩时,耗费的程序空间要大一些。图3为将数组temp_f2压缩/解压缩的流程图。
图3 数组temp_f2压缩/解压缩的流程图
3 实验结果
对于一款ROM为4 KB的单片机而言,使用本文提出的无损压缩算法所占的内存空间为0.08 KB,未使用压缩算法处理的表格数据占内存空间为0.53 KB。选择样本为500台的家用电冰箱做测试,发现程序跑飞的概率二者分别为0%和0.2%,验证了本算法的可行性。
结语
本文给出的压缩算法,可有效地降低温度转换部分程序占用量,在家电产品巨大的成本压力下,让单片机有限的FLASH存储空间容纳更多的功能。