打印

IO口读出来的值不稳定

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

使用特权

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

使用特权

评论回复
板凳
tian111| | 2021-10-9 22:43 | 只看该作者

运放直接接I/O么?连接点有没有通过一个电容接地?或者上张原理图看看

使用特权

评论回复
地板
jiaxw| | 2021-10-9 22:46 | 只看该作者
你还是贴图吧,注意2051的P1.0 P1.1 是可以做比较器的

使用特权

评论回复
5
jiajs| | 2021-10-9 22:49 | 只看该作者
2.5V的话MCU读出来高或低是正常的,应该是接入内部比较器了

使用特权

评论回复
6
zhanghqi| | 2021-10-9 22:56 | 只看该作者
要用示波器看输出波形,不能用万用表

使用特权

评论回复
7
wangzsa|  楼主 | 2021-10-9 22:58 | 只看该作者

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

使用特权

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

使用特权

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

使用特权

评论回复
10
supernan| | 2021-10-9 23:06 | 只看该作者
这就对了,万用表量的是平均或真有效值

使用特权

评论回复
11
zhenykun| | 2021-10-9 23:08 | 只看该作者
数脉冲有脉冲就是220接通。。。。。。。   不知道行不行

使用特权

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

使用特权

评论回复
13
llljh| | 2021-10-9 23:14 | 只看该作者
AC220V,50HZ要记住啊

使用特权

评论回复
14
huangchui| | 2021-10-9 23:16 | 只看该作者

有点像三相检测的部分电路,#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
wangzsa|  楼主 | 2021-10-9 23:19 | 只看该作者
在运放的正输入端和地之间接一个1uF左右的电容,在220V的负半周5V通过10K电阻对电容充电,电压不会升到比负输入端电压高,运放会一直输出低电平。

使用特权

评论回复
16
wuhany| | 2021-10-9 23:22 | 只看该作者
这样的缺点是断开220V后运放不会立刻输出高电平,会有一点延迟。

使用特权

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

使用特权

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

使用特权

评论回复
19
liliang9554| | 2021-10-9 23:33 | 只看该作者
50Hz2051貌似能反映吧,能够软件解决的问题就不要硬件啦,成本忒高

使用特权

评论回复
20
yszong| | 2021-10-9 23:35 | 只看该作者
50Hz2051貌似能反映吧,能够软件解决的问题就不要硬件啦,成本忒高

使用特权

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

本版积分规则

914

主题

9040

帖子

5

粉丝