我需要执行以下操作:我在微 Controller 上有 2 个输入引脚,有可能在一个或另一个上接收到信号,但也有可能将两者物理连接在外部,并且信号同时到达。

问题:如果我使用类似的东西

if (PINB.1 && PINB.2)
{
  // ...
}

有百万分之一的机会,当两个值加载到寄存器以执行逻辑与运算时,信号到达之间。当我离开 if 时,两个引脚都很高,但我仍然检测到只有第二个引脚很高。

我尝试了不同的解决方案,目前最好的似乎是当任一输入高时开始一个非常短的倒计时,当计时器(最多几毫秒)耗尽时,我再次检查。

有谁知道更简单或更好的解决方案?我认为这个问题很常见,但到目前为止我找不到任何“经过验证”的方法。

编辑 :我从硬件中知道,在一个边缘之后,引脚将保持其值至少几十毫秒。噪音已经得到处理。

PINB.1 和 PINB.2 只是示例。它们可能位于不同的端口上,因此对整个端口进行位掩码可能会带来不够灵活的风险。

最佳答案

您已经回答了自己的问题:只需使用计时器并再次检查引脚,这是您可以使用的最简单的数字滤波器形式。但是当您检测到引脚电平变化时,您必须启动计时器。如果您有一个非常陡峭的上升沿,即引脚连接到某个数字 IC,那么简单地读取引脚两次甚至可能就足够了,这取决于您的 CPU 时钟与上升沿相比有多快。

如果 MCU 具有此功能,则另一种解决方案是使用边缘敏感中断。然后,您可以保证在更改后立即读取引脚。对于每个引脚一个中断,您的程序可以为 == 比较存储引脚的最新值。您必须确保在中断和“主”之间使用信号量保护这些值,否则您将回到开始的地方。

关于c - 在两个输入引脚上检测两个同时信号的最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7200919/

10-11 21:03