【问题标题】:Windows 10 IoT GPIO interrupt frequencyWindows 10 IoT GPIO 中断频率
【发布时间】:2017-05-18 20:19:54
【问题描述】:

我有一个带有 Windows 10 IoT 的树莓派 3。我想从发送脉冲的传感器获取数据。即Swiss Flow SF800link。该传感器将发出与通过传感器的流量相等的脉冲量。数据表说我将发送高达 2kHz 的频率。

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

【问题讨论】:

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


    【解决方案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,应用程序将能够及时处理这种速度中断事件而不会丢失。

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

    【讨论】:

    • 我将使用 arduino 进行测试,以在 Pi 上推送脉冲并检查我的结果。一旦我这样做了,我会分享它们。
    【解决方案2】:

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

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

    我创建了一个简单的 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 引脚上的内置上拉电阻。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多