Arduino从单个数字输入读取脉冲宽度频率和占空比

时间:2014-01-23 22:04:41

标签: c++ arduino

我是Arduino和编码的新手,但已经完成了所有的教程,并认为我已经掌握了它是如何工作的。

我有一个现实世界的问题,我很想用arduino解决。

我有一个来自汽油发动机上的喷油器的PWM信号,我需要从arduino内部获得两个独立的逻辑功能。

确定每个上升沿之间的延迟(以获得发动机RPM) 上升沿之间的范围在6ms到120ms之间 和 读脉冲宽度占空比(确定燃油喷射器的占空比) 脉冲宽度范围从0.02ms到超过10ms。

这些需要在逻辑中独立地表示为“RPM”和“脉冲宽度”

我已经阅读了this关于“Arduino PWM的秘密”的博客,并发现它如何写出不同频率和占空比的脉冲宽度输出,但我试图读取不同频率的脉冲宽度和占空比来创建一个可变字节或int用于每个。

2 个答案:

答案 0 :(得分:1)

正确的定时脉冲输入或类似情况并不多。 Arduino的ATmega可以通过以下方法捕获占空比每一侧的时间。并且将代码放在一起并将它们视为满足您需求的PWM。

有几种方法可以举例说明。

  1. 定时事件的紧密循环轮询。例如PulseIn

  2. 更好的方法是创建一个timer1溢出中断和 在ISR拉针的过程中。这是Ken的原始方法 Shirriff的红外图书馆工作 - 50ms拉shirriff IR Library,其分辨率仅与溢出一样好。

  3. 使用引脚更改中断ISR以获取时间。哪里会有点潜伏。 Ken的IR库的microtherion's分叉将溢出转换为PinChangeInt。 MicroTherion的代码在库中离散地执行了哪些操作。 PinChangeInt库使其更简单。

  4. 使用定时器输入捕获。总之相应时 输入引脚改变系统时钟被捕获和中断 发行。因此,ISR可以潜在地获得它发生的确切时间。 InputCapture.ino

答案 1 :(得分:0)

我刚刚写了一个库,其中有一个例子就是这样做的。在我的Timer2_Counter库中,我写了一个当前标题为" read_PWM_pulses_on_ANY_pin_via_pin_change_interrupt"然后读入脉冲然后以0.5us的分辨率输出脉冲宽度,以及脉冲之间的周期和脉冲的频率。

下载库并查看示例。要测试该示例,您可以将PWM引脚的导线连接到输入引脚。带有示例的库位于:http://www.electricrcaircraftguy.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html

PS。此示例代码使用引脚更改中断,可以在任何Arduino引脚上完成,包括模拟引脚。