Windows 10 物联网GPIO中断频率

Windows 10 IoT GPIO interrupt frequency

我有一个 raspberry pi 3 和 Windows 10 物联网。我想从发送脉冲的传感器获取数据。即 Swiss Flow SF800 link。该传感器将发出与通过传感器的流量相等的脉冲量。数据表说我将发送高达 2kHz。

我的问题是 raspberry pi 上的 GPIO 会处理这么高的中断频率吗?我研究了 lightning 提供者 https://developer.microsoft.com/en-us/windows/iot/docs/lightningproviders,这应该是一个巨大的性能提升,但找不到任何关于我应该期望什么样的性能的文档。

GPIO中断暂无官方基准测试

这里是Windows IoT Lightning Performance Testing。它通过以尽可能快的速度在 0 和 1 之间切换 GPIO 5 来测试 GPIO 性能。好像至少可以达到17.4kHz

并且GPIO interrupt event should be pushed into the queue并且不会丢失。

因此,根据以上信息,对于2kHz,应用程序将能够及时处理此类速度中断事件而不会丢失。

请随意使用它,如果有任何问题,请告诉我。

最初我怀疑我需要使用闪电驱动器才能达到我需要的中断频率。事实证明,标准的收件箱驱动程序足以满足我的需要。

以下是重现我的情况的步骤:

我创建了一个简单的 Arduino 草图,可以以 10,000 Hz 的速率发出脉冲。

int dataPin = 12;

void setup() {
    pinMode(dataPin, OUTPUT);
}

void loop() {
    int count = 0;
    while (count < 400)
    {
        //pulse
        digitalWrite(dataPin, HIGH);
        digitalWrite(dataPin, LOW);
        //This delay presumably makes the pulse be 10000 Hz
        delayMicroseconds(100);
        count++;
    }
    delay(5000);
}

使用简单的 UI 创建了一个 UWP 应用程序,在页面中央有一个 TextBlock。

 public sealed partial class MainPage : Page
    {
        private GpioController gpio;

        private const int inputPinNumber = 17;

        private GpioPin inputPin;

        private int count;

        private I2cController i2cController;

        private SpiController spiController;

        public MainPage()
        {
            this.InitializeComponent();
            this.Setup();
        }

        private void Setup()
        {
            if (LightningProvider.IsLightningEnabled)
            {
                LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
            }

            this.gpio = GpioController.GetDefault();


            this.inputPin = this.gpio.OpenPin(inputPinNumber);
            if (this.inputPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
            {
                this.inputPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
            }
            else
            {
                this.inputPin.SetDriveMode(GpioPinDriveMode.Input);
            }

            this.inputPin.ValueChanged += InputPinOnValueChanged;
        }

        private void InputPinOnValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
        {

            var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
                if (args.Edge == GpioPinEdge.FallingEdge)
                {
                    this.count++;
                    this.CountBlock.Text = this.count.ToString();
                }
                else
                {
                    }
            });
        }
    }
}

设置 Windows IoT 以使用直接内存映射驱动程序。

下一步是通过晶体管将 Arduino 上的引脚与 Pi 上的引脚连接起来。我这样做是为了利用 Pi 上 GPIO 引脚上的内置 Pull-Up 电阻。

当两个应用程序同时 运行 时,我每个周期只收集了大约 30 个脉冲。

返回 Windows IoT 设置并将驱动程序重置回收件箱​​驱动程序并重新运行两个应用程序。这次我没有漏脉

总之,收件箱驱动程序应该足以给我高达 10khz 的频率,没有任何问题。