2016-09-24 10 views
2

Я следующий код работает на Raspberry Pi 3 работает Windows 10 с использованием C#как получить лучшую производительность из GPIO булавки на Raspberry Pi

GPIO Init ....

_gpioController = GpioController.GetDefault(); 
       _motorPin = _gpioController.OpenPin(Convert.ToInt32(RaspberryGPIOpin); 
       _motorPin.SetDriveMode(GpioPinDriveMode.Output); 

GPIO контактный на выключение

_motorPin.Write(GpioPinValue.High); 
_motorPin.Write(GpioPinValue.Low); 

проблема заключается в том, что в моем приложении для включения и выключение штифта GPI занимает 100 миллисекунд, но мне это нужно, что происходит в менее 25 миллисекунд, чтобы изменить направление сервопривода.

Есть ли способ ускорить включение контактов GPIO?

или я должен смотреть на какой-либо аппаратный контроллер для управления сервомеханизмом. Я бы предпочел сделать это. Мой код также работает в потоке. я должен удалить threading ???

У меня есть гораздо более простое приложение, в котором код делает работу ... https://github.com/StuartSmith/RaspberryPi-Control-Sg90-Example

+2

Я боюсь, что это нелегко сделать с помощью UWP, особенно если ядро ​​Windows iot не является операционной системой чтения. Однако, если вы хотите иметь точный контроль над переключением gpio, вы можете использовать встроенный контроллер DMA. – Jackie

+0

Спасибо, ваш ответ привел меня к поставщику молнии для контактов GPIO. Я проверю это, чтобы узнать, могу ли я получить требуемую производительность. –

+0

Да, поставщик освещения утверждает, что имеет лучшую производительность по сравнению с драйвером входящих сообщений по умолчанию, msdn предоставляет подробный результат теста при переключении бита GPIO, https://developer.microsoft.com/en-us/windows/iot/docs/lightningperformance. – Jackie

ответ

3

Microsoft обеспечивает полный результат теста на переключая GPIO бит с помощью Raspberry Pi 2, найти его в https://developer.microsoft.com/en-us/windows/iot/docs/lightningperformance.

Таким образом, вы можете видеть, что результат зависит от версии IoT, модели драйвера, родной инструментальной привязки .NET и даже языков программирования. Но в худшем случае может быть достигнуто приблизительно 10 кГц.

Я не тестировал последний выпуск IoT Redstone 1, но я предполагаю, что он должен иметь аналогичную производительность с TH2.

Итак, в общем, выберите драйвер молнии по умолчанию, входящий в комплект поставки, он должен иметь лучшую производительность на портах GPIO.

Также отключение основной привязки .NET также будет иметь лучшую производительность.

Я вижу, что вы используете контакт GPIO для управления сервомеханизмом, время программирования должно быть достаточно хорошим в этом случае. Однако, если вы хотите использовать его для источника синхронизации, который требует высокой точности, не доверяйте программному времени (поставщику освещения), программный джиттер всегда непредсказуем. Одной из хороших альтернатив является использование встроенного контроллера DMA, который использует аппаратное время и должен иметь точность в течение 1 микросекунды.

-2

Как вы измеряли 100 мс? Это 100 мс, сколько времени потребовалось для запуска двух вызовов Write(), или там был другой код?

Мы измерили каждый вызов Write() в течение 3.6 микросекунд (из приложения C++).

Первый вызов Write() после открытия булавки и установки режима накопителя может занять больше времени, чем последующие вызовы из-за того, как работает базовый стек. Ваше измерение включало первый вызов Write()?

+0

Это не ответ на вопрос. Если у вас есть вопрос, я бы порекомендовал вам опубликовать новый с вашим примером и сценарием. – AVK

+0

Измерение проводилось из IDE визуальной студии. Измерения проводились в цикле for, и время во всех случаях было примерно одинаковым. –