moke 发表于 2024-9-15 18:13:51

8G1K08如何检测输入信号是高/低电平还是连续方波

本帖最后由 DebugLab 于 2024-9-16 16:43 编辑

大家好,
如标题,现在需要根据IO口输入是高电平,低电平,还是方波,来决定另一个IO需要输出什么。
举例:
假设P30/P31口检测到输入高电平,则P55输出低电
P30输入高电平,P31输入低电平,则P55输出高电平
P30输入高电平,P31输入1Hz方波,则P55输出5Hz方波
P30输入低电平,P31输入1Hz方波,则P55输出10Hz方波
如果只是检测P31输入高低电平,则比较简单,现在加入了一个方波,感觉有点复杂了,不知道代码怎么写了。



请大佬指点迷津。

王昱顺 发表于 2024-9-15 20:15:03

如果你要采样1hz的方波,那么采样检测就要比1hz要高,比如说使用2hz以上的采样,或者直接使用边沿检测
但是,判断时间需要比1hz的周期要长,至少要2s(两个方波才能判断,或者三个跳变沿),否则在检测到方波之前,就会先执行一次电平的判断了
检测方式很简单,通过设定一个倒计时的超时定时器,如果超时定时器到零前改变了电平就是方波,没改变就是普通电平,每次改变电平后重新开始倒计时

moke 发表于 2024-9-15 23:25:10

王昱顺 发表于 2024-9-15 20:15
如果你要采样1hz的方波,那么采样检测就要比1hz要高,比如说使用2hz以上的采样,或者直接使用边沿检测
但是 ...

P31有三种状态,高电平、低电平、方波

Lkck8210 发表于 2024-9-16 14:35:48

void main()
{
        u16 SqureWaveCkh = 0;
        u16 SqureWaveOut = 0;
        while(1)
        {
                if(Flag1ms)//1ms标志位
                {
                        Flag1ms=0;
                        if(P31 != P31_Old)//电平变化
                        {
                                SqureWaveCkh = 0;
                                SqureWaveEn = 1;
                        }else{
                                if(SqureWaveCkh<500)
                                {
                                        SqureWaveCkh++;
                                        if(SqureWaveCkh==500)
                                                SqureWaveEn = 0;
                                }
                        }
                        P31_Old = P31;
                        if(SqureWaveEn)
                        {
                                if(P30)
                                {
                                        if(++SqureWaveOut>=2500)
                                        {
                                                SqureWaveOut = 0;
                                                P55 = !P55;
                                        }
                                }else{
                                        if(++SqureWaveOut>=5000)
                                        {
                                                SqureWaveOut = 0;
                                                P55 = !P55;
                                        }
                                }
                        }else{
                                P55 = !P31;
                                SqureWaveOut = 0;                               
                        }
                }
        }
}
页: [1]
查看完整版本: 8G1K08如何检测输入信号是高/低电平还是连续方波