打印

IO口读出来的值不稳定

[复制链接]
814|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzsa|  楼主 | 2020-8-26 22:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5v供电的,前端有个运放,用一个IO口做输入判断运放的输出的高低电平信号,现在测出运放输出高电平是3.8v左右,低电平是2.5v左右,问题出在低电平的时候IO口读出来的值不稳定,一会是1 一会儿是0。

使用特权

评论回复
沙发
wangzsa|  楼主 | 2020-8-26 22:44 | 只看该作者

看了2051的手册IO口输入低电平应该< 0.2VCC,没搞懂了,因为这个板子是公司以前人设计的,一直用到都没问题,现在那人走了,源代码找不到了,叫我重做就不行了,我直接把以前的片子焊到新板子上工作完全没问题,1,0输出很稳定,实在是搞不懂了,难道可以通过程序搞定哇。

使用特权

评论回复
板凳
wangpe| | 2020-8-26 22:48 | 只看该作者
运放直接接I/O么?连接点有没有通过一个电容接地?或者上张原理图看看

使用特权

评论回复
地板
zhuww| | 2020-8-26 22:55 | 只看该作者
你还是贴图吧,注意2051的P1.0 P1.1 是可以做比较器的

使用特权

评论回复
5
zhanglli| | 2020-8-26 23:01 | 只看该作者
2.5V的话MCU读出来高或低是正常的,应该是接入内部比较器了

使用特权

评论回复
6
lium| | 2020-8-26 23:05 | 只看该作者
要用示波器看输出波形,不能用万用表

使用特权

评论回复
7
wangzsa|  楼主 | 2020-8-26 23:11 | 只看该作者

我确实模电学的差,不过看已经有个运放了,在220V导通的时候输出应该到0v对不对?
但是现在是2.5V

使用特权

评论回复
8
wangzsa|  楼主 | 2020-8-26 23:15 | 只看该作者
应该也不是哦,这个事开路运放,是不是直接按电压差放大?

使用特权

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

使用特权

评论回复
10
llia| | 2020-8-26 23:25 | 只看该作者
这就对了,万用表量的是平均或真有效值

使用特权

评论回复
11
llia| | 2020-8-26 23:29 | 只看该作者
数脉冲有脉冲就是220接通。。。。。。。   不知道行不行

使用特权

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

使用特权

评论回复
13
zhuww| | 2020-8-26 23:40 | 只看该作者
AC220V,50HZ要记住啊

使用特权

评论回复
14
langgq| | 2020-8-26 23:46 | 只看该作者

有点像三相检测的部分电路,#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
hanwe| | 2020-8-26 23:50 | 只看该作者
在运放的正输入端和地之间接一个1uF左右的电容,在220V的负半周5V通过10K电阻对电容充电,电压不会升到比负输入端电压高,运放会一直输出低电平。但这样的缺点是断开220V后运放不会立刻输出高电平,会有一点延迟。

使用特权

评论回复
16
wangzsa|  楼主 | 2020-8-26 23:53 | 只看该作者
太感谢各位的帮助了,我用累加检测的方法,暂时解决现在的问题了。

使用特权

评论回复
17
wangzsa|  楼主 | 2020-8-26 23:57 | 只看该作者
下一步还是按照大家的方法,改改硬件电路,这样才是根本解决问题的方法

使用特权

评论回复
18
lium| | 2020-8-27 18:39 | 只看该作者
50Hz2051貌似能反映吧,能够软件解决的问题就不要硬件啦,成本忒高

使用特权

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

使用特权

评论回复
20
wenfen| | 2020-8-27 18:47 | 只看该作者


你这哪是运放啊,没有反馈,就是一个简单的比较器,用来对光光耦的输出进行整形的

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

使用特权

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

本版积分规则

914

主题

9040

帖子

5

粉丝