pulseIn()的计时精度如何?


8

我一直在使用该pulseIn()函数来处理基于PWM的二进制数据编码。它非常适合区分长度明显不同的脉冲,例如500us与1500us。这就足以处理典型的红外遥控器。

但是,我想制作自己的IR系统,该系统可以使用2个以上的脉冲长度,以便可以更快地进行数据传输。理想情况下,我想使用8种不同的脉冲长度进行八进制编码(例如200us,400us,600us等)。

我注意到pulseIn()虽然(+/- 10%)返回的值有很大的不同。我希望至少其中一些是由红外发射器和接收器模块引入的,但是我没有足够的设备来验证这一点。

假设我可以减轻这种外部误差,是否pulseIn()有足够的精度来区分此类相似的脉冲?

Answers:


11

pulsein()函数的损耗非常大,因为它是一个硬循环并返回一个数字*每个循环所用的假定时钟周期

...
// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
  if (numloops++ == maxloops)
    return 0;
  width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16); 

捕获PIN时序的最准确方法是使用INPUT CAPTURE FEATURE。看这个例子。它使能1x CPU的输入捕捉以获得最大分辨率,并且输入引脚的每个边沿捕捉定时器的时钟值以从生成的中断服务中读取。它还使定时器溢出中断得以保持较大的绝对时间,从而被捕获。由于1x会快速滚动。捕获将时间存储到数组中,以供主循环读取。


对于IR上的信号,通常使用的库是shirriff / Arduino-IRremote库。它有几个演示程序,可以从解调信号中读取并发送IR。让一个人来构建自己的设计草图。这段代码最初创建了一个定时器中断,该中断以确定的速率轮询输入引脚。

#define USECPERTICK 50  // microseconds per clock interrupt tick

在IRremote.h文件中。为了我的目的,我将其更改为25 us。我发现这仍然是间歇性丢失脉冲流的地方。

注意,解调是在IR接收器中最好地完成的,IR接收器随后输出该感兴趣的信号。在哪里添加一些背景。使用典型的38KHz调制,等于每个脉冲周期的最小分辨率为26.3uS。sherriff的库显示通常大多数波特率或位都在10+脉冲左右。看起来似乎符合您所需的时间。

shirriff的microtherion / Arduino-IRremote分支通过使用PinChangeInterrupts替换了引脚的计时器中断轮询来改善接收效果。我已经将其合并到自己的mpflaga / Arduino-IRremote分支中,它添加了其他一些功能。

因此,您可以使用上述任何库。或创建您自己的应用程序,使用以下两种方法捕获边缘。

  1. 轮询计时器事件(例如50uS)
  2. 在PinChangeInterrupt上捕获micros()
  3. 使用输入捕捉中断来获取准确的时间

1
辉煌的答案。Arduino-IRremote是一个非常高质量的库。易于阅读,并且具有许多经过深思熟虑的设计,这意味着它非常可靠。
Cyber​​gibbons

2

这是测试的一些测试数据pulseIn。一个Arduino发送了应该是14us的脉冲,另一个发出了这个数据:

18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18,18,24,19,18,18,18,18,18,24, 18,18,18,19,18,18,12,18,18,19,18,18,18,18,18,18,18,18,18,18,18,18,19,18,19,24, 18,18,18,18,18,18,18,24,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,18,18,18, 18,18,18,18,18,18,18,18,19,18,18,18,11,18

如您所见,脉冲绝不是准确的。如果发送端和接收端以汇编形式编写,或者甚至转移到自己的处理器中,则时间将更加准确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.