9

我正在使用 .NET Micro Framework 4.1 对Netduino板进行编程,并希望获得比毫秒更高的时间分辨率。这是因为我试图通过快速闪烁来调暗 LED。

问题是示例代码使用了Thread.Sleep(..)需要几毫秒。

来自http://netduino.com/projects/的示例代码显示了相关问题:

OutputPort ledOnboard = new OutputPort(Pins.ONBOARD_LED, false);
while (true)
{
    ledOnboard.Write(true);
    Thread.Sleep(1); // << PROBLEM: Can only get as low as 1 millisecond

即使有另一种方法可以通过不使用更大的时间分辨率来完成调光,我还是在游戏。

4

5 回答 5

17

这并不能回答您关于获得更好时间分辨率的问题,但它确实解决了您更改LED亮度的问题。您应该为 Netduino 使用PWM模块。

Netduino Basics: Using Pulse Width Modulation (PWM)是一篇关于如何使用它的好文章。

于 2010-12-01T02:14:30.497 回答
8

我过去也遇到过类似的问题,并使用以下方法在微秒范围内计时。第一行决定了毫秒内有多少滴答声(我使用它已经有一段时间了,但我认为 1 个滴答声是 10 微秒)。第二行获取系统已开启的时间量(以滴答计)。我希望这有帮助。

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

public static long GetCurrentTimeInTicks()
{
    return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
}
于 2010-12-12T00:35:49.870 回答
3

您可以使用计时器来引发事件,而不是使用睡眠。

计时器上的 Interval 属性是双精度的,因此您可以有不到一毫秒的时间。

http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx

于 2010-12-01T02:07:46.323 回答
0

在他对Seidleroni 的回答的评论中, BrainSlugs83 建议“坐在忙碌的循环中,等待所需的滴答数过去。请参阅我在编辑中添加的功能”。但我看不到添加到编辑中的功能。我认为它会是这样的:

using System;
using Microsoft.SPOT.Hardware;

private static long _TicksPerMicroSecond = TimeSpan.TicksPerMillisecond/1000;

private void Wait(long microseconds)
{
    var then = Utility.GetMachineTime().Ticks;
    var ticksToWait = microseconds * _TicksPerNanoSecond;
    while (true)
    {
        var now = Utility.GetMachineTime().Ticks;
        if ((now - then) > ticksToWait) break;
    }
}
于 2014-09-18T13:11:43.017 回答
0

您可能没有想到的一点是您的代码依赖于 .NET System 命名空间,该命名空间基于您 PC 中的实时时钟。请注意,答案取决于设备中的计时器。

展望未来,我建议您花点时间来确定您在代码中使用的信息的来源——它是 .NET 正确的(基本上基于您的 PC),还是运行代码的设备(例如,哪个将具有 System 以外的命名空间)?

PWM 是一种人工控制直流电流的好方法(通过改变脉冲宽度),但在一天结束时,改变 PWM 频率仍然是时间的函数。

而不是使用延迟......像睡眠......你可能想要产生一个线程并让它管理亮度。使用 Sleep 基本上仍然是一种直线程序方法,如果您使用单线程,您的代码将只能做这件事。

于 2015-05-31T22:54:40.603 回答