求滞回比较器的软件算法实施

[复制链接]
5343|11
 楼主| zmw809154465 发表于 2013-11-18 15:10 | 显示全部楼层 |阅读模式
通过单片机去采集一个传感器的AD电压,当传感器的电压(AD值)是从0V上升到5V的过程中,在4.2V以下的这段为逻辑on,为1;当传感器的电压(AD值)是从5V下降到0V的过程中,在3.2V以上的这段为逻辑off,也就是说3.2V到4.2V为滞回状态。请问软件上如何实现,个人的观点时,采集AD电压时保留上次的AD值,然后与当前的AD值比较,判断是否是在上升阶段还是下降阶段,这方法是否有bug?请高手指点,最好可以有个算法代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
frlop 发表于 2013-11-18 15:53 | 显示全部楼层
本帖最后由 frlop 于 2013-11-18 15:56 编辑
  1. typedef struct{
  2.         int        Val;
  3.         int        LastVal;
  4.         unsigned char RiseFlag;
  5.         unsigned char DropFlag;
  6. } Hys_Typ;

  7. Hys_Typ Hys;

  8. unsigned char  Hysteresis()
  9. {
  10.         unsigned char dat;
  11.         
  12.         Hys.Val = ADCRead();        
  13.         
  14.         if((Hys.Val > 32) && (Hys.LastVal < 32))
  15.                 Hys.RiseFlag = 1;
  16.         if((Hys.Val < 42) && (Hys.LastVal > 42))
  17.                 Hys.DropFlag = 1;
  18.                
  19.         if(Hys.Val < 32)                 
  20.         {        
  21.                 dat = 1;
  22.                 Hys.RiseFlag = Hys.DropFlag = 0;
  23.         }
  24.         else if(Hys.Val <= 42)
  25.         {
  26.                 if(Hys.RiseFlag == 1)           dat = 1;
  27.                 if(Hys.DropFlag == 1)         dat = 0;
  28.         }
  29.         else
  30.         {                             
  31.                 dat = 0;        
  32.                 Hys.RiseFlag = Hys.DropFlag = 0;               
  33.         }
  34.         
  35.         Hys.LastVal = Hys.Val;        
  36.         
  37.         return dat;
  38. }
没验证过,仅供参考。
yinlitansuo 发表于 2013-11-18 15:59 | 显示全部楼层
二楼有点牛!
coody 发表于 2013-11-18 16:07 | 显示全部楼层
我用Excel来计算的

评分

参与人数 1威望 +1 收起 理由
zmw809154465 + 1 赞一个!

查看全部评分

ayb_ice 发表于 2013-11-18 16:12 | 显示全部楼层
高于或低于门槛,输出状态确定

在中间范围,保持上次状态

完毕

评分

参与人数 1威望 +4 收起 理由
frlop + 4 正解。

查看全部评分

frlop 发表于 2013-11-18 16:40 | 显示全部楼层
ayb_ice 发表于 2013-11-18 16:12
高于或低于门槛,输出状态确定

在中间范围,保持上次状态

正解
我智商明显不足。
当反面教材了。
ayb_ice 发表于 2013-11-18 17:08 | 显示全部楼层
frlop 发表于 2013-11-18 16:40
正解
我智商明显不足。
当反面教材了。

只能说明你没有真正理解这个触发器
frlop 发表于 2013-11-18 18:45 | 显示全部楼层
ayb_ice 发表于 2013-11-18 17:08
只能说明你没有真正理解这个触发器

学习了。
tergy2012 发表于 2013-11-19 11:18 | 显示全部楼层
学习一下先
 楼主| zmw809154465 发表于 2013-11-19 11:50 | 显示全部楼层
其实就是这么简单的一个程序,想太多了:dizzy:
 楼主| zmw809154465 发表于 2013-11-19 11:53 | 显示全部楼层
ad_data = ADRead();
if(ad_data < 3.2)
{
   out = 1;
}
if(ad_data > 4.2)
{
   out = 0;
}
zoulinqi110 发表于 2015-5-6 17:20 | 显示全部楼层
开机时值在这个区间怎么处理?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部