Windows 10 IoT GPIO中断频率

时间:2017-01-04 13:57:30

标签: iot gpio raspberry-pi3 windows-10-iot-core

我有一个带有Windows 10 IoT的raspberry pi 3。我想从发送脉冲的传感器获取数据。即Swiss Flow SF800 link。该传感器将发出等于通过传感器的流量的脉冲量。数据表说我将发送高达2kHz的频率。

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

2 个答案:

答案 0 :(得分:1)

目前暂无GPIO中断的正式基准。

这是Windows IoT Lightning Performance Testing。它通过以最快的速度在0和1之间切换GPIO 5来测试GPIO性能。似乎至少可以实现17.4 kHz。

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

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

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

答案 1 :(得分:0)

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

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

我创建了一个简单的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应用程序,该UI在页面中央有一个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引脚上的内置上拉电阻。

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

重新进入Windows IoT设置并将驱动程序重置为收件箱驱动程序并重新启动这两个应用程序。这次我没有错过任何一个脉冲。

总之,收件箱驱动程序应该足以让我达到10khz而没有任何问题。