【发布时间】: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