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

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

我有一个来自汽油发动机喷油器的PWM信号,我需要从arduino内部派生两个单独的逻辑函数。

确定每个上升沿之间的延迟(以得出发动机RPM)
上升沿之间的范围介于6ms-120ms之间

读取脉冲宽度占空比(以确定喷油器的占空比)
脉冲宽度的脉冲宽度范围从0.02ms到10ms以上。

这些需要在逻辑中分别表示为“ RPM”和“ Pulse Width”

我已经阅读了有关“ Arduino PWM的秘密”的this博客,并发现了有关如何编写频率和占空比不同的脉冲宽度输出的信息,但是我正在尝试读取频率和占空比不同的脉冲宽度来创建每个变量使用一个可变字节或整数。

最佳答案

正确的是,定时脉冲输入等没有很多。 Arduino的ATmega可以通过以下方法捕获占空比每一侧的时序。将它们放在一起并根据您的需要将它们视为PWM取决于代码。

有几种示例方法。


定时事件的紧密循环轮询。如与PulseIn
更好的方法是创建一个timer1溢出中断并
在该ISR期间拉动引脚。这是肯的原始方法
Shirriff的红外线库有效-50ms拉shirriff IR Library,其分辨率仅与溢出一样好。
使用引脚更改中断ISR来获取时间。那里会有点潜伏。 Ken的IR库的microtherion's分支将溢出转换为PinChangeInt。 MicroTherion的代码在库中离散地执行此操作。 PinChangeInt库使它更简单的地方。
使用定时器输入捕获。总之什么时候对应
输入引脚更改系统时钟,并中断
发行。因此,ISR可以潜在地获得发生它的确切时间。 InputCapture.ino

10-04 14:48