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输入高低电平,则比较简单,现在加入了一个方波,感觉有点复杂了,不知道代码怎么写了。
请大佬指点迷津。
如果你要采样1hz的方波,那么采样检测就要比1hz要高,比如说使用2hz以上的采样,或者直接使用边沿检测
但是,判断时间需要比1hz的周期要长,至少要2s(两个方波才能判断,或者三个跳变沿),否则在检测到方波之前,就会先执行一次电平的判断了
检测方式很简单,通过设定一个倒计时的超时定时器,如果超时定时器到零前改变了电平就是方波,没改变就是普通电平,每次改变电平后重新开始倒计时 王昱顺 发表于 2024-9-15 20:15
如果你要采样1hz的方波,那么采样检测就要比1hz要高,比如说使用2hz以上的采样,或者直接使用边沿检测
但是 ...
P31有三种状态,高电平、低电平、方波 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]