【问题标题】:Read noisy data from GPIO从 GPIO 读取噪声数据
【发布时间】:2016-05-23 06:15:17
【问题描述】:

在一个针对 FreeRTOS/ARM 的嵌入式编程项目中,我尝试读取噪声 GPIO 信号上的 24 位数据。空闲时,信号有很多随机噪声;在实际数据过程中,噪声被抑制,只读取信号数据。数据信号由 300us 高 (1) 的前导码和 31x300us 低 (0) 组成,然后每个位 1 是 900us 高和 300us 低,位 0 是 300us 低,然后是 900us 高。

我使用简单的紧密 GPIO 读取循环进行了测量,该循环显示平均 388 次读取在 300us 内。

所以我尝试用 +/- 15 的 epsilon 读取 HIGH 和 LOW 来计算我的读取次数,并确定我是使用状态机读取前导码还是其后的位。但我无法检测到任何前导码或数据。我怀疑实际读取代码中的附加代码,即使不是太复杂,与简单的测量回路相比也会导致不同的读取频率。读取此类数据的正确方法是什么?

【问题讨论】:

  • 这完全取决于噪声的性质。如果是持续的噪音,那么您无能为力。也许所有样本的平均值就足够了。或者,如果有突发噪音,您应该能够使用中值滤波器将其滤除。您可以做的另一件事是使用 ADC 读取数据。然后,您可以为 1 和 0 设置更窄的电压电平,而不是标准的“TTL 电平”,您的 GPIO 端口将某些内容解释为 1 或 0。无论如何,我相信您必须提供更多详细信息以便任何人能够回答。
  • 我们不知道硬件和您的代码。我们能为您提供什么帮助?
  • 它不能工作。原因是你无法区分一个起始1和一个起始0。如果第一位为1,则信号为高300us,低9300us,高900us。如果第一位为0,则信号为高300us,低9600us,高900us。所以你需要能够测量9300us和9600us之间的差异。我建议公差为 +/-100 微秒,以确保可靠运行。那是1%的准确率。但是 388 个中的 +/-15 个是 3.9%。因此,如果您可以测量到 388 个中的 +/-15 个范围内,那么您甚至还没有接近。
  • 如果线路空闲时有噪音,但驱动时没有,是否需要偏置?像下拉电阻(第一个序言为高电平)?

标签: embedded gpio noise-reduction


【解决方案1】:

我想通了。方法是合理的。问题是

  1. 即使它是 RTOS,尝试在 I/O 循环期间在控制台上打印调试信息也是不行的,即使打印的数据很少;它会很快打乱时间。一旦我删除了循环中的调试输出,它就可以正常工作了。
  2. 短信号和长信号之间的相对时序是正确的,但确切的时序仍可能有很大差异(即使在删除调试输出之后)。就我而言,短时间跨度的范围可以从 180 到 288 次读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2023-03-11
    • 2023-03-25
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多