如何在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
答案 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
如果对带有步进接口的电机使用外部伺服驱动器会更好。
答案 2 :(得分:1)
您应该有一个法律将I / O状态与时间相关联,并且具有适当分辨率的时钟。然后你有一个线程连续循环并用时钟检查经过的时间。通过应用法律,您可以根据此来升高/降低I / O.
答案 3 :(得分:0)
我们可以使用ThreadPoolTimer
任务也可以称为线程,特别是当它们存在于任务中时。 Windows中的标准线程对象之一是Timer ....在Windows中,我们可以启动计时器线程,而不是使用延迟。线程启动后,我们可以继续做其他有用的事情,计时器会在周期结束时提醒我们。计时器通过Timer Tick事件执行此操作。
答案 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行代码在一个线程中做一个固定的延迟。