如何从Raspberry pi上的GPIO引脚获得更好的性能

时间:2016-09-24 14:29:50

标签: c# iot gpio windows-10-iot-core

我在使用C#

运行Windows 10的树莓派3上运行以下代码

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引脚的开启速度?

或者我应该看某种硬件控制器来控制伺服。我宁愿这样做。我的代码也在一个线程中运行。我应该删除线程???

我有一个更简单的应用程序,代码可以工作... https://github.com/StuartSmith/RaspberryPi-Control-Sg90-Example

2 个答案:

答案 0 :(得分:3)

Microsoft提供了使用raspberry pi 2切换GPIO位的完整测试结果,在https://developer.microsoft.com/en-us/windows/iot/docs/lightningperformance中找到它。

因此,您可以看到结果因IoT版本,驱动程序模型,.NET本机工具链甚至编程语言而异。但在最坏的情况下,可以达到大约10kHz。

我没有测试最新的物联网Redstone 1版本,但我猜它应该与TH2有类似的性能。

因此,一般情况下,选择闪存驱动程序而不是默认的收件箱驱动程序,它应该在GPIO端口上具有更好的性能。

禁用.NET本机工具链也会有明显更好的性能。

我看到你正在使用GPIO引脚驱动伺服,在这种情况下,软件时序应该足够好。但是,如果您想将其用于需要高精度的时钟源,请不要相信软件时序(照明提供商),软件抖动始终是不可预测的。一个不错的选择是使用内置 DMA控制器,它使用硬件定时,精度应在1微秒内。

答案 1 :(得分:-2)

你是如何测量100毫秒的?运行两个Write()调用需要多长时间100ms,还是其他代码?

我们在3.6微秒(从C ++应用程序)测量每个Write()调用。

由于底层堆栈的工作方式,打开引脚并设置驱动器模式后的第一次Write()调用可能需要比后续调用更长的时间。您的测量是否包含第一次Write()调用?