c#(Windows IoT) - 睡眠()或延迟()?

时间:2015-09-30 11:27:32

标签: c# windows raspberry-pi2 iot time-critical

如何在C#中为Windows IoT编写timecritic后台应用程序?

目标是通过带有Windows IoT和Visual Studio 2015的Raspberry Pi 2上的C#编程步进电机。通过远程调试进行编程工作正常,但没有睡眠或延迟可用。还有System.Threading.Thread.Sleep(时间)是不可能的。

此外,如果我们实施计时器,则步骤之间的时间在每个步骤都不相同。

快5步 - 慢2步 - 快5步 - 慢2步 - 快5步 - 等等......

我如何编程马达他的行为正确?

数据:

电机:HSY214 - F0.8 A NEMA8 - Steppermotor

司机:A4988

5 个答案:

答案 0 :(得分:2)

我们在iot-devices project中添加了对软件PWM和硬件PWM的C#支持。您还可以看到this C++ example使用Windows IoT Core驱动步进电机。如有必要,您可以使用System.Threading.Tasks.Task.Delay实现类似于Thread.Sleep的功能。

答案 1 :(得分:2)

也许这样:

Task.Delay(-1).Wait(100);

Task.Delay(100).Wait(-1);

Task.Delay(100).Wait();

在所有情况下结果都相同。

我做了一个简单的测试:

while (true)
        {
            pin26.Write(GpioPinValue.High);
            Task.Delay(-1).Wait(100);
            pin26.Write(GpioPinValue.Low);
            Task.Delay(-1).Wait(100);
        }

脉冲宽度的结果不太好 - 从98us到116 us, 更糟糕的结果是短暂的延迟时间...... 100us delay

10us delay

如果对带有步进接口的电机使用外部伺服驱动器会更好。

答案 2 :(得分:1)

您应该有一个法律将I / O状态与时间相关联,并且具有适当分辨率的时钟。然后你有一个线程连续循环并用时钟检查经过的时间。通过应用法律,您可以根据此来升高/降低I / O.

答案 3 :(得分:0)

我们可以使用ThreadPoolTimer

  

任务也可以称为线程,特别是当它们存在于任务中时。 Windows中的标准线程对象之一是Timer ....在Windows中,我们可以启动计时器线程,而不是使用延迟。线程启动后,我们可以继续做其他有用的事情,计时器会在周期结束时提醒我们。计时器通过Timer Tick事件执行此操作。

By Rick Lesniak

答案 4 :(得分:-4)

看起来就是这样:

var t = Task.Run(async delegate
         {
             await Task.Delay(1000);
             return 42;
          });
  t.Wait();

我习惯这样做:

Thread.Sleep(1000);

那么为什么C#IoT编码更复杂呢? 我也在Raspberry Pi上使用C ++编程,看起来物联网的未来就是Linux,如果MS-10 C#需要6行代码在一个线程中做一个固定的延迟。