高分辨率温度采集算法优化.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高分辨率温度采集算法优化

高分辨率温度采集算法优化摘要:本文表述一种高效、实用的高分辨率的温度采集算法,适用于低成本8位单片机(本文所用单片机为为意法半导体 STM8L152K4T6),以实现空调高精度控制。除了温度采集外,此算法适合其他非线性的模拟量采集,提高采集分辨率。关键字:AD采集;单片机;STM8L152K4T6;高分辨率;非线性引言随着生活质量的提高,人们对空调控制要求越来越精确。传统1℃分辨率的控制精度已经不能满足要求。单片机也越来越强大,集成10bit、12bitADC的单片机也已经很普遍,让低成本、高精度、高分辨率温度采集成为现实。1 传统方法优缺点分析第一种是直接查表法。表中的值为温度值,根据AD采样值,直接查表得出温度值。此方法可以很好解决模拟量的非线性问题,同时处理速度快。最大缺点是无法做到高分辨率。8bitAD采样,表格大小为256byte,10bit就会变为2*1024byte,12bit的话2*4096byte。表格巨大,制作难度也大。第二种做法,将温度曲线分为8段,求出每一段的线性表达式,将得到的系数存为表格。每段进行线性计算。此方法可以做到很高的分辨率,而且不需要表格。缺点是,人为分的这8段,每一段假定为线性,单并非真实的线性,整数部分可能出现偏差,同时由于系数往往不是整数,因此此方法计算量大,8位单片机运行负担较重。2 二分查表求值法结合两种方法的优点,可以做一个新的算法。整数部分通过查表求得,保证准确,小数部分线性插值,提高分别率。此方法可以无需很大的表格,可以得到0.1度的分辨率。下面以12bit AD为例,表述具体实现方法。2.1表格制作:区别与传统方法,按照AD值,做温度表,表格中存放温度值;此法是根据温度值,做AD值的表,表格中存放的是AD值。如 25度为10K,通过计算就可以得到AD值:1830 。以此类推,-20~100做121个值的表格Tab[121](int型),占用空间242byte。表格的大小由温度点个数决定,不受AD分辨率影响。2.2 具体算法:2.2.1:得到AD值2.2.2:查找整数部分表格内的值不能举尽所有AD采样值,所以无法直接查表得出对应温度。最简单的方法是得到的AD值同表格内的的值比较一遍,直到Tab[i] = AD Tab[i+1],温度值整数部分TempInt = i。根据温度不同,占用约50~2200个时钟周期for(i=0;i120;i++){if((ADCVal = TempADTab[i]) (ADCVal TempADTab[i-1])){TempInt = i-1;break;}}此方法有遍历表格中的每一个数据,速度较慢。因此采用二分法来进行快速查询。首先AD值比较表格中Tab[0]~Tab[120]中间的数据Tab[60],如果AD Tab[60],就比较Tab[60]~Tab[120]数据中间数据Tab[90],如果AD = Tab[60],就比较Tab[0]~Tab[60]数据中间数据Tab[30]。循环进行,直到找到Tab[i] = AD Tab[i+1],则TempInt = i。因为2^6=64 120 2^7=128所以用此方法,6次即可找到整数部分。占用约270个时钟周期TempMin = 0;TempMax = 120;TempCal = TempMax;while(TempCal != TempMin){//如果中间值等于最小值,则计算结束TempAD = TempADTab[TempCal];if(ADCVal TempAD){ TempMin = TempCal;}//取上半部分,得到最小值else{ TempMax = TempCal;}//取下半部,达到最大值TempCal = TempMin + TempMax;TempCal = TempCal1 ;} Temp = TempCal*10;//整数部分2.2.3:计算小数部分Tab[i] 、Tab[i+1]间隔为1度,在一度范围内可认为阻值随温度线性变化,对这一度进行插值计算。ADBuf = Tab[i+1] -Tab[i]实际AD值与Tab[i]的差值ADBuf2 = AD - Tab[i]所以小数部分可以计算TempDecimal = 1*(ADBuf2/ ADBuf)取合适的小数位数。最终Temp = TempInt + TempDecimalBuf1 = TempADTab[TempCal+1];Buf2 = TempADTab[TempCal];Buf1 = Buf1 - Buf2;if(ADCVal TempADTab[TempCal]){Buf2 = ADCVal - TempADTab[TempCal];}else{ Buf2 = 0;}Buf2

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档