单片机采用STC12C5410AD,由于该单片机的AD转换没有外部基准,基准源只能为VCC,而7805输出的电压有时并非标准的5V,可能会在4.9~5.1V间波动,为减小因电源而引起的误差,采用一AD口外接2.5V基准源,通过AD转换后的结果来反推VCC值,然后通过实际的VCC值来计算温度传感器输入AD口的电压值。
由于NTC为非线性器件,所以温度检测采用查表的方式。将热敏电阻在不同温度下的阻值做成表格;在检测温度的时候再计算出此时热敏电阻的阻值通过查表来比较。
网上大多数的例子是先将温度根据电路换算成电压值(数字量)。程序中启动AD转换后不需要再计算,而是直接拿到表格中去比较,这样做的话程序执行的效率会高些,缺点是做表格要麻烦点。
由于我这里每次检测时的VCC值不固定(有上百毫伏的波动),所以采用上面第一种方式。
做程序的时候出现过一个问题,就是两个16位数乘法结果溢出,算出来结果不对,后来发现原来是没有强制转换类型的原因,如下式:
uint a,b,c;
ulong d;
d=a*b/c;
改正后如下
uint a,b,c;
ulong d;
d=(long)a*b/c;
两个16位数相乘若结果大于16位,应先将其强制转换成长整形,再做运算,这样才不会溢出。
完了后做了一下测试,选取温度范围10~50度
10度左右的时候显示的温度值比实际温度低1~2度。
40度~50度左右的时候显示的温度值比实际温度高1~2度。
中间区域较正常。
看来还有一个温度补偿的问题,明天继续。。。。。
文章评论(0条评论)
登录后参与讨论