找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1390|回复: 3
打印 上一主题 下一主题
收起左侧

关于NTC温度二分查表法的单片机程序问题

[复制链接]
跳转到指定楼层
楼主
ID:602776 发表于 2021-6-25 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想问下(AD_temp_data[head]-AD_temp_data[mid])中mid不是赋值给到head,AD_temp_data[head]应该等于AD_temp_data[mid]才对啊,想请教一下大神们

*********************************************************************************************************
*        函 数 名: AD_Value_To_Temperature
*        功能说明: 折半法查表将AD值转换为温度值,精确到小数点后一位
*        形    参:AD采样值
*        返 回 值: 温度
*********************************************************************************************************
*/
const INT16U AD_temp_data[182]=   //-20℃~70℃  0.5一格
{
    2792, 2784, 2776, 2768, 2761, 2752, 2744, 2736, 2727, 2718,
    2710, 2700, 2691, 2682, 2672, 2663, 2653, 2643, 2632, 2622,
    2612, 2601, 2590, 2579, 2568, 2556, 2545, 2533, 2521, 2509,
    2497, 2484, 2472, 2459, 2446, 2433, 2420, 2407, 2393, 2379,
    2364, 2350, 2336, 2322, 2307, 2293, 2278, 2263, 2248, 2233,
    2218, 2202, 2187, 2171, 2156, 2140, 2124, 2108, 2092, 2076,
    2061, 2044, 2027, 2010, 1993, 1977, 1960, 1943, 1926, 1909,
    1893, 1876, 1859, 1842, 1825, 1807, 1790, 1773, 1756, 1739,
    1722, 1705, 1687, 1670, 1653, 1636, 1619, 1602, 1585, 1568,
    1551, 1534, 1517, 1500, 1484, 1467, 1450, 1434, 1417, 1401,
    1385, 1368, 1352, 1336, 1320, 1304, 1288, 1273, 1257, 1241,
    1226, 1211, 1195, 1180, 1165, 1150, 1135, 1121, 1106, 1092,
    1078, 1064, 1049, 1036, 1022, 1008, 994        , 981 , 968        , 955 ,
    942        , 929 , 916 , 904 , 891        , 879 , 866        , 854 , 842        , 829 ,
    816        , 806 , 796        , 785 , 774        , 763 , 752        , 741 , 731        , 720 ,
    710        , 700 , 689        , 680 , 670        , 660 , 650        , 641 , 632        , 622 ,
    613        , 604 , 596        , 587 , 578        , 570 , 562        , 553 , 545        , 537 ,
    529        , 522 , 514        , 506 , 499        , 492 , 484        , 477 , 470        , 463 ,
    456        , 450
};

INT16U AD_Value_To_Temperature(INT16U AD_Value)
{
    INT16U head, mid, tail;
    INT32U Temp=0;

    if((AD_Value<=2364)&&(AD_Value>450))  //正值  0-70
                       
    {//在检测范围内
        head=40;
        tail=181;
        while(head<tail)
        {
            if((tail-head)!=1)
            {//尚未在两个相邻范围内
                mid=(head+tail)/2;
                if(AD_Value==AD_temp_data[mid])
                {//AD刚好在边界点上
                    Temp = (mid-40)*10/2;
                    break;
                }
                else if(AD_Value<AD_temp_data[mid])
                {
                    head=mid;
                }
                else if(AD_Value>AD_temp_data[mid])
                {
                    tail=mid;
                }
            }
            else
            {
                if(AD_Value<AD_temp_data[mid])   //倍率为10
                {
                    Temp = (head-40)*10/2;
                    Temp += ((AD_temp_data[head] -AD_Value)*5)/(AD_temp_data[head]-AD_temp_data[mid]);    //????
                }
                else if(AD_Value>AD_temp_data[mid])
                {
                    Temp = (mid-40)*10/2;        
                    Temp += ((AD_temp_data[mid] -AD_Value)*5)/(AD_temp_data[mid]-AD_temp_data[tail]);
                }
                break;
            }
        }
    }
    else if((AD_Value<=2989)&&(AD_Value>2364))  //负值
    {
        head=0;
        tail=39;
        while(head<tail)
        {
            if((tail-head)!=1)
            {//尚未在两个相邻范围内
                mid=(head+tail)/2;
                if(AD_Value==AD_temp_data[mid])
                {//AD刚好在边界点上
                    Temp = 200-(5*mid);
                    break;
                }
                else if(AD_Value > AD_temp_data[mid])
                {
                    tail=mid;
                }
                else if(AD_Value < AD_temp_data[mid])
                {
                    head=mid;
                }
            }
            else
            {
                if(AD_Value < AD_temp_data[mid])   //倍率为10   1度的偏移
                {
                    Temp = 200-(5*mid);
                    Temp -= ((AD_temp_data[mid] - AD_Value)*5)/(AD_temp_data[mid] - AD_temp_data[tail]);
                    Temp += 10;
                }
                else if(AD_Value > AD_temp_data[mid])
                {
                    Temp = 200-(5*head);
                    Temp -= ((AD_temp_data[head] -AD_Value)*5)/(AD_temp_data[head]-AD_temp_data[mid]);
                    Temp +=10;

                }
                //取补码加1
                Temp =(~Temp);
                Temp +=1;
                break;
            }
        }
    }

    return (Temp&0xFFFF);
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:808485 发表于 2021-6-25 17:50 | 只看该作者
我觉得你说的对
回复

使用道具 举报

板凳
ID:718725 发表于 2021-6-27 14:33 | 只看该作者
做温度检测不错的
回复

使用道具 举报

地板
ID:602776 发表于 2021-6-28 15:41 | 只看该作者
这个程序还是有问题,刚才本人调试了一下,会出现AD_temp_data[head]等于AD_temp_data[mid]情况,但是程序没有跑死
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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