打印
[STM8]

二分法查温度稍作修改好像会死循环,求大神指教

[复制链接]
2626|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
KuMo_2011|  楼主 | 2014-7-25 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 KuMo_2011 于 2014-7-25 11:23 编辑

#include "temp.h"
#include "stm8s_gpio.h"
const u16 TEMP_TABLE_5k[101]=
{
  0x2F6,//0
     .
     .
     .
  0x057,
};

  u8 FindTemp(u16 mAD,u16 *mTemp)
  {
    s16 mResult;
    u8 mLeft,mMiddle,mRight; //左值、中值、右值
    mLeft=0;
    mRight=100;
方法1
/*
    while(mRight>mLeft)
    {
      mMiddle=(mRight+mLeft)/2;
      if(mAD<TEMP_TABLE_5k[mMiddle])
      {
        if(mAD<TEMP_TABLE_5k[mMiddle+1])
        {
          mLeft=mMiddle+1;
        }else
        {
          break;
        }
      }else
      {
        mRight=mMiddle;
      }
    }
*/
方法2
///*   
    while(mRight>mLeft)
    {
      mMiddle=(mRight+mLeft)/2;
      if(mAD>TEMP_TABLE_5k[mMiddle])
      {
        if(mAD>TEMP_TABLE_5k[mMiddle-1])
        {
          mRight=mMiddle-1;
        }else
        {
          break;
        }
      }else
      {
        mLeft=mMiddle;
      }
    }
//*/
    mResult=mMiddle*10;//+(TEMP_TABLE_5k[mMiddle]-mAD)*10 /(TEMP_TABLE_5k[mMiddle]-TEMP_TABLE_5k[mMiddle+1]);
    *mTemp=mResult;
    return 1;
  }
问题描述:
本人想用 二分法差NTC温度,NTC是负温度系数的热敏电阻,个人认为方法1和方法2都能实现目的,但结果方法2动不动 貌似就会死循环,请教一下大家,方法2是哪里我写错了吗?

子程序附件
temp.zip (799 Bytes)



沙发
huzi2099| | 2014-7-25 11:27 | 只看该作者
不要这么麻烦,建个表一一对应不用二分法

使用特权

评论回复
板凳
le062| | 2014-7-25 14:21 | 只看该作者
mMiddle=(mRight+mLeft)/2;
改成
mMiddle=(mRight+mLeft)/2+1;

你再测一下

使用特权

评论回复
地板
le062| | 2014-7-25 14:25 | 只看该作者
你可以调试到死循环的地方看看各个变量的值,具体分析

也可以纯粹从逻辑上分析,分析到最后你就知道为什么会死循环了

使用特权

评论回复
5
KuMo_2011|  楼主 | 2014-7-25 15:20 | 只看该作者
le062 发表于 2014-7-25 14:25
你可以调试到死循环的地方看看各个变量的值,具体分析

也可以纯粹从逻辑上分析,分析到最后你就知道为什么 ...

我找到问题了,谢谢!

使用特权

评论回复
6
mmuuss586| | 2014-7-25 18:25 | 只看该作者
KuMo_2011 发表于 2014-7-25 15:20
我找到问题了,谢谢!

呵呵,哪里问题呢

使用特权

评论回复
7
lu50211| | 2014-7-26 08:30 | 只看该作者
楼主,问题出在哪儿呢?

使用特权

评论回复
8
le062| | 2014-7-26 19:24 | 只看该作者
这个问题看不出来吗

mMiddle=(mRight+mLeft)/2;这句和后面的处理方法完全是不搭调的

使用特权

评论回复
9
KuMo_2011|  楼主 | 2014-7-29 16:57 | 只看该作者
本帖最后由 KuMo_2011 于 2014-7-29 17:00 编辑
le062 发表于 2014-7-26 19:24
这个问题看不出来吗

mMiddle=(mRight+mLeft)/2;这句和后面的处理方法完全是不搭调的 ...

?上面的程序逻辑是有点问题,但我觉得mMiddle=(mRight+mLeft)/2这句没错啊,完全不搭调就更不至于了吧,也许是我没明白,能讲的明白一点吗?
现在程序改过了,能查到温度,但mMiddle=(mRight+mLeft)/2我认为是没错的,也是和后面的程序对的上的,方法是二分法查温度。当局者迷,我现在不明白,完全不搭调是什么意思

使用特权

评论回复
10
KuMo_2011|  楼主 | 2014-7-29 17:04 | 只看该作者
mmuuss586 发表于 2014-7-25 18:25
呵呵,哪里问题呢

我找到的一个问题是,在有时快查出温度时的有些点,判断条件不足,有些情况没考虑到,是会导致逻辑上进入死循环的

使用特权

评论回复
11
KuMo_2011|  楼主 | 2014-7-29 17:05 | 只看该作者
lu50211 发表于 2014-7-26 08:30
楼主,问题出在哪儿呢?

判断条件不足,有些情况没考虑到,导致有时逻辑上进入死循环

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

494

帖子

2

粉丝