3661|10

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求指点迷津。。。。。。。。。。。。。。。。。。。 [复制链接]

两根线,既提供电源也作为通信线,正极32V,负极0V, 通信时,正极电压,高电平32V,低电平10V,不通信时电压32V,

宽脉冲代表1,窄脉冲代表0,想用输入捕获,但是不知道电平如何处理,求高手指点迷津。如下图

此帖出自51单片机论坛

最新回复

我用的是软件方法,你用的是硬件方法。  详情 回复 发表于 2011-10-5 16:57
点赞 关注
 

回复
举报

1万

帖子

141

TA的资源

版主

沙发
 
用电阻分压,然后用运放搭成比较器整定成TTL信号即可。
此帖出自51单片机论坛
 
 
 

回复

535

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
学习了,我也不怎么懂阿!看来高手还是有的!支持助人为乐拉!
此帖出自51单片机论坛
 
 
 

回复

1469

帖子

0

TA的资源

五彩晶圆(中级)

4
 
唉,当初来到eeworld的第一个帖子也是因为类似的一个问题,也想到了类似的解决办法,不过最后还是没做出来....
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 
首先分压,最简单的用电阻,复杂点的用运放做成比例电路。
先试试最简单的电路分压,把32V分成5V,那10V也就是5/3.2 1V多一点,作为低电平没问题了。

然后是检测脉冲宽度——因为你这里的情况是以脉冲长度代表0和1.

检测脉冲的基本方法是 把相应IO口,就是连着你的信号线的那个IO口 先拉高,然后,有时要延时一小会,然后再去读取该IO的状态值。
大多数51而言,每次读取IO口状态都要先拉高。

为了判断不同的脉冲宽度,我提供两个方案:
1 纯粹软件计时,比如说做一个while循环,循环条件就是IO口电平为高。
首先检测到一次为低,然后进入这个死循环,在死循环里不断重新拉高IO,重新检测IO口,如果仍为低,则循环内计数器加1(这里说的计数器,其实就是一个变量。)然后这个死循环做成条件是IO口不为低则退出。

也就是:
sbit signal Px.x
while(signal);//等待IO口为低
while(!signal) /IO口为低则持续计数
{
     counter++; //计数器加1
}

这个东西是意思一下,让你知道这个检测的原理,实际上真正做东西,要这么做,那是不合理的,为啥呢?因为你的CPU全让卡在这个地方了,CPU就跑得不够流畅。
所以我推荐一个更好一些的方法。

在定时器中断里计数。
首先,我们假设你这里的宽窄脉冲宽度,能够以10毫秒计整,比如说一个100毫秒,一个40毫秒。
首先,我们在程序里开启定时器中断,在每次中断里,我们首先检测IO口状态,如果为高,忽略,如果为低,用一个静态变量记录这个状态,然后同样为定时器内部的静态定时器加1.
当IO口重新跳变为高电平之后,我们检测这个定时器的数值,它表示经过了多少个10毫秒。
我们由此可以判断IO口低电平持续了多久。从而判定是什么状态。

这里有一个小问题,如果IO口在1个10毫秒内发生了跳变,那该怎么办呢?我不是误判了?
是的,考虑到这个问题说明你真得很细心。
但是我想说的是,机械抖动典型的都有5到10个毫秒。也就是说,定时器中断的方式,当然不是这么持续地检测该IO口,也是一阵子一阵子来的,当时,当这个时间间隔足够短的时候,我们可以认为它是持续的,并且这样做,程序没有被任何地方卡住,可以运行的很流畅。

当然,你也可以选择5毫秒甚至1毫秒作为检测周期,但问题是,1个毫秒真的有必要么?一个小小的抖动就可以让你出现误判——这种程序,必须认真考虑到对诸如抖动在内的一些常见问题的影响,一个好的程序应该对抖动具有足够短额包容性。
我们上面还没有考虑到消抖,如果使用10毫秒,实际上已经顺带完成了 消抖工作。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

6
 

定时器方式 程序参考片段(随手写的,如有漏,请自行补充)

sbit signal Px.x
void timer0(void)interrupt 1
{
   
    static counter  = 0;
    static state = 1;
     
    if(signal != state)
    {
        state = signal;
        counter++;
    }
    if((signal != state) && (state == 0))
    {
        state = 1;
//下面一句是伪代码,请根据相应脉冲长度调整判断条件和做相应全局或者静态标志,因为中断程序既不能带形参也不能有返回值。
        if(counter > ).......
      
    }
        
         
  
}
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

7
 
感谢版主细心耐心的回答,我就是不知道怎么处理这个信号电平问题,对了,对于TTL电平不是说高电平>2.4,低电平<0.8吗?
此帖出自51单片机论坛
 
 
 

回复

1469

帖子

0

TA的资源

五彩晶圆(中级)

8
 
对了,当时还有个问题,这根线到终端以后要分成信号和电源,提取信号好说,比较器就可以了,但是怎么才能保证电源的稳定呢?滤波的话恐怕就把信号滤掉了吧...

还有,感觉32V和10V两个值就可以表示0和1了吧,为什么还要用脉冲宽度编码呢?
此帖出自51单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

9
 

原帖由 anqi90 于 2011-10-3 14:18 发表 这根线到终端以后要分成信号和电源,提取信号好说,比较器就可以了,但是怎么才能保证电源的稳定呢?滤波的话恐怕就把信号滤掉了吧... [/quote]

问得好!串个二极管挡一下再滤波,就不会把信号滤掉了。

 

[quote]原帖由 anqi90 于 2011-10-3 14:18 发表 感觉32V和10V两个值就可以表示0和1了吧,为什么还要用脉冲宽度编码呢?

可靠性的考虑,较之单纯地用32V/10V表示0/1,这种办法等于给每一位信息都加上了同步,避免因收发双方时钟的误差积累导致通信错误。

此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 
我用的是软件方法,你用的是硬件方法。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

11
 

分压后用电压比较器然后用输入捕获,搞定!

此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表