打印

IO口读出来的值不稳定

[复制链接]
2712|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
栩栩如生|  楼主 | 2013-1-13 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5v供电的,前端有个运放,用一个IO口做输入判断运放的输出的高低电平信号,现在测出运放输出高电平是3.8v左右,低电平是2.5v左右,问题出在低电平的时候IO口读出来的值不稳定,一会是1 一会儿是0。
沙发
栩栩如生|  楼主 | 2013-1-13 09:07 | 只看该作者
看了2051的手册IO口输入低电平应该< 0.2VCC,没搞懂了,因为这个板子是公司以前人设计的,一直用到都没问题,现在那人走了,源代码找不到了,叫我重做就不行了,我直接把以前的片子焊到新板子上工作完全没问题,1,0输出很稳定,实在是搞不懂了,难道可以通过程序搞定哇。

使用特权

评论回复
板凳
renyaq| | 2013-1-13 09:08 | 只看该作者
运放直接接I/O么?连接点有没有通过一个电容接地?或者上张原理图看看

使用特权

评论回复
地板
zwll| | 2013-1-13 09:08 | 只看该作者
你还是贴图吧,注意2051的P1.0 P1.1 是可以做比较器的

使用特权

评论回复
5
chuxh| | 2013-1-13 09:09 | 只看该作者
2.5V的话MCU读出来高或低是正常的,应该是接入内部比较器了

使用特权

评论回复
6
juventus9554| | 2013-1-13 09:10 | 只看该作者
要用示波器看输出波形,不能用万用表

使用特权

评论回复
7
栩栩如生|  楼主 | 2013-1-13 09:11 | 只看该作者
我确实模电学的差,不过看已经有个运放了,在220V导通的时候输出应该到0v对不对?
但是现在是2.5V

使用特权

评论回复
8
栩栩如生|  楼主 | 2013-1-13 09:11 | 只看该作者
应该也不是哦,这个事开路运放,是不是直接按电压差放大?

使用特权

评论回复
9
栩栩如生|  楼主 | 2013-1-13 09:12 | 只看该作者
好像有点明白了,接通220V的时候,运放输出应该是个50Hz的方波,所有IO口读到的状态太会不定,这个应该只有靠程序来解决,不知大家有不有好的方法啊

使用特权

评论回复
10
司徒老鹰| | 2013-1-13 09:12 | 只看该作者
这就对了,万用表量的是平均或真有效值

使用特权

评论回复
11
dingy| | 2013-1-13 09:14 | 只看该作者
数脉冲有脉冲就是220接通。。。。。。。   不知道行不行

使用特权

评论回复
12
pengf| | 2013-1-13 09:14 | 只看该作者
分析了数据已经搞定了,我想的方法比较简单,就是连续来N个高,我才判断为高,但是一旦有低我会马上判断为低

使用特权

评论回复
13
supernan| | 2013-1-13 09:16 | 只看该作者
AC220V,50HZ要记住啊

使用特权

评论回复
14
houcs| | 2013-1-13 09:17 | 只看该作者
有点像三相检测的部分电路,#define MissingCheckT_C      50    //检查一次缺相的IO消抖时间
#define MissingCheckBufT_C   20    //不是误差的时间
#define MissingKeepMaxT_C    500   //5秒为一个周期,开始查看缺相情况

        PhaseLBuf1_B=PhaseL_B;//读取IO状态
        if(PhaseLBuf2_B==PhaseLBuf1_B)//状态没有改变
        {
                if(Phase.MissingPhaseBTime<MissingCheckT_C)Phase.MissingPhaseBTime++;
                else
                {
                        Phase.PhaseBState<<=1;      //将这个循环读到的状态右移
                        if(PhaseLBuf1_B)            //保存本次的状态
                        {
                                Phase.PhaseBState|=0x01;
                        }
                        else Phase.PhaseBState&=0xfe;
                        Phase.MissingPhaseBTime=0;//重新新的计时
                }
        }
        else//状态有改变
        {
                if(Phase.MissingPhaseBTime<MissingCheckBufT_C)Phase.PhaseBState&=0xfe; //在200ms内有状态做改变,认为是正常的电网丢波,不作为缺相,清掉低位
                Phase.MissingPhaseBTime=0;
                PhaseLBuf2_B=PhaseLBuf1_B;
        }
        if(Phase.MissingKeepTime<MissingKeepMaxT_C)Phase.MissingKeepTime++;//一个周期5秒左右
        else
        {
                b=0;
                Phase.MissingKeepTime=0;
                for(i=0;i<8;i++)//查询8次读取的Io状态
                {
                        if(Phase.PhaseBState&(1<<i))b++;
                }
                if(b>6)LostPhaseB_F=1;                                        // 检测到6次以上出现高电平,则认为是缺相
                else if(b<4)LostPhaseB_F=0;
        }

使用特权

评论回复
15
liuzaiy| | 2013-1-13 09:17 | 只看该作者
在运放的正输入端和地之间接一个1uF左右的电容,在220V的负半周5V通过10K电阻对电容充电,电压不会升到比负输入端电压高,运放会一直输出低电平。但这样的缺点是断开220V后运放不会立刻输出高电平,会有一点延迟。

使用特权

评论回复
16
栩栩如生|  楼主 | 2013-1-13 09:18 | 只看该作者
太感谢各位的帮助了,我用累加检测的方法,暂时解决现在的问题了。
下一步还是按照大家的方法,改改硬件电路,这样才是根本解决问题的方法

使用特权

评论回复
17
yinxiangh| | 2013-1-13 09:19 | 只看该作者
50Hz2051貌似能反映吧,能够软件解决的问题就不要硬件啦,成本忒高

使用特权

评论回复
18
pangb| | 2013-1-13 09:19 | 只看该作者
50Hz2051貌似能反映吧,能够软件解决的问题就不要硬件啦,成本忒高

使用特权

评论回复
19
chenjunt| | 2013-1-13 09:20 | 只看该作者
你这哪是运放啊,没有反馈,就是一个简单的比较器,用来对光光耦的输出进行整形的

至于你测不出高低电平,楼说的对,有示波器看一下就明白了,50HZ的信号万用表根本测不出来

使用特权

评论回复
20
ousj| | 2013-1-13 09:20 | 只看该作者
有个产品用过LM393比较器,可以通过变压器,读取220V的过零信号,过零时输出为低,否则为高。

使用特权

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

本版积分规则

310

主题

2657

帖子

0

粉丝