Частота прерывания GPIO IoT в Windows 10

У меня есть Raspberry Pi 3 с Windows 10 IoT. Я хотел бы получить данные от датчика, который посылает импульсы. А именно Swiss Flow SF800 ссылка. Этот датчик будет посылать количество импульсов, равное объему потока через датчик. В даташите написано, что буду посылать до 2кГц.

Мой вопрос: будет ли GPIO на Raspberry Pi обрабатывать такую ​​высокую частоту прерываний? Я изучил провайдера молнии https://developer.microsoft.com/en-us/windows/iot/docs/lightningproviders, который должен дать огромный прирост производительности, но не могу найти никакой документации о том, какую производительность следует ожидать.


person Evan Nielsen    schedule 04.01.2017    source источник


Ответы (2)


Официальных тестов прерывания GPIO пока нет.

Вот Тестирование производительности Windows IoT Lightning. Он проверил производительность GPIO, переключая GPIO 5 между 0 и 1 на максимально возможной скорости. Кажется, можно добиться хотя бы 17,4 кГц.

И событие прерывания GPIO должно быть отправлено в очередь и не потеряется.

Итак, основываясь на приведенной выше информации, для 2 кГц приложение сможет вовремя и без промахов обработать такое событие прерывания скорости.

Не стесняйтесь использовать его, и если есть какие-либо проблемы, пожалуйста, дайте мне знать.

person Rita Han    schedule 05.01.2017
comment
Я собираюсь провести тест с Arduino, чтобы подать импульсы на Pi и проверить свои результаты. Я поделюсь ими, как только сделаю это. - person Evan Nielsen; 06.01.2017

Изначально я подозревал, что мне нужно будет использовать драйвер молнии, чтобы добиться нужной мне частоты прерываний. Оказывается, стандартного драйвера Inbox достаточно для того, что мне нужно.

Вот шаги, чтобы воспроизвести мою ситуацию:

Я создал простой скетч Arduino, который будет посылать импульсы с частотой 10 000 Гц.

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);
}

Создал приложение UWP с простым пользовательским интерфейсом и текстовым блоком в центре страницы.

 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 через транзистор. Я сделал это, чтобы воспользоваться встроенным подтягивающим резистором на контактах GPIO на Pi.

Когда оба приложения запускались одновременно, я собирал только около 30 импульсов за цикл.

Вернулся к настройке Windows IoT, сбросил драйвер обратно на драйвер «Входящие» и повторно запустил оба приложения. На этот раз я не пропустил пульс.

В заключение, драйвера Inbox должно быть достаточно, чтобы дать мне до 10 кГц без каких-либо проблем.

person Evan Nielsen    schedule 01.02.2017