新闻  |   论坛  |   博客  |   在线研讨会
NTC测温中 经典温度查表算法--二分查找法
电子禅石 | 2021-08-02 11:39:53    阅读:9089   发布文章

  1. 说明: 

  2.  

  3. 二分查找法的优点:查找速度快 1024个长度的表最长只需10次查表就能得出结果 

  4. 在用NTC测试温度的方案中,NTC的温度表的长度一般是100-200 有些达到400-500的长度 

  5. 在这种情况下如果用逐个查表比较的方法来查温度 会导致查表的时间过长,影响程序的 

  6. 执行效率 这里推出一个优秀的算法来取代这种最笨的做法 

  7.  

  8. 应用实例如下: 

  9.  

  10. #define TempSize  100 //定义表长度 

  11. //温度值对应的AD值的表的定义 

  12. const int16 TabNtc_100K[TempSize]={0xf00,0xe00,oxd00,......}; 

  13.  

  14. int16 *pTmp ; //定义一个字长的指针 

  15.      

  16. pTmp = TabNtc_100K ; //指向要温度表的地址 

  17. CuTemp = FineTab(pTmp,TempSize,R_NTCAD); //查表得出温度 R_NTCAD为NTC分压得出的AD值 

  18.  

  19.  

  20. ********************************************/

    1. //*************************************  

    2. // 函数名称:FineTab  二分查找算法 ->查温度表  

    3. // 函数功能:查找数据在表中对应的位置 表中数据从大到小  

    4. // 入口参数:表地址、表长度、要查找的数据  

    5. // 出口参数:无  

    6. // 返 回 值:数据在表中的位置  

    7. //*************************************  

    8. uint8 FineTab(uint16 *a,uint8 TabLong,uint16 data)//表中数据从大到小  

    9. {  

    10.     uint8 st,ed,m ;  

    11.     uint8 i ;  

    12.   

    13.     st = 0 ;  

    14.     ed = TabLong-1 ;  

    15.     i = 0  ;  

    16.   

    17.     if(data >= a[st]) return st ;  

    18.     else if(data <= a[ed]) return ed ;  

    19.   

    20.     while(st < ed)  

    21.     {  

    22.         m = (st+ed)/2 ;  

    23.   

    24.         if(data == a[m] ) break ;  

    25.         if(data < a[m] && data > a[m+1]) break ;  

    26.           

    27.           

    28.         if(data > a[m])  ed = m ;                      

    29.         else st = m ;     

    30.           

    31.         if(i++ > TabLong) break ;  

    32.     }  

    33.   

    34.     if(st > ed ) return 0 ;   

    35.   

    36.     return m ;  

    37. }  

    38.   

    39.   

    40. //*************************************  

    41. // 函数名称:FineTab  二分查找算法 ->查温度表  

    42. // 函数功能:查找数据在表中对应的位置    表中数据从小到大  

    43. // 入口参数:表地址、表长度、要查找的数据  

    44. // 出口参数:无  

    45. // 返 回 值:数据在表中的位置  

    46. //***************************************  

    47.   

    48. uint8 FineTab(uint16 *a,uint8 TabLong,uint16 dat)//表中数据从小到大  

    49. {  

    50.         uint8 st,ed,m ;  

    51.         uint8 i ;  

    52.       

    53.         st = 0 ;  

    54.         ed = TabLong-1 ;  

    55.         i = 0  ;  

    56.       

    57.         if(dat >= a[ed]) return ed ;  

    58.         else if(dat <= a[st]) return st ;  

    59.       

    60.         while(st < ed)  

    61.         {  

    62.             m = (st+ed)/2 ;  

    63.       

    64.             if(dat == a[m] ) break ;  

    65.             if(dat < a[m+1] && dat > a[m]) break ;  

    66.               

    67.               

    68.             if(dat > a[m]) st = m ;  //ed = m ;                    

    69.             else ed = m ;//st = m ;   

    70.               

    71.             if(i++ > TabLong) break ;  

    72.         }  

    73.       

    74.         if(st > ed ) return 0 ;   

    75.       

    76.         return m ;  

    77.   

    78. }  


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客