我在使用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
答案 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()调用?